我有幾個使用 VLC 儲存的全高清 IPTV 頻道的影片記錄。這些串流轉儲儲存為 MPEG-TS 文件,並包含 AVC 編碼視訊和 MPEG 音訊。
我想根據幀精確的剪切點從這些錄音中提取特定的剪輯。但是,我很難確定需要傳遞到的確切的毫秒時間戳FFMPEG-ss
和參數來-to
精確地達到我想要的切點。這是我到目前為止所嘗試過的:
嘗試1
我最初的嘗試是將.ts
文件加載到阿維多路復用器因為它允許舒適的逐幀搜索,並以必要的精度顯示當前幀的時間戳。但是,如果我將我想要的幀的時間戳(以格式HH:MM:SS.mmm
)放入FFMPEG參數時,剪輯實際上會偏離幾幀,有時甚至超過一秒鐘。每個檔案的漂移都不同,可以是正值,也可以是負值。
然後我注意到對於大多數這些錄音,第一幀阿維多路復用器實際上顯示的時間戳記不為零(例如00:00:00.280
或甚至00:00:00.216
)。我假設可見光通信立即開始錄音,但是阿維多路復用器忽略第一個 I 幀之前的所有內容。不過,我仍然想知道像 這樣的時間戳00:00:00.216
,因為這些影片的幀率為 25 fps,而 216 甚至不是 40 毫秒的倍數。
嘗試2
我嘗試了兩次通過的過程,其中我將對影片進行一次編碼,編碼開始時間比我想要的剪輯稍早,並在我想要的結束之後稍晚完成。然後我會用阿維多路復用器統計影片開頭和結尾的多餘幀,並將剪切點nFrames * 40 ms
向內移動。然而,結果卻是仍然不精確,這會導致我有時將影片縮短太少的幀,有時又縮短太多。
失去信任阿維多路復用器的時間戳準確性,或至少得出結論,它的某些計算方式與FFMPEG,我認為最安全的方法是使用與實際剪切影片相同的工具來確定剪切點。
嘗試3
我嘗試使用 FFMPEG 提取所需剪切點周圍的單個幀,方法是使用-ss
與-to
剪切視頻相同的參數,但僅選擇緊鄰所需剪切點的範圍,並將幀寫入圖片檔案。我還會使用過濾器來刻錄每個畫面的確切時間戳,由下式決定FFMPEG,直接進入圖片。這樣我就可以讀出所需的切割點並將它們用於實際編碼。我的命令列看起來像這樣:
ffmpeg.exe -i input.ts -ss 00:00:29.000 -to 00:00:31.000 -vf drawtext=fontfile=roboto.ttf:fontsize=40:text='%{pts\:hms}':[email protected]:x=10:y=10 image%03d.png
然後我會找到我想要剪切的確切PNG,查看時間戳,如果它說,那將是我用於實際剪切的00:00:30.160
時間戳。-ss
然而,這仍然不起作用,我的剪切點仍然比提取的 PNG 早或晚幾幀。如此改變FFMPEG從視訊到影像的輸出似乎會影響時間戳記的計算方式,因為它們不匹配!
到目前為止,我還沒有找到一種方法來避免必須進行冗長的二進制搜索過程來手動接近剪切所需的確切時間戳,這特別麻煩,因為我只能通過執行“完全解碼”來獲取我需要的時間戳尋找」(即-ss
在輸入參數之後使用,而不是之前),並且可能需要很長時間才能在錄音中幾個小時內尋找到某個位置。
如何找到獲得幀精確剪切所需的時間戳FFMPEG在 MPEG 傳輸串流中,無需多次解碼、剪切和保存影片片段,以便手動慢慢接近它們?
這裡是媒體訊息在其中一個錄音中,如果它包含任何關於流本身奇怪的事情的線索:
General
ID : 1 (0x1)
Complete name : C:\Users\…\vlc-record-2021-03-09-00h23m11s.ts
Format : MPEG-TS
File size : 2.31 GiB
Overall bit rate mode : Variable
Video
ID : 256 (0x100)
Menu ID : 1 (0x1)
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L4
Format settings : CABAC / 4 Ref Frames
Format settings, CABAC : Yes
Format settings, Reference frames : 4 frames
Codec ID : 27
Width : 1 920 pixels
Height : 1 080 pixels
Display aspect ratio : 16:9
Frame rate : 25.000 FPS
Standard : Component
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Interlaced
Scan type, store method : Separated fields
Scan order : Top Field First
Color range : Limited
Color primaries : BT.709
Transfer characteristics : BT.709
Matrix coefficients : BT.709
Audio
ID : 257 (0x101)
Menu ID : 1 (0x1)
Format : MPEG Audio
Format version : Version 1
Format profile : Layer 2
Codec ID : 3
Bit rate mode : Constant
Bit rate : 128 kb/s
Channel(s) : 2 channels
Sampling rate : 48.0 kHz
Compression mode : Lossy
Delay relative to video : -248 ms
Menu
ID : 4096 (0x1000)
Menu ID : 1 (0x1)
List : 256 (0x100) (AVC) / 257 (0x101) (MPEG Audio)
Service name : Service01
Service provider : FFmpeg
Service type : digital television
附加資訊:每個文件的時間戳漂移都不同,但在每個文件內是恆定的。也就是說,如果我需要在影片中進行多次剪切,並且對於一次剪切,確定使用提取的圖片中給出的時間戳FFMPEG總是比我需要使用的要低 160ms -ss
,我可以對同一文件中的其餘剪切使用相同的偏移量,並且它將是精確的。