使用 FFmpeg 定位 moov atom

Jam*_*lor 23 h.264 ffmpeg html5

我有一个视频库,所有这些都应该通过将moovatom放在视频的其余部分之前来针对网络流媒体进行调整。这允许在客户端完全下载视频之前开始播放。

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

slh*_*hck 23

FFmpeg 不会向您显示这些信息,真的。

您可以使用AtomicParsley来解析文件,例如:

AtomicParsley input.mp4 -T 
Run Code Online (Sandbox Code Playgroud)

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

AtomicParsley input.mp4 -T | sed -n 2p | grep -q "moov" && echo "yup" || echo "nope"
Run Code Online (Sandbox Code Playgroud)


mar*_*k4o 16

使用这个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)
$
Run Code Online (Sandbox Code Playgroud)

  • 如果你安装了 `pip`,你可以使用 `pip install qtfaststart` 安装 `qtfaststart` (3认同)

Tre*_*vor 12

使用另一个问题的答案ffmpeg描述了执行此操作的方法。运行以下 Bash 命令:

$ ffmpeg -v trace -i file.mp4 2>&1 | grep -e type:\'mdat\' -e type:\'moov\'
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:

[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
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*nny 6

您可以使用 FFprobe 执行此操作:

ffprobe -v trace infile.mp4
Run Code Online (Sandbox Code Playgroud)

或者使用Bento4

$ mp4info infile.m4a
文件:
  主要品牌:isom
  次要版本:200
  兼容品牌: isom
  兼容品牌:iso2
  兼容品牌: mp41
  快速启动:无

$ mp4info 输出文件.m4a
文件:
  主要品牌:isom
  次要版本:200
  兼容品牌: isom
  兼容品牌:iso2
  兼容品牌: mp41
  快速启动:是的

  • 您能否演示一下在 ffprobe 输出中可以找到此信息的位置吗? (2认同)