django视频上传,python使用opencv截取视频第一帧,并保存图片到指定位置
1.说明
- 笔者使用django做后台,需求是在前端上传文件过来,判断文件类型,如果是图片形式,则保存到磁盘中,
并把图片与文章的关联关系写入数据库中。 - 如果上传的是视频,则需要截取第一帧做封面图,同时把视频和封面图一并写入磁盘,并保存到数据库中。
- 图片、视频、封面图都存在同一张表中,用不同的标志位区分。
2.环境准备
安装好opencv-python,不然import cv2的时候会报错
pip install opencv-python
3.代码编写
@csrf_exempt
def uploadPhoto(request):
if request.method == 'POST':
# 图片资源所属文章的id
article_id = request.POST.get('article_id')
# 提交过来的类型为formdata
file_obj = request.FILES.get('photo')
size = file_obj.size
if size > 30*1024*1024: # 限制输入大小为30M
return HttpResponse(json.dumps({ 'code': 405, 'information': '上传视频或图片大于30M!'}), content_type="application/json")
if file_obj.name.split('.')[-1] not in ['jpeg', 'jpg', 'png', 'JPEG', 'JPG', 'PNG', 'mp4', 'MP4', 'gif',
'GIF']:
result = { "code": '500', 'information': '文件格式错误!'}
return HttpResponse(json.dumps(result, ensure_ascii=False))
# 处理图片,判断图片类型
if file_obj.name.split('.')[-1] in ['jpeg', 'jpg', 'png', 'JPEG', 'JPG', 'PNG', 'gif', 'GIF']:
photo_name = 'static/images/' + 'img_' + str(random.randint(1, 9999)) + datetime.now().strftime(
"%Y%m%d%H%M%S") + str(random.randint(1, 99)) + '.' + file_obj.name.split('.')[-1]
try:
with open(photo_name, 'wb+') as f:
f.write(file_obj.read())
except Exception as e:
result = { "code": '500', 'information': '文件写入错误!'}
return HttpResponse(json.dumps(result, ensure_ascii=False))
photo_name = '/'+photo_name
photo = models.Photo(photo_url=photo_name, create_time=datetime.now(), flag=0,
article_id=int(article_id))
photo.save()
result = { "code": '200', "flag": 0, "photo_name": toIp()+photo_name}
return HttpResponse(json.dumps(result, ensure_ascii=False))
# 处理视频
if file_obj.name.split('.')[-1] in ['mp4', 'MP4', ]:
video_name = 'static/videos/' + 'video_' + str(random.randint(1, 9999)) + datetime.now().strftime(
"%Y%m%d%H%M%S") + str(random.randint(1, 99)) + '.' + file_obj.name.split('.')[-1]
try:
with open(video_name, 'wb+') as f:
f.write(file_obj.read())
except Exception:
result = { "code": '500', 'information': '文件写入错误!'}
return HttpResponse(json.dumps(result, ensure_ascii=False))
# 使用opencv 截取视频文件第一帧 pip install opencv-python
vc = cv2.VideoCapture(video_name) # 读入视频文件
if vc.isOpened(): # 判断是否正常打开
rval, frame = vc.read()
screenshot_name = 'static/images/' + 'shot_' + str(random.randint(1, 9999)) + \
datetime.now().strftime("%Y%m%d%H%M%S") + str(random.randint(1, 99)) + '.jpg'
cv2.imwrite(screenshot_name, frame) # 存储为图像
cv2.waitKey(1)
vc.release()
screenshot_name = '/'+screenshot_name
shot = models.Photo(photo_url=screenshot_name, create_time=datetime.now(), flag=3,
article_id=int(article_id))
shot.save()
video_name = '/'+video_name
photo = models.Photo(photo_url=video_name, create_time=datetime.now(), flag=1,
article_id=int(article_id))
photo.save()
result = { "code": '200', "flag": 1, "photo_name": toIp()+video_name, "shot_name": toIp()+screenshot_name}
return HttpResponse(json.dumps(result, ensure_ascii=False))
else:
result = { "code": '500', 'information': '视频无法正常打开!'}
return HttpResponse(json.dumps(result, ensure_ascii=False))
result = { 'code': 402}
return HttpResponse(json.dumps(result, ensure_ascii=False), content_type="application/json")
4.效果
使用postman测试,可以把视频、截帧后的封面图,顺利保存到工程目录下
还没有评论,来说两句吧...