Bläddra i källkod

kvs下载视频片段

peng 2 år sedan
förälder
incheckning
5a021eca80
2 ändrade filer med 72 tillägg och 12 borttagningar
  1. 50 12
      Controller/AWS/KVSController.py
  2. 22 0
      Object/AWS/AmazonKinesisVideoUtil.py

+ 50 - 12
Controller/AWS/KVSController.py

@@ -9,6 +9,7 @@ import time
 import uuid
 import datetime
 
+from django.http import HttpResponse
 from django.views import View
 
 from Model.models import KVS, Device_User, Device_Info
@@ -33,9 +34,9 @@ class UserRelatedView(View):
     def validation(self, request_dict, operation, request):
         response = ResponseObject()
         if operation == 'generate-qr-code':  # 网页生成二维码
-            return self.generate_qr_code(request_dict, response)
+            return self.generate_qr_code(response)
         elif operation == 'web-login':  # 网页登录
-            return self.web_login(request_dict, request, response)
+            return self.web_login(request_dict, response)
         elif operation == 'confirm-login':  # app确认登录
             return self.confirm_login(request_dict, response)
         else:
@@ -47,12 +48,12 @@ class UserRelatedView(View):
             response.lang = tko.lang
             user_id = tko.userID
             if operation == 'get-device':  # 获取设备列表
-                return self.get_device(request_dict, response, user_id)
+                return self.get_device(response, user_id)
             else:
                 return response.json(404)
 
     @staticmethod
-    def generate_qr_code(request_dict, response):
+    def generate_qr_code(response):
         """
         网页生成二维码
         @param request_dict: 请求参数
@@ -74,7 +75,7 @@ class UserRelatedView(View):
             return response.json(500)
 
     @staticmethod
-    def web_login(request_dict, request, response):
+    def web_login(request_dict, response):
         """
         网页登录
         @param request_dict: 请求参数
@@ -144,10 +145,9 @@ class UserRelatedView(View):
             return response.json(500)
 
     @staticmethod
-    def get_device(request_dict, response, user_id):
+    def get_device(response, user_id):
         """
         获取设备列表
-        @param request_dict: 请求参数
         @param response: 响应对象
         @param user_id: 用户id
         @return: response
@@ -177,18 +177,18 @@ class KVSView(View):
             return self.create_media(request_dict, response)
         elif operation == 'update-data-retention':  # 修改视频流数据保留时间
             return self.update_data_retention(request_dict, response)
-        elif operation == 'get-hls-midea':  # 获取视频播放地址
-            return self.get_hls_midea_url(request_dict, response)
         else:
-            tko = TokenObject(
-                request.META.get('HTTP_AUTHORIZATION'),
-                returntpye='pc')
+            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':  # 获取视频播放地址
+                return self.get_hls_midea_url(request_dict, response)
+            elif operation == 'download-clip':  # 获取视频播放地址
+                return self.download_clip(request_dict, response)
             else:
                 return response.json(404)
 
@@ -346,3 +346,41 @@ class KVSView(View):
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
+
+    @staticmethod
+    def download_clip(request_dict, response):
+        """
+        获取视频播放地址
+        @param request_dict: 请求参数
+        @request_dict serial_number: 序列号
+        @request_dict startTime: 开始时间
+        @request_dict endTime: 结束时间
+        @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]):
+            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)
+        try:
+            # kvs_qs = KVS.objects.filter(stream_name=serial_number)
+            # if not kvs_qs.exists():
+            #     return response.json(174)
+            kinesis_video_obj = AmazonKVAMObject(
+                aws_access_key_id='AKIA2E67UIMD45Y3HL53',
+                secret_access_key='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',
+                region_name='us-east-1',
+                stream_name=serial_number,
+                api_name='GET_CLIP'
+            )
+            clip_obj = kinesis_video_obj.get_clip(serial_number, start_time, end_time)
+            res = HttpResponse(clip_obj.read())
+            res["content_type"] = "application/octet-stream"
+            res["Content-Disposition"] = "attachment;filename=video.mp4"
+            return res
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 22 - 0
Object/AWS/AmazonKinesisVideoUtil.py

@@ -162,3 +162,25 @@ class AmazonKVAMObject:
                     return image['ImageContent']
         except Exception as e:
             return ''
+
+    def get_clip(self, stream_name, start_time, end_time):
+        """
+        获取视频流片段封面图片
+        @param stream_name: 视频流名称
+        @param start_time: 开始时间
+        @param end_time: 结束时间
+        @return HLSStreamingSessionURL: 视频流片段列表信息
+        """
+        try:
+            clip = self.kvam_client_coon.get_clip(StreamName=stream_name,
+                                               ClipFragmentSelector={
+                                                   'FragmentSelectorType': 'PRODUCER_TIMESTAMP',
+                                                   'TimestampRange': {
+                                                       'StartTimestamp': start_time,
+                                                       'EndTimestamp': end_time
+                                                   }
+                                               })['Payload']
+
+            return clip
+        except Exception as e:
+            return ''