0

有两个 ffmpeg 命令。第一个用于查找和复制视频块。第二个用于对视频块进行转码,应用选择过滤器以实现精确的帧匹配。

方法如下:

  1. ffmpeg -ss <sec_from> -to <sec_to> -copyts -i <input> -map 0:v:0 -c copy chunk.mp4
  2. ffmpeg -copyts -i chunk.mp4 -vf 'select=between(pts\,<pts_from>\,<pts_to>)' transcoded_cunk.mp4

它在大多数情况下都能正常工作。但是对于某些输入,下载的块中有一点点漂移,因此可能会丢失帧。换句话说,相同数据包的点(通过哈希比较)在输入和分块输出之间移动了几个点(在我的情况下为 0,0002 秒)。

这种pts漂移的可能原因是什么?

更新 1:那是因为 ffmpeg 在 mvhd atom 中设置 timescale=1000 所以编辑列表媒体时间开始时会失去精度。是否可以强制 mvhd 时间刻度?

更新 2:无法更改 mvhd 时间刻度,因为 ffmpeg 使用常量(MOV_TIMESCALE 1000):

https://github.com/FFmpeg/FFmpeg/blob/82bd02a2c73bb5e6b7cf5e5eba486e279f1a7358/libavformat/movenc.c#L3498

更新 3: 之前讨论过的相同问题

4

0 回答 0