Заметки · 14.05.2022

Аудио туда, видео сюда

На сей раз будем вырезать, заменять и извлекать звуковую дорожку из видеофайла. Обращаю Ваше внимание, что к видео лучше всего «пришпандоривать» звук в форматах aac или mp3. Благо, что ffmpeg умеет перекодировать форматы на лету.

И не забывайте о том, что в именах обрабатываемых файлов не допускается наличие пробелов!

Извлекаем звук из видеофайла

В видеофайле звук может быть абсолютно в любом формате и чтобы не заморачиваться с получением информации об аудиодорожке — можно на лету конвертировать звук в mp3:

ffmpeg -i video.format -vn -ar 44100 -ac 2 -ab 320k -f mp3 sound.mp3

Адаптация команды для PowerShell будет такой:

$cmd = "-i video.format -vn -ar 44100 -ac 2 -ab 320k -f mp3 sound.mp3"   
Start-Process -FilePath ffmpeg.exe -ArgumentList $cmd -Wait -NoNewWindow

Битрейт здесь я поставил в 320 kbps, что является максимальной величиной. Вы можете опустить это значение до приемлемого в условиях Вашей задачи.

По итогам отработки команды в папке с видеофайлом video.format появится файл sound.mp3.

Вырезаем звук из видеофайла

Здесь вообще всё просто:

ffmpeg -i video.format -c:v copy -an video_mute.format

Данной командой мы указываем, что видео в контейнере требуется только скопировать без перекодирования, а наличие аудиодорожки в целевом файле вовсе игнорировать.

Для PowerShell конструкция будет иметь вот такой вид:

$cmd = "-i video.format -c:v copy -an video_mute.format"   
Start-Process -FilePath ffmpeg.exe -ArgumentList $cmd -Wait -NoNewWindow

В папке с исходным файлом появится файл video_mute.format, в котором не будет аудиодорожки. Советую соблюдать совместимость контейнеров, если не стоит иной задачи.

Замена аудиодорожки в видеофайле

Обращаю Ваше пристальное внимание, что нельзя заменить аудиодорожку в файле, если в нём уже имеется звуковая дорожка, поэтому сначала надо создать файл без звука вообще.

Замена звука в контексте ffmpeg будет выглядеть вот так:

ffmpeg -i video_mute.format -i sound.mp3 -c copy videosound.format

Если нужно прицепить к видеофайлу звук в сыром формате, например wav:

ffmpeg -i video_mute.format -i sound.wav -c:v copy videosound.format

Данная команда скопирует видеопоток в контейнер, а аудиодорожку сконвертирует в подходящий формат сообразно контейнеру.

Для PowerShell:

$cmd = "-i video_mute.format -i sound.mp3 -c copy videosound.format"   
Start-Process -FilePath ffmpeg.exe -ArgumentList $cmd -Wait -NoNewWindow

И соответственно:

$cmd = "-i video_mute.format -i sound.wav -c:v copy videosound.format"   
Start-Process -FilePath ffmpeg.exe -ArgumentList $cmd -Wait -NoNewWindow

В рамках инструментария PowerShell вполне можно автоматизировать замену аудиодорожки и сократить конструкцию до одной функции с удалением промежуточного файла, но это уже тема для совсем другого поста…