django - 为内存上传的视频文件生成缩略图
问题描述
客户端应用程序上传了一个视频文件,我需要生成一个缩略图并将其转储到 AWS s3 并将客户端返回到缩略图的链接。我四处搜索,发现ffmpeg适合这个目的。以下是我能想出的代码:
from ffmpy import FFmpeg
import tempfile
def generate_thumbnails(file_name):
output_file = tempfile.NamedTemporaryFile(suffix='.jpg', delete=False, prefix=file_name)
output_file_path = output_file.name
try:
# generate the thumbnail using the first frame of the video
ff = FFmpeg(inputs={file_name: None}, outputs={output_file_path: ['-ss', '00:00:1', '-vframes', '1']})
ff.run()
# upload generated thumbnail to s3 logic
# return uploaded s3 path
except:
error = traceback.format_exc()
write_error_log(error)
finally:
os.remove(output_file_path)
return ''
我正在使用django并收到上述权限错误。我发现 ffmpeg 要求文件在磁盘上并且不只是考虑到 InMemory 上传的文件(我可能错了,因为我假设了这一点)。
有没有办法像使用 ffmpeg 的普通文件一样读取内存视频文件,或者我应该使用 StringIO 并将其转储到临时文件中。文件?我不想做上述,因为它是一个开销。
任何具有更好基准的替代解决方案也将不胜感激。
谢谢。
更新:将内存上传的文件保存到磁盘:如何将 InMemoryUploadedFile 对象复制到磁盘
解决方案
我让它工作的可能方法之一如下:
脚步:
a) 将 InMemory 上传的文件逐块读取到临时文件中
temp_file = tempfile.NamedTemporaryFile(suffix='.mp4', delete=False)
temp_file_path = temp_file.name
with open(temp_file_path, 'wb+') as destination:
for chunk in in_memory_file_content.chunks():
destination.write(chunk)
b) 使用 ffmpeg 和子进程生成缩略图
ffmpeg_command = 'ffmpeg -y -i {} -ss 00:00:01 vframes 1 {}'.format(video_file_path, thumbail_file_path
subprocess.call(ffmpeg_command, shell=True)
在哪里,
-y 是覆盖已经存在的目的地
00:00:01 是抓取第一帧
有关 ffmpeg 的更多信息:https ://ffmpeg.org/ffmpeg.html
推荐阅读
- javascript - 在 webextension 中鼠标滚动时从左到右滚动页面
- sql - 我不知道如何编写这个 sql 查询
- python - AWS Stubbing,不适用于调用在另一个 Python 类函数中
- c# - CS0103: 当前上下文中不存在名称 ****
- python - 在运行时生成文字
- r - 在ggplot2中重新着色图例文本背景
- amazon-web-services - Terraform - 在可用时使用 rds 快照
- php - 即使响应 JSON 匹配,assertJSON 测试也不起作用
- javascript - 音频上下文不适用于 Safari,但适用于 Chrome 和 Firefox
- r - ggplot 和 gmosaic 在 R 的条形图中显示百分比