具有数百个削减的 ffmpeg 性能 (atrim)
ffmpeg performance with hundreds of cuts (atrim)
我有音频文件(想想~2h),我想从中切出很多片段(500+)和一个像这样的ffmpeg命令:
['ffmpeg', '-i', 'pipe:', '-filter_complex',
'[0]atrim=end=30.69:start=0.0[s0];
[0]atrim=end=34.31:start=31.18[s1];
[0]atrim=end=38.65:start=34.43[s2];
(... hundreds more)
[s37][s38][s39][s40][s41]concat=a=1:n=42:v=0[s42]', '-map', '[s42]']
使用ffmpeg构建的流映射-python:
Stream #0:0 (mp3float) -> atrim
(... hundreds more)
Stream #0:0 (mp3float) -> atrim
concat -> Stream #0:0 (libmp3lame)
现在这按预期工作了,但是我拥有的文件在本地大约需要 10 分钟,而当我将它部署到云中的某个服务器时,大约需要一个小时。这显然取决于机器,我肯定会在那里提高速度,但我也想知道是否有办法用 ffmpeg 本身加快处理速度。
感谢指点!
为什么要通过管道将文件传送到 ffmpeg
?如果您按路径提供输入,ffmpeg
将启用在文件内查找并快速跳过必须丢弃的片段,而对于管道输入,它别无选择,只能按顺序扫描整个输入。
此外,当使用文件输入时,您可以利用 concat
demuxer 和流复制,显着节省解码和重新编码的时间。
对于您的示例,concat 分离器的输入应如下所示(请注意,相同的文件名用于不同的片段):
cut.ffconcat
ffconcat version 1.0
file input.mp3
inpoint 0.0
outpoint 30.69
file input.mp3
inpoint 31.18
outpoint 34.31
...
ffmpeg
命令行:
ffmpeg -i cut.ffconcat -codec copy cut.mp3
在我的实验中(从一个 42 分钟长的 mp3 文件中剪切出 250 个 5 秒片段)运行时差异超过 3 倍:concat demuxer + 流复制方法花费了 36 秒,而你的 atrim
+ concat
过滤解决方案。
但是请注意,使用 concat demuxer 方法时切割精度可能会更差(我怀疑它只会在音频帧边界处切割)。
我有音频文件(想想~2h),我想从中切出很多片段(500+)和一个像这样的ffmpeg命令:
['ffmpeg', '-i', 'pipe:', '-filter_complex',
'[0]atrim=end=30.69:start=0.0[s0];
[0]atrim=end=34.31:start=31.18[s1];
[0]atrim=end=38.65:start=34.43[s2];
(... hundreds more)
[s37][s38][s39][s40][s41]concat=a=1:n=42:v=0[s42]', '-map', '[s42]']
使用ffmpeg构建的流映射-python:
Stream #0:0 (mp3float) -> atrim
(... hundreds more)
Stream #0:0 (mp3float) -> atrim
concat -> Stream #0:0 (libmp3lame)
现在这按预期工作了,但是我拥有的文件在本地大约需要 10 分钟,而当我将它部署到云中的某个服务器时,大约需要一个小时。这显然取决于机器,我肯定会在那里提高速度,但我也想知道是否有办法用 ffmpeg 本身加快处理速度。
感谢指点!
为什么要通过管道将文件传送到 ffmpeg
?如果您按路径提供输入,ffmpeg
将启用在文件内查找并快速跳过必须丢弃的片段,而对于管道输入,它别无选择,只能按顺序扫描整个输入。
此外,当使用文件输入时,您可以利用 concat
demuxer 和流复制,显着节省解码和重新编码的时间。
对于您的示例,concat 分离器的输入应如下所示(请注意,相同的文件名用于不同的片段):
cut.ffconcat
ffconcat version 1.0
file input.mp3
inpoint 0.0
outpoint 30.69
file input.mp3
inpoint 31.18
outpoint 34.31
...
ffmpeg
命令行:
ffmpeg -i cut.ffconcat -codec copy cut.mp3
在我的实验中(从一个 42 分钟长的 mp3 文件中剪切出 250 个 5 秒片段)运行时差异超过 3 倍:concat demuxer + 流复制方法花费了 36 秒,而你的 atrim
+ concat
过滤解决方案。
但是请注意,使用 concat demuxer 方法时切割精度可能会更差(我怀疑它只会在音频帧边界处切割)。