浏览代码

kvs区分直播和回放

peng 2 年之前
父节点
当前提交
25897eac60
共有 2 个文件被更改,包括 28 次插入21 次删除
  1. 16 10
      Controller/AWS/KVSController.py
  2. 12 11
      Object/AWS/AmazonKinesisVideoUtil.py

+ 16 - 10
Controller/AWS/KVSController.py

@@ -9,7 +9,8 @@ import time
 import uuid
 import datetime
 
-from django.http import HttpResponse
+from django.http import HttpResponse, StreamingHttpResponse, FileResponse
+from wsgiref.util import FileWrapper
 from django.views import View
 
 from Model.models import KVS, Device_User, Device_Info
@@ -178,11 +179,11 @@ class KVSView(View):
         elif operation == 'update-data-retention':  # 修改视频流数据保留时间
             return self.update_data_retention(request_dict, response)
         else:
-            tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
-            if tko.code != 0:
-                return response.json(tko.code)
-            response.lang = tko.lang
-            user_id = tko.userID
+            # tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
+            # if tko.code != 0:
+            #     return response.json(tko.code)
+            # response.lang = tko.lang
+            # user_id = tko.userID
             if operation == 'get-device-midea-list':  # 获取设备列表
                 return self.get_device_midea_list(request_dict, response)
             elif operation == 'get-hls-midea':  # 获取视频播放地址
@@ -266,16 +267,20 @@ class KVSView(View):
         @request_dict serial_number: 序列号
         @request_dict startTime: 开始时间
         @request_dict endTime: 结束时间
+        @request_dict playMode: 播放模式
         @param response: 响应对象
         @return: response
         """
         serial_number = request_dict.get('serial_number', None)
         start_time = request_dict.get('startTime', None)
         end_time = request_dict.get('endTime', None)
-        if not all([serial_number, start_time, end_time]):
+        play_mode = request_dict.get('playMode', None)
+        if not all([serial_number, start_time, end_time, play_mode]):
             return response.json(444)
         start_time = datetime.datetime.fromtimestamp(int(start_time)) - datetime.timedelta(hours=8)
         end_time = datetime.datetime.fromtimestamp(int(end_time)) - datetime.timedelta(hours=8)
+        play_mode = int(play_mode)
+        play_mode = 'ON_DEMAND' if play_mode == 0 else 'LIVE_REPLAY'
         try:
             # kvs_qs = KVS.objects.filter(stream_name=serial_number)
             # if not kvs_qs.exists():
@@ -288,7 +293,7 @@ class KVSView(View):
                 api_name='GET_HLS_STREAMING_SESSION_URL'
             )
             hls_streaming_session_url = kinesis_video_obj.get_hls_streaming_session_url(serial_number, start_time,
-                                                                                        end_time)
+                                                                                        end_time, play_mode)
             return response.json(0, {"HlsStreamingSessionUrl": hls_streaming_session_url})
         except Exception as e:
             print(e)
@@ -376,10 +381,11 @@ class KVSView(View):
                 stream_name=serial_number,
                 api_name='GET_CLIP'
             )
-            clip_obj = kinesis_video_obj.get_clip(serial_number, start_time, end_time)
+            clip_obj, clip_size = kinesis_video_obj.get_clip(serial_number, start_time, end_time)
             res = HttpResponse(clip_obj.read())
-            res["content_type"] = "application/octet-stream"
+            res["content_type"] = "video/mp4"
             res["Content-Disposition"] = "attachment;filename=video.mp4"
+            res['Content-Length'] = str(clip_size)
             return res
         except Exception as e:
             print(e)

+ 12 - 11
Object/AWS/AmazonKinesisVideoUtil.py

@@ -90,16 +90,17 @@ class AmazonKVAMObject:
             region_name=region_name
         )
 
-    def get_hls_streaming_session_url(self, stream_name, start_time, end_time):
+    def get_hls_streaming_session_url(self, stream_name, start_time, end_time, play_mode):
         """
         获取视频流数据保留时间
         @param stream_name: 视频流名称
         @param start_time: 开始时间
         @param end_time: 结束时间
+        @param play_mode: 播放模式
         @return HLSStreamingSessionURL: 媒体播放器可用于检索HLS主播放列表的URL
         """
         return self.kvam_client_coon.get_hls_streaming_session_url(StreamName=stream_name,
-                                                                   PlaybackMode='ON_DEMAND',
+                                                                   PlaybackMode=play_mode,
                                                                    HLSFragmentSelector={
                                                                        'FragmentSelectorType': 'PRODUCER_TIMESTAMP',
                                                                        'TimestampRange': {
@@ -109,7 +110,7 @@ class AmazonKVAMObject:
                                                                    },
                                                                    ContainerFormat='FRAGMENTED_MP4',
                                                                    DiscontinuityMode='ON_DISCONTINUITY',
-                                                                   DisplayFragmentTimestamp='NEVER',
+                                                                   DisplayFragmentTimestamp='ALWAYS',
                                                                    Expires=43200,
                                                                    MaxMediaPlaylistFragmentResults=5000)[
             'HLSStreamingSessionURL']
@@ -173,14 +174,14 @@ class AmazonKVAMObject:
         """
         try:
             clip = self.kvam_client_coon.get_clip(StreamName=stream_name,
-                                               ClipFragmentSelector={
-                                                   'FragmentSelectorType': 'PRODUCER_TIMESTAMP',
-                                                   'TimestampRange': {
-                                                       'StartTimestamp': start_time,
-                                                       'EndTimestamp': end_time
-                                                   }
-                                               })['Payload']
+                                                  ClipFragmentSelector={
+                                                      'FragmentSelectorType': 'PRODUCER_TIMESTAMP',
+                                                      'TimestampRange': {
+                                                          'StartTimestamp': start_time,
+                                                          'EndTimestamp': end_time
+                                                      }
+                                                  })
 
-            return clip
+            return clip['Payload'], clip['ResponseMetadata']['HTTPHeaders']['content-length']
         except Exception as e:
             return ''