使用ffmpeg分割、处理和合并文件
Dividing, processing and merging files with ffmpeg
我正在尝试构建一个应用程序,将输入视频文件(通常是 mp4)分成块,以便我可以同时对它们应用一些处理,然后将它们合并回一个文件。
为此,我列出了 4 个步骤:
在特定时间间隔强制关键帧,以确保每个
块可以单独播放。为此,我使用以下
命令:
ffmpeg -i input.mp4 -force_key_frames
"expr:gte(t,n_forced*chunk_length)" keyframed.mp4
其中 chunk_length 是每个块的持续时间。
将 keyframed.mp4 分成多个块。
这是我遇到问题的地方。我正在使用以下命令:
`ffmpeg -i keyframed.mp4 -ss 00:00:00 -t chunk_length -vcodec copy -acodec copy test1.mp4`
从我的关键帧文件中获取第一个块,但它没有捕获
输出正确,因为它似乎错过了第一个关键帧。
在其他块上,输出的持续时间有时也是
略低于 chunk_length,尽管我一直在使用
同样的 -t chunk_length 选项
处理每个块对于这个任务,我使用以下
命令:
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
此命令不允许修改,因为我的目标是
并行化这个过程。
最后,要合并我正在使用的文件 concat 和列表
第二步的输出,如下:
ffmpeg -f concat -i mylist.txt -c copy final.mp4
总之,我正在尝试找到一种方法来解决步骤 2 中的问题,如果有更好的方法,我也会征求一些意见。
我找到了一个使用以下代码的解决方案,它无需强制关键帧(它在最近的关键帧上剪切)和多个命令即可分割文件。
ffmpeg -i test.mp4 -f segment -segment_time chunk_length -reset_timestamps 1 -c copy test%02d.mp4
我正在尝试构建一个应用程序,将输入视频文件(通常是 mp4)分成块,以便我可以同时对它们应用一些处理,然后将它们合并回一个文件。
为此,我列出了 4 个步骤:
在特定时间间隔强制关键帧,以确保每个 块可以单独播放。为此,我使用以下 命令:
ffmpeg -i input.mp4 -force_key_frames "expr:gte(t,n_forced*chunk_length)" keyframed.mp4
其中 chunk_length 是每个块的持续时间。
将 keyframed.mp4 分成多个块。 这是我遇到问题的地方。我正在使用以下命令:
`ffmpeg -i keyframed.mp4 -ss 00:00:00 -t chunk_length -vcodec copy -acodec copy test1.mp4`
从我的关键帧文件中获取第一个块,但它没有捕获 输出正确,因为它似乎错过了第一个关键帧。
在其他块上,输出的持续时间有时也是 略低于 chunk_length,尽管我一直在使用 同样的 -t chunk_length 选项
处理每个块对于这个任务,我使用以下 命令:
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
此命令不允许修改,因为我的目标是 并行化这个过程。
最后,要合并我正在使用的文件 concat 和列表 第二步的输出,如下:
ffmpeg -f concat -i mylist.txt -c copy final.mp4
总之,我正在尝试找到一种方法来解决步骤 2 中的问题,如果有更好的方法,我也会征求一些意见。
我找到了一个使用以下代码的解决方案,它无需强制关键帧(它在最近的关键帧上剪切)和多个命令即可分割文件。
ffmpeg -i test.mp4 -f segment -segment_time chunk_length -reset_timestamps 1 -c copy test%02d.mp4