StreamMedia.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. from django.views.generic.base import View
  2. from django.utils.decorators import method_decorator
  3. from django.views.decorators.csrf import csrf_exempt
  4. from Service.TokenManager import JSONTokenManager
  5. from Service.ModelService import ModelService
  6. from Model.models import Equipment_Stream
  7. from Service.CommonService import CommonService
  8. from Object.AWS.S3ClassObject import S3ClassObject
  9. from Object.AWS.ElasticTranscoder import ElasticTranscoder
  10. import traceback, xmltodict, requests, re, subprocess
  11. from ffmpy import FFmpeg
  12. import time
  13. from Object.AWS.CloudfrontSignCookie import BetterThanBoto
  14. from Ansjer.config import *
  15. from Service.ResponseService import *
  16. '''
  17. 移动端=>
  18. 增:
  19. http://192.168.136.40:8077/media/stream?token=test&channel=1&status=1&uid=1&operation=add
  20. 删:
  21. http://192.168.136.40:8077/media/stream?token=test&id=11&id=12&operation=delete
  22. 改:
  23. http://192.168.136.40:8077/media/stream?token=test&id=13&operation=update&status=0
  24. 查:
  25. http://192.168.136.40:8077/media/stream?token=test&operation=query
  26. 获取视频播放地址
  27. http://13.56.215.252:82/media/stream?token=test&channel=99&uid=2N1K3LE78TYJ38CE111A&filename=1526882855.flv&operation=getVodHls
  28. http://192.168.136.40:8077/media/stream?token=test&channel=1&uid=1&operation=getVodUrl&filename=1_1-1523247439.mp4
  29. 获取所有保存s3的视频
  30. http://192.168.136.40:8077/media/stream?token=test&channel=1&uid=1&operation=getAllVideo
  31. 删除设备视频多个,key值传多个即可
  32. http://192.168.136.40:8077/media/stream?token=test&key=UKPAH63V23U4ZHEB111A_1/UKPAH63V23U4ZHEB111A_1-1524039164.mp4&uid=UKPAH63V23U4ZHEB111A&channel=1&operation=getDelVideo
  33. ----------------------------------------------------------------------------------------------------
  34. 后台=>
  35. 验证推流权限
  36. http://192.168.136.40:8077/media/auth_stream?userID=151547867345163613800138001&uid=1&channel=1&access_token=test
  37. 验证播放权限(直播)
  38. http://192.168.136.40:8077/media/auth_live?userID=151547867345163613800138001&uid=1&channel=1&token=test
  39. rtmp://192.168.136.45:1935/hls/UKPAH63V23U4ZHEB111A_88?userID=151547867
  40. 获取所有推流的设备信息
  41. http://192.168.136.40:8077/media/stream?token=test&page=1&line=10&operation=getAdminAllStream
  42. 删除流
  43. http://192.168.136.40:8077/media/stream?token=test&id=1&id=2&id=3&operation=getAdminDelStream
  44. 删除指定设备视频
  45. http://192.168.136.40:8077/media/stream?token=test&key=1&key=2&key=3&operation=getAdminDelVideo
  46. 更新
  47. http://192.168.136.40:8077/media/stream?token=test&id=13&operation=getAdminUpdateStream&status=0
  48. 获取指定设备存储的视频播放地址
  49. http://192.168.136.40:8077/media/stream?token=test&channel=1&uid=1&filename=1_1-1523247439.mp4&operation=getAdminVodUrl
  50. hls播放
  51. http://13.56.215.252:82/media/stream?token=test&channel=1&status=1&uid=2N1K3LE78TYJ38CE111A&operation=add&rank=1
  52. '''
  53. class StreamMedia(View):
  54. @method_decorator(csrf_exempt)
  55. def dispatch(self, *args, **kwargs):
  56. return super(StreamMedia, self).dispatch(*args, **kwargs)
  57. def get(self, request, *args, **kwargs):
  58. request.encoding = 'utf-8'
  59. return self.validation(request_dict=request.GET)
  60. def post(self, request, *args, **kwargs):
  61. request.encoding = 'utf-8'
  62. return self.validation(request_dict=request.POST)
  63. def validation(self, request_dict, *args, **kwargs):
  64. token = request_dict.get('token', None)
  65. if token is not None:
  66. tokenManager = JSONTokenManager()
  67. error_code = tokenManager.verify_AToken(token)
  68. if error_code == 0:
  69. userID = tokenManager.accessDict.get('userID', None)
  70. own_permission = ModelService.check_permission(userID=userID, permID=60)
  71. if own_permission is not True:
  72. return ResponseJSON(404)
  73. operation = request_dict.get('operation', None)
  74. if operation == 'add':
  75. return self.add_stream(token=token, request_dict=request_dict, userID=userID)
  76. elif operation == 'delete':
  77. return self.delete_stream(request_dict=request_dict, userID=userID)
  78. elif operation == 'update':
  79. return self.update_stream(userID=userID, request_dict=request_dict)
  80. elif operation == 'query':
  81. return self.query_stream(userID=userID)
  82. elif operation == 'getDelVideo':
  83. return self.get_del_video(userID=userID, request_dict=request_dict)
  84. elif operation == 'getAllVideo':
  85. return self.get_all_video(request_dict=request_dict, userID=userID)
  86. elif operation == 'getVodUrl':
  87. return self.get_vod_url(request_dict=request_dict)
  88. elif operation == 'getVodHls':
  89. return self.get_vod_hls(request_dict=request_dict)
  90. elif operation == 'getAdminAllStream':
  91. return self.get_admin_all_stream(request_dict=request_dict, userID=userID)
  92. elif operation == 'getAdminDelStream':
  93. return self.get_admin_del_stream(request_dict=request_dict, userID=userID)
  94. elif operation == 'getAdminUpdateStream':
  95. return self.get_admin_update_stream(request_dict=request_dict, userID=userID)
  96. elif operation == 'getAdminVodUrl':
  97. return self.get_admin_vod_url(request_dict=request_dict, userID=userID)
  98. elif operation == 'getAdminFindStream':
  99. return self.get_admin_find_stream(request_dict=request_dict, userID=userID)
  100. elif operation == 'getAdminDelVideo':
  101. return self.get_admin_del_video(request_dict=request_dict, userID=userID)
  102. elif operation == 'getAllServerJson':
  103. return self.get_all_server_json(userID=userID)
  104. elif operation == 'getAdminHlsVod':
  105. return self.get_admin_hls_vod(userID=userID, request_dict=request_dict)
  106. elif operation == 'getAdminAddStream':
  107. return self.get_admin_add_stream(userID=userID, request_dict=request_dict)
  108. else:
  109. return ResponseJSON(444)
  110. else:
  111. return HttpResponse(tokenManager.errorCodeInfo(error_code))
  112. else:
  113. return ResponseJSON(311)
  114. def add_stream(self, token, userID, request_dict):
  115. channel = request_dict.get('channel', None)
  116. status = request_dict.get('status', None)
  117. uid = request_dict.get('uid', None)
  118. flag_param = CommonService.get_param_flag(data=[channel, status, uid])
  119. if flag_param is True:
  120. is_user = ModelService.check_own_device(userID=userID, UID=uid)
  121. if is_user is True:
  122. stream_queryset = Equipment_Stream.objects.filter(userID=userID, uid=uid, channel=channel, rank=1)
  123. if stream_queryset.exists():
  124. return ResponseJSON(174)
  125. try:
  126. flag = Equipment_Stream.objects.create(userID=userID, status=status, uid=uid, channel=channel,
  127. access_token=token)
  128. except Exception as e:
  129. errorInfo = traceback.format_exc()
  130. print(errorInfo)
  131. return ResponseJSON(424, errorInfo)
  132. else:
  133. if flag:
  134. rtmp_url = RTMP_PUSH_URL
  135. rtmp_name = uid + '_' + channel + '?userID=' + userID + '&uid=' + uid + '&channel=' + channel + '&access_token=' + token
  136. return ResponseJSON(0, {'userID': userID, 'channel': channel,
  137. 'uid': uid,
  138. 'status': status,
  139. 'access_token': token,
  140. 'rtmp_url': rtmp_url,
  141. 'rtmp_name': rtmp_name})
  142. else:
  143. return ResponseJSON(14)
  144. else:
  145. return ResponseJSON(444)
  146. def delete_stream(self, request_dict, userID):
  147. id_list = request_dict.getlist('id', None)
  148. if len(id_list):
  149. for id in id_list:
  150. Equipment_Stream.objects.filter(id=id, userID=userID).delete()
  151. return ResponseJSON(0)
  152. return ResponseJSON(444)
  153. def update_stream(self, userID, request_dict):
  154. id = request_dict.get('id', None)
  155. status = request_dict.get('status', None)
  156. is_update = Equipment_Stream.objects.filter(id=id, userID=userID).update(status=status)
  157. if is_update:
  158. return ResponseJSON(0,{'id': id, 'status': status})
  159. return ResponseJSON(444)
  160. def query_stream(self, userID):
  161. equipment_stream_queryset = Equipment_Stream.objects.filter(userID=userID)
  162. if equipment_stream_queryset.exists():
  163. send_josn = CommonService.query_set_to_dict(equipment_stream_queryset)
  164. return HttpResponse(CommonService.response_formal(
  165. data={'code': 0, 'reason': u'Success', 'result': send_josn}))
  166. return ResponseJSON(444)
  167. def get_all_video(self, request_dict, userID):
  168. uid = request_dict.get('uid', None)
  169. channel = request_dict.get('channel', None)
  170. if uid is not None and channel is not None:
  171. own_permission = ModelService.check_permission(userID=userID, permID=30)
  172. own_device = ModelService.check_own_device(userID=userID, UID=uid)
  173. if own_permission is True or own_device is True:
  174. s3 = S3ClassObject()
  175. data = s3.get_all_object(prefix=uid + '_' + channel + '/flv')
  176. # data = s3.get_all_object(prefix=uid + '_' + channel + '/')
  177. return ResponseJSON(0, {'files': data})
  178. else:
  179. return ResponseJSON(404)
  180. return ResponseJSON(444)
  181. def get_vod_url(self, request_dict):
  182. uid = request_dict.get('uid', None)
  183. channel = request_dict.get('channel', None)
  184. filename = request_dict.get('filename', None)
  185. if uid is not None and filename is not None and channel is not None:
  186. s3 = S3ClassObject()
  187. url = s3.get_generate_vod_url(uid + '_' + channel + '/' + filename)
  188. return ResponseJSON(0, {'url': url})
  189. else:
  190. return ResponseJSON(444)
  191. def get_admin_all_stream(self, request_dict, userID):
  192. # 判断
  193. own_permission = ModelService.check_permission(userID=userID, permID=30)
  194. if own_permission is True:
  195. page = int(request_dict.get('page', None))
  196. line = int(request_dict.get('line', None))
  197. equipment_stream_queryset = Equipment_Stream.objects.all()
  198. if equipment_stream_queryset.exists():
  199. equipment_stream_count = equipment_stream_queryset.count()
  200. equipment_stream_res = equipment_stream_queryset[(page - 1) * line:page * line]
  201. send_json = CommonService.query_set_to_dict(equipment_stream_res)
  202. send_json['count'] = equipment_stream_count
  203. send_json = CommonService.query_set_to_dict(equipment_stream_queryset)
  204. return ResponseJSON(0, send_json)
  205. else:
  206. return ResponseJSON(0)
  207. else:
  208. return ResponseJSON(404)
  209. def get_admin_del_stream(self, request_dict, userID):
  210. # 判断
  211. own_permission = ModelService.check_permission(userID=userID, permID=10)
  212. if own_permission is True:
  213. id_list = request_dict.getlist('id', None)
  214. if len(id_list):
  215. for id in id_list:
  216. Equipment_Stream.objects.filter(id=id).delete()
  217. return ResponseJSON(0)
  218. else:
  219. return ResponseJSON(444)
  220. return ResponseJSON(404)
  221. def get_admin_del_video(self, request_dict, userID):
  222. # 判断
  223. own_permission = ModelService.check_permission(userID=userID, permID=10)
  224. if own_permission is True:
  225. key_list = request_dict.getlist('key', None)
  226. if len(key_list):
  227. uid = request_dict.get('uid', None)
  228. channel = request_dict.get('channel', None)
  229. if uid is not None and channel is not None:
  230. re_uid = re.compile(r'^' + uid + '_' + str(channel))
  231. re_flag = False
  232. print(key_list)
  233. for keys in key_list:
  234. re_flag = re_uid.match(keys)
  235. if re_flag is not True:
  236. break
  237. print(re_flag)
  238. if re_flag:
  239. s3 = S3ClassObject()
  240. response = s3.del_object_list(keylist=key_list)
  241. if response['Deleted']:
  242. return ResponseJSON(0,
  243. {'deleted': response['Deleted']})
  244. return ResponseJSON(444)
  245. def get_del_video(self, request_dict, userID):
  246. uid = request_dict.get('uid', None)
  247. channel = request_dict.get('channel', None)
  248. if uid is not None and channel is not None:
  249. own_permission = ModelService.check_own_device(userID=userID, UID=uid)
  250. if own_permission is True:
  251. key_list = request_dict.getlist('key', None)
  252. if len(key_list) > 0 and key_list is not None:
  253. re_uid = re.compile(r'^' + uid + '_' + str(channel))
  254. re_flag = False
  255. print(key_list)
  256. for keys in key_list:
  257. re_flag = re_uid.match(keys)
  258. if re_flag is not True:
  259. break
  260. if re_flag:
  261. s3 = S3ClassObject()
  262. response = s3.del_object_list(keylist=key_list)
  263. if response['Deleted']:
  264. return ResponseJSON(0)
  265. else:
  266. return ResponseJSON(404)
  267. return ResponseJSON(444)
  268. def get_admin_update_stream(self, userID, request_dict):
  269. own_permission = ModelService.check_permission(userID=userID, permID=50)
  270. if own_permission is True:
  271. id = request_dict.get('id', None)
  272. status = request_dict.get('status', None)
  273. param_flag = CommonService.get_param_flag(data=[status, id])
  274. if param_flag is True:
  275. is_update = Equipment_Stream.objects.filter(id=id).update(status=status)
  276. if is_update:
  277. return ResponseJSON(0, {'id': id, 'status': status})
  278. else:
  279. return ResponseJSON(444)
  280. else:
  281. return ResponseJSON(404)
  282. def get_admin_vod_url(self, userID, request_dict):
  283. own_permission = ModelService.check_permission(userID=userID, permID=30)
  284. if own_permission is True:
  285. uid = request_dict.get('uid', None)
  286. channel = request_dict.get('channel', None)
  287. filename = request_dict.get('filename', None)
  288. if uid is not None and filename is not None and channel is not None:
  289. s3 = S3ClassObject()
  290. url = s3.get_generate_vod_url(uid + '_' + channel + '/' + filename)
  291. return ResponseJSON(0, {'url': url})
  292. else:
  293. return ResponseJSON(444)
  294. else:
  295. return ResponseJSON(404)
  296. def get_admin_find_stream(self, userID, request_dict):
  297. own_permission = ModelService.check_permission(userID=userID, permID=20)
  298. if own_permission is True:
  299. content = request_dict.get('content', None)
  300. page = int(request_dict.get('page', None))
  301. line = int(request_dict.get('line', None))
  302. param_flag = CommonService.get_param_flag(data=[content, page, line])
  303. if param_flag is True:
  304. content = json.loads(content)
  305. search_kwargs = CommonService.get_kwargs(data=content)
  306. equipment_stream_queryset = Equipment_Stream.objects.filter(**search_kwargs)
  307. if equipment_stream_queryset.exists():
  308. equipment_stream_count = equipment_stream_queryset.count()
  309. equipment_stream_res = equipment_stream_queryset[(page - 1) * line:page * line]
  310. send_json = CommonService.query_set_to_dict(equipment_stream_res)
  311. send_json['count'] = equipment_stream_count
  312. return ResponseJSON(0, send_json)
  313. else:
  314. return ResponseJSON(0)
  315. else:
  316. return ResponseJSON(444)
  317. else:
  318. return ResponseJSON(404)
  319. def get_all_server_json(self, userID):
  320. own_permission = ModelService.check_permission(userID=userID, permID=20)
  321. if own_permission is True:
  322. url = NGINX_RTMP_STAT
  323. res = requests.get(url)
  324. xml_content = res.text
  325. xml_dict = xmltodict.parse(xml_content)
  326. if len(xml_dict):
  327. return ResponseJSON(0, {'data': xml_dict})
  328. else:
  329. return ResponseJSON(404)
  330. def get_admin_add_stream(self, token, userID, request_dict):
  331. channel = request_dict.get('channel', None)
  332. status = request_dict.get('status', None)
  333. uid = request_dict.get('uid', None)
  334. flag_param = CommonService.get_param_flag(data=[channel, status, uid])
  335. if flag_param is True:
  336. own_perm = ModelService.check_permission(userID=userID, permID=40)
  337. if own_perm is True:
  338. stream_queryset = Equipment_Stream.objects.filter(uid=uid, channel=channel)
  339. if stream_queryset.exists():
  340. return ResponseJSON(174)
  341. try:
  342. flag = Equipment_Stream.objects.create(userID=userID, status=status, uid=uid, channel=channel,
  343. access_token=token)
  344. except Exception as e:
  345. errorInfo = traceback.format_exc()
  346. print(errorInfo)
  347. return ResponseJSON(424, {'details': errorInfo})
  348. else:
  349. if flag:
  350. rtmp_url = RTMP_PUSH_URL
  351. rtmp_name = uid + '_' + channel + '?userID=' + userID + '&uid=' + uid + '&channel=' + channel + '&access_token=' + token
  352. return ResponseJSON(0,
  353. {'userID': userID, 'channel': channel,
  354. 'uid': uid,
  355. 'status': status,
  356. 'access_token': token,
  357. 'rtmp_url': rtmp_url,
  358. 'rtmp_name': rtmp_name})
  359. else:
  360. return ResponseJSON(404)
  361. else:
  362. return ResponseJSON(444)
  363. def get_admin_hls_vod(self, request_dict, userID):
  364. own_permission = ModelService.check_permission(userID=userID, permID=30)
  365. if own_permission is True:
  366. uid = request_dict.get('uid', None)
  367. channel = request_dict.get('channel', None)
  368. filename = request_dict.get('filename', None)
  369. param_flag = CommonService.get_param_flag(data=[uid, filename, channel])
  370. if param_flag is True:
  371. uid_channel = uid + '_' + channel
  372. InputKey = uid_channel + '/flv/' + filename
  373. ts = filename.split('.')[0]
  374. vod_key = uid_channel + '/' + ts
  375. elastictranscoder = ElasticTranscoder()
  376. res = elastictranscoder.create_job(
  377. # InputKey='2N1K3LE78TYJ38CE111A_99/flv/1526882855.flv',
  378. InputKey=InputKey,
  379. # OutputKey='vod/2N1K3LE78TYJ38CE111A_99/1526882855'
  380. OutputKey='vod/' + vod_key
  381. )
  382. if res is True:
  383. domain_prefix = 'http://d3596w5a6euckc.cloudfront.net/vod'
  384. vod_url = domain_prefix + '/' + vod_key + '.m3u8'
  385. return ResponseJSON(0, {'vodurl': vod_url})
  386. else:
  387. return ResponseJSON(403)
  388. else:
  389. return ResponseJSON(444)
  390. else:
  391. return ResponseJSON(404)
  392. def get_vod_hls(self, request_dict):
  393. uid = request_dict.get('uid', None)
  394. channel = request_dict.get('channel', None)
  395. filename = request_dict.get('filename', None)
  396. param_flag = CommonService.get_param_flag(data=[uid, filename, channel])
  397. if param_flag is True:
  398. uid_channel = uid + '_' + channel
  399. InputKey = uid_channel + '/flv/' + filename
  400. ts = filename.split('.')[0]
  401. vod_key = uid_channel + '/' + ts
  402. elastictranscoder = ElasticTranscoder()
  403. res = elastictranscoder.create_job(
  404. InputKey=InputKey,
  405. OutputKey='vod/' + vod_key
  406. )
  407. if res is True:
  408. domain_prefix = 'http://d3596w5a6euckc.cloudfront.net/vod'
  409. vod_url = domain_prefix + '/' + vod_key + '.m3u8'
  410. vod_cookie_url = domain_prefix + '/' + uid_channel + '/*'
  411. expires_at = int(time.time()) + 7200
  412. cf = BetterThanBoto()
  413. vodCookie = cf.create_signed_cookies(url=vod_cookie_url, keypair_id="APKAINI6BNPKV54NHH7Q",
  414. expires_at=expires_at,
  415. private_key_file=os.path.join(BASE_DIR,
  416. 'Ansjer/file/pk-APKAINI6BNPKV54NHH7Q.pem'))
  417. return ResponseJSON(0, {'vodurl': vod_url,'vodCookie': vodCookie})
  418. else:
  419. return ResponseJSON(403)
  420. else:
  421. return ResponseJSON(444)
  422. # 推流验证
  423. @csrf_exempt
  424. def Auth_Stream(request, *callback_args,
  425. **callback_kwargs):
  426. if request.method == 'GET':
  427. request.encoding = 'utf-8'
  428. request_dict = request.GET
  429. if request.method == 'POST':
  430. request.encoding = 'utf-8'
  431. request_dict = request.POST
  432. access_token = request_dict.get('access_token', None)
  433. userID = request_dict.get('userID', None)
  434. uid = request_dict.get('uid', None)
  435. channel = request_dict.get('channel', None)
  436. param_flag = CommonService.get_param_flag(data=[access_token, userID, uid, channel])
  437. if param_flag is True:
  438. own_permission = ModelService.check_permission(userID=userID, permID=60)
  439. if own_permission is True:
  440. equipment_stream_queryset = Equipment_Stream.objects.filter(userID=userID, uid=uid, channel=channel,
  441. status=1, access_token=access_token)
  442. if equipment_stream_queryset.exists():
  443. return HttpResponse(status=200)
  444. return HttpResponse(status=404)
  445. # 播放验证
  446. @csrf_exempt
  447. def Auth_Live(request, *callback_args,
  448. **callback_kwargs):
  449. if request.method == 'GET':
  450. request.encoding = 'utf-8'
  451. request_dict = request.GET
  452. if request.method == 'POST':
  453. request.encoding = 'utf-8'
  454. request_dict = request.POST
  455. token = request_dict.get('token', None)
  456. if token is not None:
  457. tokenManager = JSONTokenManager()
  458. error_code = tokenManager.verify_AToken(token)
  459. if error_code == 0:
  460. userID = request_dict.get('userID', None)
  461. uid = request_dict.get('uid', None)
  462. channel = request_dict.get('channel', None)
  463. if userID is not None and uid is not None and channel is not None:
  464. own_permission = ModelService.check_permission(userID=userID, permID=90)
  465. if own_permission is True:
  466. equipment_stream_queryset = Equipment_Stream.objects.filter(userID=userID, uid=uid, channel=channel,
  467. status=1)
  468. if equipment_stream_queryset.exists():
  469. return HttpResponse(status=200)
  470. return HttpResponse(status=404)
  471. @csrf_exempt
  472. def send_video_s3(request, *callback_args,
  473. **callback_kwargs):
  474. if request.method == 'GET':
  475. request.encoding = 'utf-8'
  476. request_dict = request.GET
  477. if request.method == 'POST':
  478. request.encoding = 'utf-8'
  479. request_dict = request.POST
  480. # 文件名
  481. basename = request_dict.get('basename', None)
  482. print(basename)
  483. if basename != None:
  484. base_path = '/tmp/flv/'
  485. file_base_path = base_path + basename
  486. input_path = file_base_path + '.flv'
  487. output_path = file_base_path + '.mp4'
  488. if os.path.exists(input_path):
  489. uid_channel = basename.split('-')[0]
  490. uid = uid_channel.split('_')[0]
  491. channel = uid_channel.split('_')[1]
  492. equipment_stream_queryset = Equipment_Stream.objects.filter(channel=channel, uid=uid, status=1)
  493. if equipment_stream_queryset.exists():
  494. try:
  495. key = uid_channel + '/' + basename + '.mp4'
  496. # 转换到
  497. ff = FFmpeg(
  498. inputs={input_path: None},
  499. outputs={output_path: ['-vcodec', 'copy', '-strict', '-2']}
  500. )
  501. ff.run()
  502. # 截取第一帧当缩略图
  503. # ffmpeg -i 555.flv -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg
  504. except Exception as e:
  505. errorInfo = traceback.format_exc()
  506. print(errorInfo)
  507. else:
  508. if os.path.exists(output_path):
  509. s3 = S3ClassObject()
  510. s3_response = s3.put_mp4_object(body=open(output_path, 'rb'), key=key)
  511. print(s3_response)
  512. if s3_response['ResponseMetadata']['HTTPStatusCode'] == 200:
  513. # 记录保存文件容量,由于此操作过于频繁入库,上线代码去掉
  514. file_size = CommonService.get_file_size(file_path=output_path, suffix_type='MB',
  515. decimal_point=2)
  516. size = equipment_stream_queryset[0].total_flow
  517. if size:
  518. pass
  519. else:
  520. size = 0
  521. equipment_stream_queryset.update(total_flow=size + file_size)
  522. #
  523. rm_common = 'rm ' + input_path + ' ' + output_path
  524. subprocess.Popen(rm_common, shell=True)
  525. return HttpResponse(status=200)
  526. else:
  527. rm_common = 'rm ' + input_path + ' ' + output_path
  528. print('respone error')
  529. subprocess.Popen(rm_common, shell=True)
  530. return HttpResponse(status=403)
  531. else:
  532. return ResponseJSON(444)
  533. @csrf_exempt
  534. def push_flv_s3(request, *callback_args,
  535. **callback_kwargs):
  536. if request.method == 'GET':
  537. request.encoding = 'utf-8'
  538. request_dict = request.GET
  539. if request.method == 'POST':
  540. request.encoding = 'utf-8'
  541. request_dict = request.POST
  542. # 文件名
  543. basename = request_dict.get('basename', None)
  544. # print(basename)
  545. if basename != None:
  546. base_path = 'tmp/flv/'
  547. file_base_path = base_path + basename
  548. flv_path = file_base_path + '.flv'
  549. if os.path.exists(flv_path):
  550. dict_file = basename.split('-')
  551. uid_channel = dict_file[0]
  552. file_time = dict_file[1]
  553. uid = uid_channel.split('_')[0]
  554. channel = uid_channel.split('_')[1]
  555. equipment_stream_queryset = Equipment_Stream.objects.filter(channel=channel, uid=uid, status=1)
  556. if equipment_stream_queryset.exists():
  557. try:
  558. jpg_path = file_base_path + '.jpg'
  559. # 截取第一帧当缩略图ffmpeg -i 2N1K3LE78TYJ38CE111A_99-1526882169.flv -y -f image2 -t 0.001 -s 352x240 a.jpg
  560. ff = FFmpeg(
  561. inputs={flv_path: None},
  562. outputs={jpg_path: ['-y', '-f', 'image2', '-t', '0.001', '-s', '352x240']}
  563. )
  564. ff.cmd
  565. ff.run()
  566. except Exception as e:
  567. errorInfo = traceback.format_exc()
  568. print(errorInfo)
  569. else:
  570. if os.path.exists(jpg_path):
  571. s3 = S3ClassObject()
  572. flv_key = uid_channel + '/flv/' + file_time + '.flv'
  573. jpg_key = uid_channel + '/jpg/' + file_time + '.jpg'
  574. try:
  575. flv_response = s3.put_object(body=open(flv_path, 'rb'), key=flv_key)
  576. jpg_response = s3.put_object(body=open(jpg_path, 'rb'), key=jpg_key)
  577. if flv_response['ResponseMetadata']['HTTPStatusCode'] == 200 and \
  578. jpg_response['ResponseMetadata']['HTTPStatusCode'] == 200:
  579. code = 0
  580. else:
  581. code = 444
  582. except Exception as e:
  583. print(repr(e))
  584. code = 444
  585. pass
  586. path_list = [flv_path, jpg_path]
  587. for i in path_list:
  588. try:
  589. os.remove(i)
  590. except Exception as e:
  591. print(repr(e))
  592. pass
  593. return ResponseJSON(code)
  594. return ResponseJSON(444)