FFprobe - 是否有可能在不重新编码的情况下获取视频流的“寻找位置”?

FFprobe - 是否有可能在不重新编码的情况下获取视频流的“寻找位置”?

我有以下命令:

ffmpeg -f f32le -ar 44100 -channels 2 -i pipe:0 -ss 3 -i input.mp4 -y -f mp4 -map 0:a -map 1:v -c:v copy -use_editlist 0 output.mp4

当复制视频流而不是重新编码时,我无法获得任何有用的信息来ffprobe告诉我视频流的寻找位置。

我尝试收集有关整个流程的信息:

ffprobe -of json -show_streams -show_format output.mp4

但持续时间start_time不受影响0。我还尝试收集视频流第一帧的信息:

ffprobe -of json -select_streams v -show_frames output.mp4

仍然没有有用的信息。

但是,当我重新编码视频流(通过从-c:v copy命令中删除)时,我得到了我想要的信息。视频流持续时间由选项修改-ss。例如,如果视频的持续时间为 5,则将ffprobe返回持续时间 2(5 减 3),这让我知道寻找的位置。如果我还加入一个-copyts,那么我可以通过检查第一帧的信息来获得有用的信息。

如何在不重新编码视频流的情况下获取所需位置?谢谢!

答案1

如果你有权访问原始文件,并且已经使用

ffmpeg -f f32le -ar 44100 -channels 2 -i pipe:0 -ss X -i input.mp4 -y -f mp4 -map 0:a -map 1:v -c:v copy -use_editlist 0 output.mp4

然后按照此方法操作。

1)获取源视频流的时长

ffprobe source.mp4 -show_entries stream=duration -select_streams v -of compact=p=0 -v 0

输出例如

duration=229.033333

2)获取结果视频流的时长和第一个PTS

ffprobe output.mp4 -show_entries packet=pts_time:stream=duration -select_streams v -read_intervals 0%+#1 -of compact=p=0 -v 0

输出例如

pts_time=0.066667
duration=220.700000

因此,结果中的第一帧是源流的229.033333 - 220.700000= 。8.333333s

然而,这不会是 -ss 值,因为-ss可能不指向关键帧。

3) 因此,获取第一个音频包的持续时间和PTS。ffmpeg 将为其提供延长的持续时间以将音频与指定的-ss帧同步。

ffprobe output.mp4 -show_entries packet=pts_time,duration_time -select_streams a -read_intervals 0%+#1 -of compact=p=0 -v 0

输出例如

pts_time=0.000000|duration_time=2.733333

因此,8.333333s + 2.733333 - 0.000000 - 0.066667=11.000000s就是所寻找的框架。

相关内容