web-dev-qa-db-fra.com

utiliser FFMPEG avec silencedetect pour supprimer le silence audio

J'essaie d'utiliser la commande suivante avec la dernière version de ffmpeg pour supprimer le silence de mes fichiers .mp3:

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

Cependant, la sortie suivante est produite:

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%

Le fichier audio généré a cependant toujours la longueur d'origine sans aucun silence supprimé. Voir les images suivantes: http://i.imgur.com/nVxe5lX.png

Toute aide est appréciée!

EDIT: Très bien, la détection du silence détecte uniquement le silence. Ne pas l'enlever. Je vais essayer de publier une solution pour cela.

18
Zahlii

Utilisez le filtre silenceremove. Cela supprime le silence de la piste audio uniquement - cela laissera la vidéo non éditée, c'est-à-dire que les choses seront désynchronisées

Ses arguments sont un peu énigmatiques.

Un exemple

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

Cela supprime le silence

  • au début (indiqué par le premier argument 1)
  • avec une longueur minimale nulle (indiquée par le deuxième argument 0)
  • le silence est classé comme étant inférieur à -50 décibels (indiqué par -50dB).

Documentation: FFMPEG silence remove filter

Aussi, toute personne cherchant à trouver la bonne valeur pour classer le silence peut souhaiter étudier la normalisation de son volume audio d'entrée à 0dB d'abord, pour faire ceci dans ffmpeg voir cette réponse .

Modifier

Comme l'a souligné @mems, pour détecter si votre version de ffmpeg a le filtre exécuté

ffmpeg -hide_banner -filters | grep silenceremove

si vous avez le filtre, il affichera quelque chose comme

silenceremove A->A Remove silence

35
ElDog

ffmpeg silence detect ne détecte que le silence. Il faut scanner la sortie ffmpeg et couper le fichier mp3.

En théorie, cela se ferait comme:

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

et la surveillance des résultats sous forme de:

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

Et, couper le début et la fin du silence:

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

J'ai fini par écrire un petit programme Java qui le fait. Astuces:

  • ffmpeg écrit dans stderr. Cela signifie que vous devez utiliser ProcessBuilder et redirectErrorStream (true).
  • deuxièmement, vous devez extraire les informations silence_start et silence_end.
  • alors vous pourriez utiliser les horodatages pour couper la vidéo

Le code suivant peut être utile: tilisation de Java et FFMPEG avec silencedetect pour supprimer le silence audio

13
Zahlii

J'ai lu le FFmpeg silenceremove documentation et c'est ainsi que vous supprimeriez le silence au début et à la fin d'un fichier audio (garde le silence au milieu).

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