FFmpeg микширует аудиоклипы в данный момент в основной аудиофайл - PullRequest
0 голосов
/ 02 мая 2020

Я записывал небольшие аудиоклипы для аудиокниги. У меня есть время начала каждого в секундах. Длина музыки c составляет, скажем, 60 минут. Я подумываю создать аудиофайл тишины той же продолжительности, что и musi c, но как мне добавить каждый клип в заданное время начала? Неважно, если клипы перекрываются. Я попытался использовать concat и inpoint без пустого файла, а вывод пуст (я использую wav-файлы), поэтому идея использовать мастер-пустой файл в качестве базы.

Если возможно, я был бы очень признателен за любой пример.

Спасибо

1 Ответ

2 голосов
/ 02 мая 2020

Я надеюсь понять ваш вопрос. Чтобы создать wav-файл без вывода сообщений:

ffmpeg -f lavfi -i anullsrc -t 01:00:00 silence.wav

Замените 01:00:00 (один час) нужной вам продолжительностью. Затем объедините и смешайте аудиофайлы. В этом примере я использую два небольших аудиоклипа:

ffmpeg -i silence.wav -i clip1.wav -i clip2.wav -filter_complex "aevalsrc=0:d=10[s1];aevalsrc=0:d=20[s2];[s1][1:a]concat=n=2:v=0:a=1[ac1];[s2][2:a]concat=n=2:v=0:a=1[ac2];[0:a][ac1][ac2]amix=3[aout]" -map [aout] out.wav

Это очень длинная команда для смешивания множества клипов. Итак, попробуйте скрипт bash ниже. Инструкции:

  1. Скопируйте приведенный ниже код в пустой файл sh, называемый смешиванием. sh

  2. Замените "позиции" на мгновения в секундах для запуска каждого клипа (мои стартовые клипы - 10, 22 и 35 секунд).

  3. Убедитесь, что все клипы размещены в папке с названием «клипы» (рядом с файлом sh). Не забудьте пронумеровать файлы (1.wav, 2.wav ...)

  4. Откройте терминал и введите: bash смешивание. sh

  5. Файл out.wav должен содержать аудиоклипы в нужных местах.

Здесь скрипт, удачи!

#!/bin/bash

positions=(10 22 35)
seconds_at_the_end=2

clips_folder="./clips/"
filetype=".mp3"
silence_file="silence"$filetype
output_file="out"$filetype

command="ffmpeg"
file_id=1

aevalsrc=""
concat=""
mix="[0:a]"

clips=($clips_folder*$filetype)

last_clip_length=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ${clips[-1]} | awk '{printf("%d\n",$1 + 0.5)}')
silence_length=$((${positions[-1]}+last_clip_length+seconds_at_the_end))

eval $(ffmpeg -f lavfi -i anullsrc -t $silence_length $silence_file)

for filename in $clips_folder*$filetype;
do
  inputs=$inputs" -i "$filename
  aevalsrc=$aevalsrc"aevalsrc=0:d=${positions[$((file_id-1))]}[s"$file_id"];"
  concat=$concat"[s"$file_id"]["$file_id":a]concat=n=2:v=0:a=1[ac"$file_id"];"
  mix=$mix"[ac"$file_id"]"
  file_id=$((file_id+1))
done

mix=$mix"amix="$((${#positions[*]}+1))"[aout]"

eval $($command -i $silence_file $inputs -filter_complex "$aevalsrc$concat$mix" -map [aout] $output_file)

Совет: Я предпочитаю бесплатные форматы, такие как ogg (vorbis) или fla c, это более удобный формат для редактирования или преобразования. Вы можете выполнять более сложные операции, и вы можете свободно использовать. Дополнительная информация: https://directory.fsf.org/wiki/Ogg_Vorbis

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...