在这主题中,一位 VLC 开发人员说 VLC 无法播放部分下载的 mp4 文件,因为信息存储在文件末尾。但最近当我测试相同内容时,在 Chrome 中添加 mp4 任务并将部分 .crdownload 传递给 VLC,它成功了。VLC 顺利播放了 mp4。我没有让下载完成并在中途停止了播放器以节省带宽,但我相信当 Chrome 仍在下载时它会播放整个媒体。我还可以搜索视频,而某些未完成的视频格式不允许这样做。这是怎么回事?我正在做一个媒体流媒体作为一个宠物项目,真的想知道我是否可以在下载一定数量的字节后启动下载并通过命令行将媒体传递给 vlc。
答案1
MP4 文件可以在开头包含元数据块或者在末尾。它通常位于新编码文件的末尾,因为编码器可能不知道要写入什么值,直到完成对整个视频的编码(尤其是需要定位的部分)。
但在准备 MP4 文件进行在线流媒体播放时,通常将元数据移到开头,例如如下所述在这篇博文中。(换句话说,你不是第一个想这么做的人——这是网络浏览器的日常工作。)
注意:虽然帖子显示了完整的重新编码,但我不确定是否真的需要这样做——只需重新混合-codec copy -movflags faststart
并避免质量损失就足够了。
您可以使用一些工具来查看给定 MP4 文件的实际结构,例如:
$ AtomicParsley 测试.m4a -T Atom ftyp @ 0 的大小:24,结束于 @ 24 原子空闲于 24 个,大小为:8,结束于 32 个 Atom mdat @ 32 的大小:4038152,结束于 @ 4038184 Atom moov @ 4038184 大小:58035,结束于 @ 4096219 Atom mvhd @ 4038192 大小:108,结束于 @ 4038300 Atom trak @ 4038300 大小:57386,结束于 @ 4095686 Atom tkhd @ 4038308 大小:92,结束于 @ 4038400 ... Atom udta @ 4095686 大小:533,结束于 @ 4096219 Atom meta @ 4095694 大小:525,结束于 @ 4096219 Atom hdlr @ 4095706 大小:33,结束于 @ 4095739 Atom ilst @ 4095739 大小:279,结束于 @ 4096018 Atom ©nam @ 4095747 大小:31,结束于 @ 4095778 ... 分段错误(核心转储)
这里mdat
包含实际的音频/视频数据(在这种情况下只是单个音频流)并moov
包含元数据(例如moov.udta.meta.ilst.©nam
曲目标题)。