ffmpeg 用循环音频替换部分音频文件
Posted
技术标签:
【中文标题】ffmpeg 用循环音频替换部分音频文件【英文标题】:ffmpeg replace part of audio file with looped audio 【发布时间】:2016-03-05 07:36:39 【问题描述】:我对 ffmpeg 很陌生,我正在尝试用另一个第二个文件替换第一个音频文件的一部分。第二个文件可能太短,所以应该存在某种循环。
经过一番研究,我想出了以下命令参数,只要我只做一次替换,它就会给我输出。但我想做多个替换。所以对我做错了什么有帮助吗?也非常欢迎对工作方式提出任何建议/意见。
(以下命令中的任何错别字都可以忽略,我通过脚本生成命令,为了便于使用我简化了名称。)
作品(一个替换):
"ffmpeg.exe" -y -i "first.wav" -i "second.wav" -filter_complex "[1:a][1:a][1:a]concat=n=3:v=0:a=1,asetpts=PTS-STARTPTS[replaceBase];[0:a]atrim=0:3,asetpts=PTS-STARTPTS[partA];[replaceBase]atrim=0:2,asetpts=PTS-STARTPTS[replaceA];[0:a]atrim=start=5,asetpts=PTS-STARTPTS[partB];[partA][replaceA][partB]concat=n=3:v=0:a=1[aout]" -map "[aout]" Out.wav
不工作(多次替换):
"ffmpeg.exe" -y -i "first.wav" -i "second.wav" -filter_complex "[1:a][1:a][1:a]concat=n=3:v=0:a=1,asetpts=PTS-STARTPTS[replaceBase];[0:a]atrim=0:3,asetpts=PTS-STARTPTS[partA];[replaceBase]atrim=0:2,asetpts=PTS-STARTPTS[replaceA];[0:a]atrim=5:4,asetpts=PTS-STARTPTS[partB];[replaceBase]atrim=0:2,asetpts=PTS-STARTPTS[replaceB];[0:a]atrim=start=6,asetpts=PTS-STARTPTS[partC];[partA][replaceA][partB][replaceB][PartC]concat=n=4:v=0:a=1[aout]" -map "[aout]" Out.wav
ffmpeg 版本 N-76860-g72eaf72 版权所有 (c) 2000-2015 FFmpeg 开发者 使用 gcc 5.2.0 (GCC) 构建 配置: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable -libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable -libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable- libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib libavutil 55. 9.100 / 55. 9.100 libavcodec 57. 16.100 / 57. 16.100 libavformat 57. 19.100 / 57. 19.100 libav 设备 57. 0.100 / 57. 0.100 libavfilter 6. 15.100 / 6. 15.100 libswscale 4. 0.100 / 4. 0.100 libswresample 2. 0.101 / 2. 0.101 libpostproc 54. 0.100 / 54. 0.100 输入流#0.0 的猜测通道布局:立体声 输入 #0,wav,来自 '3897583stereo.wav': 时长:00:00:12.07,比特率:256 kb/s 流 #0:0:音频:pcm_s16le ([1][0][0][0] / 0x0001),8000 Hz,2 个通道,s16,256 kb/s 输入流#1.0 的猜测通道布局:立体声 输入 #1,wav,来自 'beep-021.wav': 元数据: 编码器:Lavf57.19.100 时长:00:00:00.30,比特率:1413 kb/s 流 #1:0:音频:pcm_s16le ([1][0][0][0] / 0x0001),44100 Hz,2 个通道,s16,1411 kb/s [wav @ 057242c0] 无效的流说明符:replaceBase。 最后一条消息重复了 1 次 流说明符 'STREAM CUT 不匹配任何流。
提前致谢!
【问题讨论】:
【参考方案1】:我设法通过使用 asplit.处理方式还是欢迎评论...
"ffmpeg.exe" -y -i "first.wav" -i "second.wav" -filter_complex "[1:a][1:a][1:a]concat=n=3:v=0:a=1,asetpts=PTS-STARTPTS[replaceBase];[replaceBase]asplit=2 [replaceA][replaceB];[0:a]atrim=0:3,asetpts=PTS-STARTPTS[partA];[replaceA]atrim=0:2,asetpts=PTS-STARTPTS[replaceTrimmedA];[0:a]atrim=5:6,asetpts=PTS-STARTPTS[partB];[replaceB]atrim=0:2,asetpts=PTS-STARTPTS[replaceTrimmedB];[0:a]atrim=start=8,asetpts=PTS-STARTPTS[partC];[partA][replaceTrimmedA][partB][replaceTrimmedB][PartC]concat=n=4:v=0:a=1[aout]" -map "[aout]" Out.wav
问候,
【讨论】:
以上是关于ffmpeg 用循环音频替换部分音频文件的主要内容,如果未能解决你的问题,请参考以下文章
FFmpeg总结用ffmpeg进行转格式,Android下播放网络音频流