You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FFmpeg在音频多个指定位置插入不同时长的随机静音片段

实现方案

你不需要生成单独的静音音频文件,直接通过单个ffmpeg命令的filter_complex就能完成多位置静音插入,具体如下:

前置处理

首先要把你生成的插入位置数组按原音频时间点升序排序,避免前面插入的静音导致后续插入位置偏移,你示例的数组已经是升序排列,无需额外调整。

核心逻辑

按插入点把原音频拆分成N+1段(N为插入静音的数量),再对应生成N个指定时长的静音片段,最后按「原音频片段1 + 静音1 + 原音频片段2 + 静音2 + ... + 最后一段原音频」的顺序拼接即可。

PHP生成ffmpeg命令示例

你可以直接用以下PHP代码根据你的数组动态生成可执行的ffmpeg命令:

<?php
// 你的插入配置:key为原音频插入时间点,value为静音时长
$insertConfig = [
    3 => 2,
    6 => 3,
    10 => 1,
    12 => 3
];
// 原音频时长,这里你是60秒
$originalDuration = 60;
$inputFile = 'input.mp3';
$outputFile = 'output.mp3';

// 排序配置,确保时间点从小到大
ksort($insertConfig);
$points = array_keys($insertConfig);
$silenceDurs = array_values($insertConfig);

$filterParts = [];
$concatInputs = [];

$prevPoint = 0;
foreach ($points as $idx => $point) {
    // 拆分原音频片段:从prevPoint到当前插入点
    $filterParts[] = "[0:a]atrim={$prevPoint}:{$point},asetpts=N/SR/TB[a{$idx}];";
    $concatInputs[] = "[a{$idx}]";
    // 生成对应时长的静音片段
    $silenceDur = $silenceDurs[$idx];
    $filterParts[] = "anullsrc=r=44100:cl=mono,atrim=0:{$silenceDur},asetpts=N/SR/TB[s{$idx}];";
    $concatInputs[] = "[s{$idx}]";
    $prevPoint = $point;
}
// 加最后一段原音频:从最后一个插入点到原音频结束
$lastIdx = count($points);
$filterParts[] = "[0:a]atrim={$prevPoint}:{$originalDuration},asetpts=N/SR/TB[a{$lastIdx}];";
$concatInputs[] = "[a{$lastIdx}]";

// 拼接concat滤镜
$concatCount = count($concatInputs);
$filterParts[] = implode('', $concatInputs) . "concat=n={$concatCount}:v=0:a=1[outa]";

$filterStr = implode(' ', $filterParts);

// 生成最终ffmpeg命令
$ffmpegCmd = "ffmpeg -i {$inputFile} -filter_complex \"{$filterStr}\" -map \"[outa]\" -q:a 9 -acodec libmp3lame {$outputFile}";

echo $ffmpegCmd;
?>

生成的命令示例(对应你给出的配置)

运行上面的代码会输出类似下面的命令,直接执行即可:

ffmpeg -i input.mp3 -filter_complex "[0:a]atrim=0:3,asetpts=N/SR/TB[a0]; anullsrc=r=44100:cl=mono,atrim=0:2,asetpts=N/SR/TB[s0]; [0:a]atrim=3:6,asetpts=N/SR/TB[a1]; anullsrc=r=44100:cl=mono,atrim=0:3,asetpts=N/SR/TB[s1]; [0:a]atrim=6:10,asetpts=N/SR/TB[a2]; anullsrc=r=44100:cl=mono,atrim=0:1,asetpts=N/SR/TB[s2]; [0:a]atrim=10:12,asetpts=N/SR/TB[a3]; anullsrc=r=44100:cl=mono,atrim=0:3,asetpts=N/SR/TB[s3]; [0:a]atrim=12:60,asetpts=N/SR/TB[a4]; [a0][s0][a1][s1][a2][s2][a3][s3][a4]concat=n=9:v=0:a=1[outa]" -map "[outa]" -q:a 9 -acodec libmp3lame output.mp3

注意事项

  • 如果你的原音频采样率不是44100、声道不是单声道,把anullsrc=r=44100:cl=mono里的参数改成和原音频一致即可,避免拼接异常
  • 若不确定原音频参数,可以用ffmpeg -i input.mp3先查看原音频的采样率和声道信息

内容的提问来源于stack exchange,提问作者Gracie williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:06:03