2015-06-22 93 views

回答

16

您需要重新編碼。將x264的keyint參數設置爲5 * fps並禁用scenecut。如果你的FPS是例如24:

ffmpeg -i <input> -vcodec libx264 -x264-params keyint=120:scenecut=0 -acodec copy out.mp4 

這顯然不是最佳的質量,但它會符合您的需求。

按照嘆氣男孩的建議,編輯將no-scenecut更改爲scenecut=0

+1

感謝你......你說得對,經常會出現關鍵幀間隔混亂的問題。 –

+0

你有沒有說「如果我們設置關鍵幀間隔,質量壞的事情發生」的任何消息來源? –

+1

它會損害質量或比特率。有一個場景剪輯時,智能編碼器將放置關鍵幀,以便將來的幀可以有乾淨的參考。如果您強制設置時間間隔,關鍵幀在未來的幀中將不會達到最佳效果,並且這會影響整個流。 – Ely

9

感嘆。

關於no-scenecut選項的錯誤信息已經持續了比我所記得的更長的時間。永遠不要爲無景物剪裁輸入一個值。

鏈接到文檔可以找到here

對於FFmpeg的,你需要使用下面的兩個開關:

-g 120將確定120幀的GOP創建五秒GOP爲23.976fps內容。這可與no-scenecut選項一起使用。

-x264opts no-scenecut將強制關鍵幀根據FFmpeg使用的GOP值創建。 libx264的默認值是在檢測到場景更改時創建關鍵幀。如果使用MediInfo檢查輸出文件而沒有該選項,將會看到「scenecut = 40」。正確完成後,這將是「scenecut = 0」。如果未使用此選項,則ABR內容的關鍵幀將不對齊,並且段大小將不可預知。

請不要誤會我的意思,請在bash shell下運行以下代碼,其中$ inputfile是要分析的文件的名稱。如果使用上面顯示的兩個開關,則會在命令提示符下看到關鍵幀轉儲的非常平穩的節奏。

ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv $inputfile | grep -n I | cut -d ':' -f 1 

您也可以參考我寫了一封關於如何創建一致的內容here適當ABR框架的文章。

+0

要獲得完整的準確性,您應該使用'frame = key_frame'。有可能有I幀不是關鍵幀。 – Mulvya