使 MKV 文件适合使用 ffmpeg(或 avconv)流式传输 - 如何将所有元数据移动到文件开头?

Fre*_*nan 4 metadata ffmpeg libav matroska

我想,我的问题很简单……

有时我喜欢从我的网络服务器下载大型 MKV 文件,并在下载时播放它们。但是,如果我对已转码的 MKV 文件执行此操作,则该文件通常会显示它比实际短得多,并且在播放结束后它将继续播放并显示不正确的时间......例如它将显示 2:50/2:50 但继续播放,但是如果我尝试使用箭头键向后搜索,播放器将崩溃或跳回文件的开头。

那么,如何在编码时将所有元数据移动到文件的开头,以便播放器知道文件的长度而不需要整个文件?您可以mp4通过 using对格式执行此操作-movflags faststart,但如何为 执行此操作mkv

如果已经在其他地方询问并回答了这个问题,我很抱歉,我想不出比我使用的更好的关键字,而且我使用的关键字没有产生任何结果。

Gya*_*yan 6

Matroska 基金会提供了一个工具mkclean,它执行类似于 qt-faststart 为 MOV/MP4 所做的任务。

句法:

mkclean in.mkv out.mkv
Run Code Online (Sandbox Code Playgroud)

这将重新生成提示索引。为了保留原始线索,

mkclean --keep-cues in.mkv out.mkv
Run Code Online (Sandbox Code Playgroud)

FFmpeg 也可以做到这一点,在用户方面进行一些猜测。

ffmpeg -i in.mkv -c copy -reserve_index_space 50k out.mkv 
Run Code Online (Sandbox Code Playgroud)

其中reserve_index_space以字节为单位的值是索引所需的大小。50kbytes 是 1 小时媒体的建议大小。