django视频上传,python使用opencv截取视频第一帧,并保存图片到指定位置

骑猪看日落 2021-05-07 20:35 799阅读 0赞

1.说明

  • 笔者使用django做后台,需求是在前端上传文件过来,判断文件类型,如果是图片形式,则保存到磁盘中,
    并把图片与文章的关联关系写入数据库中。
  • 如果上传的是视频,则需要截取第一帧做封面图,同时把视频和封面图一并写入磁盘,并保存到数据库中。
  • 图片、视频、封面图都存在同一张表中,用不同的标志位区分。

2.环境准备

安装好opencv-python,不然import cv2的时候会报错

  1. pip install opencv-python

3.代码编写

  1. @csrf_exempt
  2. def uploadPhoto(request):
  3. if request.method == 'POST':
  4. # 图片资源所属文章的id
  5. article_id = request.POST.get('article_id')
  6. # 提交过来的类型为formdata
  7. file_obj = request.FILES.get('photo')
  8. size = file_obj.size
  9. if size > 30*1024*1024: # 限制输入大小为30M
  10. return HttpResponse(json.dumps({ 'code': 405, 'information': '上传视频或图片大于30M!'}), content_type="application/json")
  11. if file_obj.name.split('.')[-1] not in ['jpeg', 'jpg', 'png', 'JPEG', 'JPG', 'PNG', 'mp4', 'MP4', 'gif',
  12. 'GIF']:
  13. result = { "code": '500', 'information': '文件格式错误!'}
  14. return HttpResponse(json.dumps(result, ensure_ascii=False))
  15. # 处理图片,判断图片类型
  16. if file_obj.name.split('.')[-1] in ['jpeg', 'jpg', 'png', 'JPEG', 'JPG', 'PNG', 'gif', 'GIF']:
  17. photo_name = 'static/images/' + 'img_' + str(random.randint(1, 9999)) + datetime.now().strftime(
  18. "%Y%m%d%H%M%S") + str(random.randint(1, 99)) + '.' + file_obj.name.split('.')[-1]
  19. try:
  20. with open(photo_name, 'wb+') as f:
  21. f.write(file_obj.read())
  22. except Exception as e:
  23. result = { "code": '500', 'information': '文件写入错误!'}
  24. return HttpResponse(json.dumps(result, ensure_ascii=False))
  25. photo_name = '/'+photo_name
  26. photo = models.Photo(photo_url=photo_name, create_time=datetime.now(), flag=0,
  27. article_id=int(article_id))
  28. photo.save()
  29. result = { "code": '200', "flag": 0, "photo_name": toIp()+photo_name}
  30. return HttpResponse(json.dumps(result, ensure_ascii=False))
  31. # 处理视频
  32. if file_obj.name.split('.')[-1] in ['mp4', 'MP4', ]:
  33. video_name = 'static/videos/' + 'video_' + str(random.randint(1, 9999)) + datetime.now().strftime(
  34. "%Y%m%d%H%M%S") + str(random.randint(1, 99)) + '.' + file_obj.name.split('.')[-1]
  35. try:
  36. with open(video_name, 'wb+') as f:
  37. f.write(file_obj.read())
  38. except Exception:
  39. result = { "code": '500', 'information': '文件写入错误!'}
  40. return HttpResponse(json.dumps(result, ensure_ascii=False))
  41. # 使用opencv 截取视频文件第一帧 pip install opencv-python
  42. vc = cv2.VideoCapture(video_name) # 读入视频文件
  43. if vc.isOpened(): # 判断是否正常打开
  44. rval, frame = vc.read()
  45. screenshot_name = 'static/images/' + 'shot_' + str(random.randint(1, 9999)) + \
  46. datetime.now().strftime("%Y%m%d%H%M%S") + str(random.randint(1, 99)) + '.jpg'
  47. cv2.imwrite(screenshot_name, frame) # 存储为图像
  48. cv2.waitKey(1)
  49. vc.release()
  50. screenshot_name = '/'+screenshot_name
  51. shot = models.Photo(photo_url=screenshot_name, create_time=datetime.now(), flag=3,
  52. article_id=int(article_id))
  53. shot.save()
  54. video_name = '/'+video_name
  55. photo = models.Photo(photo_url=video_name, create_time=datetime.now(), flag=1,
  56. article_id=int(article_id))
  57. photo.save()
  58. result = { "code": '200', "flag": 1, "photo_name": toIp()+video_name, "shot_name": toIp()+screenshot_name}
  59. return HttpResponse(json.dumps(result, ensure_ascii=False))
  60. else:
  61. result = { "code": '500', 'information': '视频无法正常打开!'}
  62. return HttpResponse(json.dumps(result, ensure_ascii=False))
  63. result = { 'code': 402}
  64. return HttpResponse(json.dumps(result, ensure_ascii=False), content_type="application/json")

4.效果

使用postman测试,可以把视频、截帧后的封面图,顺利保存到工程目录下
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,799人围观)

还没有评论,来说两句吧...

相关阅读