python - ffmpeg 性能与数百次削减 (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
复用器,显着节省解码和重新编码。
对于您的示例,concat demuxer 的输入应如下所示(请注意,不同的片段使用相同的文件名):
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
过滤器解决方案耗时 110 秒。
但是请注意,使用 concat demuxer 方法时,剪切精度可能会更差(我怀疑它只会在音频帧边界处剪切)。
推荐阅读
- python - Python - 将 utf8 特殊字符(重音)转换为扩展的 ascii 等效字符
- c# - 在 C# 中按名称和日期作为键对字典进行排序?
- python - 如何在急切执行模式下重用 tensorflow 变量?
- vba - 从 VBA 末尾删除回车(alt+enter)
- r - R:如何优化 xml 到 data.frame 解析以提高性能
- kubernetes - Openshift 调度程序 Affinity
- javascript - ServiceNow 添加记录表单:即使在填写值后,也会显示必填字段缺失警报
- sql - Amazon Redshift - 按类别获取每周销售量
- r - 使用 Sparklyr 在 R 中创建惰性 Spark 读写 Parquet 作业
- google-chrome-devtools - 如何保存 Chrome DevTools 的 queryObjects() 产生的结果