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

Zah*_*lii 16 audio mp3 ffmpeg

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

ffmpeg -i SILENCE.mp3 -af silencedetect=n=-50dB:d=1 -y -ab 192k  SILENCE_OUT.mp3
Run Code Online (Sandbox Code Playgroud)

但是,会生成以下输出:

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%
Run Code Online (Sandbox Code Playgroud)

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

任何帮助表示赞赏!

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

ElD*_*Dog 31

使用silenceremove过滤器.这样只会消除音频轨道的静音 - 它会使视频保持未经编辑状态,即事物将不同步

它的论点有点神秘.

一个例子

ffmpeg -i input.mp3 -af silenceremove=1:0:-50dB output.mp3
Run Code Online (Sandbox Code Playgroud)

这消除了沉默

  • 在开头(由第一个参数表示1)
  • 最小长度为零(由第二个参数表示0)
  • 沉默被归类为低于-50分贝的任何东西(表示为-50dB).

文档: FFMPEG静音删除过滤器

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

编辑

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

ffmpeg -hide_banner -filters | grep silenceremove

如果你有过滤器,它会输出类似的东西

silenceremove A->A Remove silence

  • 请注意,`-af silenceremove`将重新编码您的音频文件,从而改变比特率.您不能使用`-acodec copy`来保持原始质量. (8认同)
  • 要知道此过滤器是否可用:`ffmpeg -hide_banner -filters | grep silentremove` 应该显示 `...silenceremove A->A 删除沉默。` (2认同)
  • 如何从音频的开头和结尾(但不是中间)消除静音?我尝试使用 stop_periods 跟踪文档,但它要么对文件没有任何作用,要么使其损坏,长度为 0:00 (2认同)
  • 如何删除无声的视频部分? (2认同)

Zah*_*lii 13

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

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

ffmpeg -i INPUT.mp3 -af silencedetect=n=-50dB:d=1
Run Code Online (Sandbox Code Playgroud)

并以下列形式监测产出:

[silencedetect @ 0000000004970f80] silence_start: -0.00154195
[silencedetect @ 0000000004970f80] silence_end: 3.20435 | silence_duration: 3.2059
...
[silencedetect @ 0000000004970f80] silence_start: 343.84
Run Code Online (Sandbox Code Playgroud)

并且,切断开始和结束的沉默:

ffmpeg -i INPUT.mp3 -ss 3.20435 -t (343.84-3.20435)
Run Code Online (Sandbox Code Playgroud)

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

  • ffmpeg写信给stderr.这意味着,您需要使用ProcessBuilder和redirectErrorStream(true).
  • 其次,您需要提取silence_start和silence_end信息.
  • 那么您可以使用时间戳来剪切视频

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

  • 实际上,我为此命令收到了“必须指定至少一个输出文件”。 (2认同)

Eli*_*Eli 7

我阅读了 FFmpeg silentremove文档,这就是您如何在音频文件的开头和结尾删除静音(在中间保持静音)。

ffmpeg -i "INPUT.mp3" -af silenceremove=start_periods=1:stop_periods=1:detection=peak "OUTPUT.mp3"
Run Code Online (Sandbox Code Playgroud)


小智 5

正如其他海报所示,silenceDetect 不会删除任何内容。要从音频文件中删除所有静音(此处低于 -30 dB),并在片段之间留出 2 秒的间隙,请使用以下命令。

ffmpeg -i inputfile.mp3 -af "silenceremove=start_periods=1:stop_periods=-1:start_threshold=-30dB:stop_threshold=-30dB:start_silence=2:stop_silence=2" outputfile.mp3
Run Code Online (Sandbox Code Playgroud)