FFmpeg – Консолидация аудиофайлов с интервалом

Пожалуйста, посмотрите изображение:

Введите описание изображения здесь

Каждый аудиоклип имеет тот же кодек / sample_rate, но имеет разную продолжительность, и каждое пространство также отличается. Между клипами всегда есть место, без перекрытия. Поэтому нет причин для перекодирования , поскольку это в основном работа с копией потока. Это важно, потому что я должен сохранить оригинальное качество для каждого клипа.

Теперь давайте подумаем, что я нашел то, что искал. Я дал этой команде псевдо-имя -start_at , он вставляет клип в аудиопоток в заданное время. С помощью этой псевдо-команды я установлю время начала каждого клипа. Остальное задание должно выполняться командой ffmpeg / filter / script и т. Д.

ffmpeg -start_at 00.00 -i audio1.opus -start_at 06.30 -i audio2.opus -start_at 21.15 -i audio3.opus -start_at 26.35 -i audio4.opus 

Просто подумайте, что ffmpeg автоматически заполнит пробелы тихими звуками.

Итак, есть ли для этого команда / фильтр ffmpeg? Или ffmpeg gui / script и т. Д.?

FFmpeg способен справиться с этим. То, что вам нужно использовать, – filter_complex с цепочкой фильтров. Вы можете создать беззвучный звук с помощью aevalsrc . Чтобы создать 5 секундный звук без звука,

 aevalsrc=0:d=5 

Таким образом, для вас будет работать следующая команда.

 ffmpeg -i input_audio_1 -i input_audio_2 -i input_audio_3 -filter_complex " aevalsrc=0:d=10[s1]; aevalsrc=0:d=15[s2]; aevalsrc=0:d=20[s3]; [s2][1:a]concat=n=2:v=0:a=1[ac1]; [s3][2:a]concat=n=2:v=0:a=1[ac2]; [0:a][s1][ac1][ac2]amix=inputs=4[aout]" -map [aout] output_audio 

Здесь я предположил, что каждый звук имеет длину 5 секунд, а повторное кодирование необязательно,

-c:a libmp3lame -ac 2 -b:a 128k

Поскольку amix вызывает перекрытие аудиозаписей, я amix звук без звука для каждого входного аудио. Вы также можете попробовать amerge и adelay где сам документ имеет четкое объяснение.

Надеюсь, это поможет вам!

Вот пример аудио concat:

ffmpeg -y -f s16be -i /dev/zero -af "[in]anullsink;amovie=1.wav[a1];amovie=silence.wav[a2];amovie=2.wav[a3];amovie=4.wav[a4];[a1][a2][a3][a4]concat=n=4:v=0:a=1[out]" -shortest -t 12 output.wav

Обратите внимание на пару вещей, которые вам нужно знать здесь:

  1. Я начал с чистого ввода /dev/zero , но это хорошо, но, возможно, есть лучший способ сделать это.
  2. Вы должны знать общую продолжительность клипа перед его выполнением ( t=12 )
  3. Я silence.wav файл silence.wav . Вы можете использовать фильтры, такие как anullsrc (см. nb_samples в документации ) или другое, но это довольно больно в заднице, если вы спросите меня.
  4. Иногда, используя этот подход, FFmpeg не знает, когда остановиться, и все же он не будет создавать пустую дорожку молчания, поскольку -shortest параметр -shortest .
  • Значимые миниатюры для видео с использованием FFmpeg
  • Лучший подход к streamу HTTP в реальном времени для видеоконтента HTML5
  • Как преобразовать прозрачный .mov-файл в файл mp4, наложенный на фоновое изображение с использованием FFMPEG
  • Как установить уровень профиля h.264 с помощью ffmpeg?
  • Ошибки FFMPEG: «max_analyze_duration» «переполнение буфера» «слишком большой пакет» Что делать?
  • Неизвестный кодер 'libmp3lame' в Ubuntu 14.04
  • Может ли FFmpeg конвертировать mp3-файлы в m4a в полном объеме, т. Е. С копированием как аудио-, так и видеопотоков (jpeg cover)?
  • Автоматически разделять большие .mov видеофайлы на более мелкие файлы на черных кадрах (смена сцены)?
  • Использовать FFMPEG на Android
  • Конкат два файла mp4 с ffmpeg без потери качества
  • FFMPEG (libx264) "высота не делится на 2"
  • Давайте будем гением компьютера.