web-dev-qa-db-ja.com

FFMPEGとsilencedetectを使用してオーディオ無音を削除する

最新の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

どんな助けでもありがたいです!

編集:さて、無音検出は無音を検出するだけです。削除しません。これに対する解決策を投稿してみます。

18
Zahlii

silenceremoveフィルターを使用します。 これにより、音声トラックのみから無音が削除されます-ビデオが編集されないままになります。つまり、同期がとれなくなります

その引数は少し不可解です。

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

これは沈黙を取り除く

  • 最初(最初の引数1で示される)
  • 最小長ゼロ(2番目の引数0で示される)
  • 沈黙は、-50デシベル(-50dBで示される)未満として分類されます。

ドキュメント: FFMPEG silence remove filter

また、最初に入力オーディオボリュームを0dBに正規化してffmpegでこれを行うために、無音を分類するための適切な値を探している人は、 この答え を参照してください。

編集

@memsで指摘されているように、ffmpegのバージョンにフィルターが実行されているかどうかを検出するには

ffmpeg -hide_banner -filters | grep silenceremove

フィルターがある場合は、次のように出力されます

silenceremove A->A Remove silence

35
ElDog

ffmpeg silence detectは無音のみを検出します。 ffmpeg出力をスキャンしてmp3ファイルを切り取る必要があります。

理論的には、これは次のように行われます。

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

次の形式で出力を監視します。

[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情報を抽出する必要があります。
  • 次に、タイムスタンプを使用してビデオをカットすることができます

次のコードが役立つ場合があります: JavaおよびsilencedetectでFFMPEGを使用してオーディオの無音を削除する

13
Zahlii

私はFFmpeg silenceremove documentation を読みました。これは、オーディオファイルの最初と最後の無音を削除する方法です(中央の無音を維持します)。

ffmpeg -i "INPUT.mp3" -af silenceremove=start_periods=1:stop_periods=1:detection=peak "OUTPUT.mp3"
4
Eli