С использованием 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]()
Любая помощь приветствуется!
EDIT:
Хорошо, молчание обнаруживает только ОБНАРУЖЕНИЕ тишины. Не удалять его. Я попытаюсь опубликовать решение для этого.
Ответы
Ответ 1
Используйте фильтр silenceremove
. Это удаляет тишину только из звуковой дорожки - оно оставляет видео неотредактированным, т.е. Все будет синхронизировано
Его аргументы немного загадочны.
Пример
ffmpeg -i input.mp3 -af silenceremove=1:0:-50dB output.mp3
Это удаляет тишину
- в начале (указано первым аргументом
1
) - с минимальной нулевой длиной (указывается вторым аргументом
0
) - Молчание классифицируется как что-либо в соответствии с -50 децибел (указано
-50dB
).
Документация: FFMPEG тишина удалить фильтр
Также любой, кто хочет найти правильное значение для классификации тишины, может 0dB
сначала нормализовать громкость входного звука до 0dB
, чтобы сделать это в ffmpeg, смотрите этот ответ.
редактировать
Как указано @mems, чтобы определить, есть ли в вашей версии ffmpeg фильтр
ffmpeg -hide_banner -filters | grep silenceremove
если у вас есть фильтр, он выведет что-то вроде
silenceremove A->A Remove silence
Ответ 2
Функция ffmpeg silence определяет только тишину. Нужно сканировать выход 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).
- Во-вторых, вам нужно извлечь информацию о тишине_start и silence_end.
- тогда вы можете использовать временные метки для вырезания видео
Следующий код может быть полезен:
Использование Java и FFMPEG с помощью silencedetect для удаления звуковой паузы
Ответ 3
Я прочитал документацию FFmpeg silenceremove, и именно так вы бы удалили тишину в начале и в конце файла (хранит тишину посередине).
ffmpeg -i "INPUT.mp3" -af silenceremove=start_periods=1:stop_periods=1:detection=peak "OUTPUT.mp3"