На сей раз будем вырезать, заменять и извлекать звуковую дорожку из видеофайла. Обращаю Ваше внимание, что к видео лучше всего «пришпандоривать» звук в форматах 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 вполне можно автоматизировать замену аудиодорожки и сократить конструкцию до одной функции с удалением промежуточного файла, но это уже тема для совсем другого поста…