实时将WebM转换为MP4

4

我正在尝试将远程WebM文件即时转换为MP4格式,且不需要将任何内容写入磁盘。此外,最好能够尽快流式传输结果。

这是我的Flask函数,没有实际的转换操作,所以您可以了解一下流式传输的情况。

@app.route("/stream/mp4")
def as_mp4():
    url = "http://video.webmfiles.org/big-buck-bunny_trailer.webm"
    r = requests.get(url, stream=True)

    def stream():
        # convert it here
        for chunk in r.iter_content(chunk_size=1024):
            yield chunk
        # end for
    # end def
    return Response(stream(), mimetype="video/mp4")
# end def

你可以使用ffmpeg,并将二进制流传输。 - user1767754
ffmpeg 直接从 URL 读取并写入标准输出,但由于 MP4 格式需要可寻址的输出,因此可能会遇到问题。它应该可以使用 Matroska(MKV)格式。 - mhawke
@mhawke,一些编码器中的“渐进式下载”选项怎么样?stackoverflow.com/a/10330501/3423324 - luckydonald
原来,“渐进式下载”是通过将mp4文件末尾的部分(包含元数据和长度信息的moov原子)在完全转码后移动到开头来实现的。因此,在进行渐进式下载之前仍需要生成完整的文件。另外,可以参考https://dev59.com/EWcs5IYBdhLWcg3wPxrN获取更多想法。 - luckydonald
1个回答

1
你将无法获得所期望的结果。MP4使用一个称为moov盒子的“索引”来解析原始/分块的基本流(在mdat盒子中)。因为这个索引包含每个帧的持续时间和大小,所以索引直到最后一帧被处理之前都不可用。因此,即使你将数据发送给客户端,客户端也无法在接收到整个视频之前播放它。

似乎可以通过“快速启动”/“网络优化”/“渐进式下载”选项实现。https://dev59.com/Omkv5IYBdhLWcg3wzkHa#10330501 - luckydonald
将moov盒子移到文件前仍需要先完成整个文件,然后重写以将数据移到前面。 - szatmary
可以通过分段mp4实现。但那与所问的问题不同。 - szatmary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接