使用带有silencedetect的FFMPEG来消除音频静音

我试图使用以下命令与最新的ffmpeg构建来删除我的.mp3文件中的沉默:

ffmpeg -i SILENCE.mp3 -af silencedetect=n=-50dB:d=1 -y -ab 192k SILENCE_OUT.mp3 

但是,会生成以下输出:

 ffmpeg version N-66154-g1654ca7 Copyright (c) 2000-2014 the FFmpeg developers built on Sep 5 2014 22:10:38 with gcc 4.8.3 (GCC) configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca -- enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-lib modplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrw b --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinge r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --en able-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable- libx265 --enable-libxavs --enable-libxvid --enable-decklink --enable-zlib libavutil 54. 7.100 / 54. 7.100 libavcodec 56. 1.100 / 56. 1.100 libavformat 56. 4.100 / 56. 4.100 libavdevice 56. 0.100 / 56. 0.100 libavfilter 5. 1.100 / 5. 1.100 libswscale 3. 0.100 / 3. 0.100 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 0.100 / 53. 0.100 Input #0, mp3, from 'SILENCE.mp3': Metadata: title : Snowblind (Featuring Tasha Baxter) artist : Au5 album : Snowblind (Featuring Tasha Baxter) genre : Electronica performer : Au5 track : 1/1 date : 2014 album_artist : Au5,Tasha Baxter major_brand : mp42 minor_version : 0 compatible_brands: isommp42 encoder : Lavf55.42.100 Duration: 00:05:50.80, start: 0.025057, bitrate: 192 kb/s Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 192 kb/s Output #0, mp3, to 'SILENCE_OUT.mp3': Metadata: TIT2 : Snowblind (Featuring Tasha Baxter) TPE1 : Au5 TALB : Snowblind (Featuring Tasha Baxter) TCON : Electronica TPE3 : Au5 TRCK : 1/1 TDRL : 2014 TPE2 : Au5,Tasha Baxter major_brand : mp42 minor_version : 0 compatible_brands: isommp42 TSSE : Lavf56.4.100 Stream #0:0: Audio: mp3 (libmp3lame), 44100 Hz, stereo, s16p, 192 kb/s Metadata: encoder : Lavc56.1.100 libmp3lame Stream mapping: Stream #0:0 -> #0:0 (mp3 (native) -> mp3 (libmp3lame)) Press [q] to stop, [?] for help [silencedetect @ 0000000004398f40] silence_start: -0.00628118 [silencedetect @ 0000000004398f40] silence_end: 3.21413 | silence_duration: 3.22 041 [silencedetect @ 0000000004398f40] silence_start: 343.844 [libmp3lame @ 00000000043b2940] Trying to remove 1152 samples, but the queue is empty size= 8223kB time=00:05:50.79 bitrate= 192.0kbits/s video:0kB audio:8222kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.011485% 

但是,生成的音频文件仍然具有原始长度,没有删除任何静音。 请参阅以下图像: http://i.imgur.com/nVxe5lX.png

任何帮助表示赞赏!

编辑:好吧,沉默检测只是检测沉默。 不删除它。 我会尝试为此发布一个解决方案。

使用silenceremovefilter。 这样只会消除音频轨道的静音 – 它会使video保持未编辑状态,即事物将不同步

它的论点有点神秘。

一个例子

 ffmpeg -i input.mp3 -af silenceremove=1:0:-50dB output.mp3 

这消除了沉默

  • 在开头(由第一个参数1
  • 最小长度为零(由第二个参数0
  • 静音被归类为-50分贝以下的任何值(以-50dB表示)。

文档: FFMPEG静音删除filter

也有人希望找到正确的值来分类静音,因为他们可能希望首先将他们的输入音频音量标准化为0dB ,在ffmpeg中这样做会看到这个答案 。

编辑

正如@mems所指出的,检测你的ffmpeg版本是否有filter运行

ffmpeg -hide_banner -filters | grep silenceremove

如果你有filter它会输出类似的东西

silenceremove A->A Remove silence

ffmpeg静音检测仅检测到静音。 一个人必须扫描ffmpeg输出并剪切mp3文件。

从理论上讲,这可以通过以下方式完成:

 ffmpeg -i INPUT.mp3 -af silencedetect=n=-50dB:d=1 

并以以下forms监测产出:

 [silencedetect @ 0000000004970f80] silence_start: -0.00154195 [silencedetect @ 0000000004970f80] silence_end: 3.20435 | silence_duration: 3.2059 ... [silencedetect @ 0000000004970f80] silence_start: 343.84 

并且,减少开始和结束的沉默:

 ffmpeg -i INPUT.mp3 -ss 3.20435 -t (343.84-3.20435) 

我最终编写了一个小型Java程序来完成它。 提示:

  • ffmpeg写信给stderr。 这意味着,您需要使用ProcessBuilder和redirectErrorStream(true)。
  • 其次,您需要提取silence_start和silence_end信息。
  • 然后你可以使用时间戳来剪切video

以下代码可能会有所帮助: 使用带有silencedetect的Java和FFMPEG来消除音频静音