使用 FFmpeg 定位 moov atom

使用 FFmpeg 定位 moov atom

我有一个视频库,里面所有的应该已针对网络流媒体进行了调整,将原子置于moov视频其余部分的前面。这样可以在客户端完全下载视频之前开始播放。

有没有一种可靠的方法可以通过定位原子中出现的字节数来检查某个视频是否已被调整moov?这仅用于调试目的。

答案1

FFmpeg 确实不会向您显示这些信息。

你可以使用原子欧芹解析文件,例如:

AtomicParsley input.mp4 -T 

这将向您显示原子在树中的位置。如果原子moov位于文件的开头,它必须紧跟在原子之后ftyp,因此您可以尝试解析输出,例如在 Bash 中,仅打印第二行并检查它是否包含moov

AtomicParsley input.mp4 -T | sed -n 2p | grep -q "moov" && echo "yup" || echo "nope"

答案2

使用qtfaststart(与 ffmpeg 不同qt-faststart),qtfaststart -l 输入.mp4 将显示顶层原子的顺序。

$ qtfaststart -l bad.mp4
ftyp (32 bytes)
free (8 bytes)
mdat (559619 bytes)
moov (52916 bytes)
$ qtfaststart -l good.mp4
ftyp (32 bytes)
moov (52916 bytes)
mdat (559619 bytes)
$

答案3

使用的方法ffmpeg如下这个答案另一个问题。运行以下 Bash 命令:

$ ffmpeg -v trace -i file.mp4 2>&1 | grep -e type:\'mdat\' -e type:\'moov\'

输出将会像这样:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55ea95500ac0] type:'mdat' parent:'root' sz: 52958326 32 52971704
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55ea95500ac0] type:'moov' parent:'root' sz: 13354 52958358 52971704

在这个例子中,由于moov出现在之后mdat,因此 moov 原子是不是在文件开头,faststart 是不是已启用。如果moov出现在之前mdat,则 moov 原子将位于文件的开头,并且 faststart 将被启用。

答案4

或者,不使用工具,您可以只读取文件的前 50 个字节。如果字符串“moov”在其中,那就没问题了。

相关内容