2015-11-08 72 views
1

我想構建一個應用程序,它將輸入視頻文件(通常是mp4)分塊,以便我可以同時對它們應用一些處理,然後將它們合併回單個文件。用ffmpeg劃分,處理和合並文件

要做到這一點,我提出了4個步驟:

  1. 在特定時間間隔強制關鍵幀,所以要確保每個 塊可以自行播放。爲此,我現在用的是以下 命令:

    ffmpeg -i input.mp4 -force_key_frames "expr:gte(t,n_forced*chunk_length)" keyframed.mp4

    其中chunk_length是每塊的持續時間。

  2. 將keyframed.mp4分成多個塊。 這是我遇到問題的地方。我使用下面的命令:

    `ffmpeg -i keyframed.mp4 -ss 00:00:00 -t chunk_length -vcodec copy -acodec copy test1.mp4` 
    

    從我的關鍵幀文件拿到第一塊,但沒有捕捉到 輸出正確的,因爲它似乎錯過了第一個關鍵幀。

    在其他塊,輸出的持續時間有時也 比chunk_length略顯不足,儘管我一直在使用 相同-t選項chunk_length

  3. 處理每個數據塊對於這個任務,我使用以下 命令:

    ffmpeg -y -i INPUT_FILE -threads 1 -pass 1 -s 1280x720 -preset medium -vprofile baseline -c:v libx264 -level 3.0 -vf "format=yuv420p" -b:v 2000k -maxrate:v 2688k -bufsize:v 2688k -r 25 -g 25 -keyint_min 50 -x264opts "keyint=50:min-keyint=50:no-scenecut" -an -f mp4 -movflags faststart /dev/null

    ffmpeg -y -i INPUT_FILE -threads 1 -pass 2 -s 1280x720 -preset medium -vprofile baseline -c:v libx264 -level 3.0 -vf "format=yuv420p" -b:v 2000k -maxrate:v 2688k -bufsize:v 2688k -r 25 -g 25 -keyint_min 50 -x264opts "keyint=50:min-keyint=50:no-scenecut" -acodec libfaac -ac 2 -ar 48000 -ab 128k -f mp4 -movflags faststart OUTPUT_FILE.mp4

    這個命令不允許修改,因爲我的目標是 並行化這個過程。

  4. 最後,合併我使用CONCAT和第2步的 輸出的列表中的文件,如下所示:

    ffmpeg -f concat -i mylist.txt -c copy final.mp4

最後,我想找到找出解決問題的方法,並且如果有更好的方法來解決這個問題,也可以得到一些意見。

回答

0

我用下面的代碼找到了一個解決方案,它不需要強制關鍵幀(它切割最近的關鍵幀)和多個命令就可以對文件進行細分。

ffmpeg -i test.mp4 -f segment -segment_time chunk_length -reset_timestamps 1 -c copy test%02d.mp4