注意:我最初錯誤地用 MP4 文件這一更常見的說法來引用 h.264 流,抱歉
我知道通常需要在關鍵影格上開始分割 h.264,以便結果影片以關鍵影格開始,但我想知道流結構/規範是什麼導致了這種情況?
作為整個檔案的固定參數,關鍵影格必須每 X 幀出現一次,還是關鍵影格之間可以有變化的間隔?如果玩家只是在出現影格時獲取影格並繪製整個事物(關鍵影格)或更新其中的一部分(非關鍵影格),那麼為什麼關鍵影格間隔很重要?
如果間隔無關緊要,並且我們想要在每 100 個關鍵幀流的第 87 幀進行剪切,我們是否可以不使用 86 個前導幀來計算新文件的新關鍵幀,將剩餘的 12 個非原始文件中的關鍵幀讓我們到達下一個關鍵幀,然後下一個原始關鍵幀(第100 幀)從那裡開始?
即檔案以「新密鑰、12 個原始非密鑰、原始密鑰、99 個原始非密鑰、原始密鑰 ..」結尾
答案1
關鍵影格可以隨時出現,我找不到引用,但我想像一下在一部有很多過場動畫的電影中。您希望關鍵幀成為任何劇烈場景更改後的第一幀,以保持視頻質量,否則當視頻壓縮器嘗試使用大量“增量”更改創建新場景時,您最終會遇到噪音風暴從上一個場景。
對於普通串流,具有一致的關鍵幀定時可能是可接受的,但對於最終內容,透過在場景變化邊界處設定關鍵影格將實現更好的品質。
關鍵影格(i 幀)是影片中影像的完整影格。後續幀(增量幀)僅包含已變更的資訊。關鍵影格將在流中出現多次,取決於它的創建方式或串流方式。
它的確是可調節,取決於您對品質和位元率的要求。
這mp4 的預設值是每 250 幀一個關鍵幀(大約每 10 秒一次)。這對於串流媒體來說是不利的,因為更改解析度更困難。YouTube 使用 2 秒的關鍵影格間隔。
還有一些方法可以只提取 iframe(關鍵影格),如所提到的BogoToBogo:縮圖(IFRAME / 場景更改)- 2020
i 影格縮圖
以下命令將為每個 I 幀建立一個縮圖,名為 yi01.png、yi02.jpg、yi03.png...yi116
ffmpeg -i yosemiteA.mp4 -f image2 -vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr yi%03d.png
select='eq(pict_type,PICT_TYPE_I)'
:提取I幀影像vsync
:視訊同步方法。vfr
:可變幀速率。