Обработка видео. Командная строка
2021-10-21
·
3 мин. для прочтения
Обработка видео. Командная строка
Содержание
1 Инструментарий
1.1 ffmpeg
- Комплексное решение по обработке видео.
- Установка
- Linux
- Gentoo
emerge media-video/ffmpeg
- Gentoo
- Linux
1.2 mkvtoolnix
- Инструменты для создания, изменения и проверки файлов формата Matroska.
- Установка
- Linux
- Gentoo
emerge media-video/mkvtoolnix
- Gentoo
- Linux
2 Задачи
2.1 Перекодирование звуковой дорожки в видеофайле
- Есть видеофайлы (в частности, в формате
mp4
). - При проигрывании на телевизоре нет звука.
- Причина: звуковая дорожка закодирована с частотой дискретизации 48 кГц, а телевизор воспринимает только с частотой дискретизации 44,1 кГц.
- В видеофайле одна видео-дорожка и одна аудио-дорожка.
- Для перекодирования сделан командный файл:
#!/bin/bash # recode-48to44.1 OUTDIR_AUDIO=recoded-audio OUTDIR=recoded mkdir -p ${OUTDIR} mkdir -p ${OUTDIR_AUDIO} for i in *.mp4 do NAME=`basename "${i}" .mp4` ffmpeg -i "${i}" -vn -ar 44100 -c:a libfdk_aac -b:a 192k "${OUTDIR_AUDIO}"/"${NAME}".aac mkvmerge --default-language rus -o "${OUTDIR}"/"${NAME}".mkv --language 1:rus "${i}" --default-track 0:1 "${OUTDIR_AUDIO}"/"${NAME}".aac done
- Сначала мы с помощью
ffmeg
перекодируем аудио-дорожку:-vn
: игнорирование видео-дорожек;-ar 44100
: частота дискретизации 44,1 кГц;-c:a libfdk_aac
: задаём кодек для формата AAC;-b:a 192k
: задаём битрейт.
- С помощью
mkvmerge
сливаем файлы в новый (форматаmkv
):--default-language rus
: задаём язык по умолчанию для дорожек;--language 1:rus
: меняем язык аудио-дорожки в исходном файле;--default-track 0:1
: ставим новую звуковую дорожку дорожкой по умолчанию.
2.2 Объединить несколько файлов mp4
- Дано: набор файлов вида
video1.mp4
, расположенных в алфавитном порядке. - Создадим файл
input.txt
с названиями видео-файлов:for i in $(ls *.mp4 | sort) do echo file \'$(readlink -f "${i}")\' >>input.txt done
- Соединим видеофайлы:
ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4
2.3 Объединить несколько файлов webm
- Можно объединить несколько файлов:
mkvmerge -o output.webm -w file1.webm + file2.webm
2.4 Объединить несколько файлов mkv
- Можно объединить несколько файлов:
mkvmerge --language "1:ru" --title "Title" --generate-chapters when-appending -o output.mkv file1.mkv + file2.mkv
- Кроме объединения, мы задали язык звуковой дорожки (русский) и каждый файл обозначили как главу.
2.5 Замена аудио-дорожки в видеофайле
Заменит аудио-дорожку в видеофайле:
ffmpeg -i video.mp4 -i audio.wav -map 0:v -map 1:a -c:v copy -shortest output.mp4
-map
: выбрать поток;-c:v copy
: потоковое копирование видео (не происходит повторного кодирования видео);- если формат входного аудио совместим с выходным, можно изменить
-c:v copy
на-c copy
для потокового копирования видео и аудио;
- если формат входного аудио совместим с выходным, можно изменить
-shortest
: сделать выходной файл такой же продолжительности, как и самый короткий входной.
2.6 Добавить аудио к видео
Добавим дополнительную аудио-дорожку к видео:
ffmpeg -i video.mkv -i audio.mp3 -map 0 -map 1:a -c:v copy -shortest output.mkv
-map
: выбрать поток;-c:v copy
: потоковое копирование видео (не происходит повторного кодирования видео);- если формат входного аудио совместим с выходным, можно изменить
-c:v copy
на-c copy
для потокового копирования видео и аудио;
- если формат входного аудио совместим с выходным, можно изменить
-shortest
: сделать выходной файл такой же продолжительности, как и самый короткий входной.
2.7 Добавить беззвучную звуковую дорожку
- Можно использовать фильтр
anullsrc
для создания беззвучного аудиопотока. - Фильтр позволяет выбрать желаемое расположение каналов (моно, стерео, 5.1 и т. д.) и частоту дискретизации.
ffmpeg -i video.mp4 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -c:v copy -shortest output.mp4
2.8 Смикшировать два аудиопотока в один
- Используем видео из файла video.mkv.
- Смешаем аудио из файлов video.mkv и audio.m4a с помощью фильтра
amerge
:ffmpeg -i video.mkv -i audio.m4a -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" -c:v copy -ac 2 -shortest output.mkv