【问题标题】:Generate thumbnail for inmemory uploaded video file为内存上传的视频文件生成缩略图
【发布时间】:2018-10-19 09:34:37
【问题描述】:

客户端应用上传了一个视频文件,我需要生成一个缩略图并将其转储到 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 并将其转储到临时文件中。文件? 我不喜欢做上面的,因为这是一个开销。

任何具有更好基准的替代解决方案也将不胜感激。

谢谢。

更新: 将内存上传的文件保存到磁盘:How to copy InMemoryUploadedFile object to disk

【问题讨论】:

    标签: django python-3.x ffmpeg


    【解决方案1】:

    我让它工作的可能方法之一如下:

    步骤:

    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

    【讨论】:

      猜你喜欢
      • 2019-10-23
      • 1970-01-01
      • 2014-06-27
      • 2011-02-19
      • 1970-01-01
      • 2017-10-14
      • 2018-06-06
      • 2012-09-01
      • 2012-05-31
      相关资源
      最近更新 更多