我有以下命令:
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
,那麼我可以透過檢查第一幀的資訊來獲取有用的資訊。
如何在無需重新編碼視訊串流的情況下獲得所需的位置?乾杯!
答案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
是所尋找的框架。