我有以下命令:
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
就是所寻找的框架。