我有以下命令:
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),这让我知道所寻找的位置。如果我也将 a-copyts
添加到混合中,那么我可以通过检查第一帧的信息来获取有用的信息。
如何在不重新编码视频流的情况下获得所寻找的位置?干杯!
如果您有权访问原始文件并且您已经使用
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
输出例如
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
输出例如
因此,结果中的第一帧是源流的
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
输出例如
所以,
8.333333s + 2.733333 - 0.000000 - 0.066667
=11.000000s
是寻求的框架。