StreamMedia.py 30 KB

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