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_time0我還嘗試收集有關視訊串流第一幀的資訊:

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

仍然沒有有用的信息。

但是,當我重新編碼視訊串流(透過從-c:v copy命令中刪除)時,我得到了我想要的資訊。視訊串流持續時間由該選項修改-ss。例如,如果影片的持續時間為 5,則將ffprobe返回持續時間 2(5 減 3),這讓我知道要查找的位置。如果我也加入 a -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是所尋找的框架。

相關內容