Обработка видео. Командная строка

2021-10-21 · 3 мин. для прочтения

Обработка видео. Командная строка

Содержание

1 Инструментарий

1.1 ffmpeg

  • Комплексное решение по обработке видео.
  • Установка
    • Linux
      • Gentoo
        emerge media-video/ffmpeg
        

1.2 mkvtoolnix

  • Инструменты для создания, изменения и проверки файлов формата Matroska.
  • Установка
    • Linux
      • Gentoo
        emerge media-video/mkvtoolnix
        

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
    
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Мои научные интересы включают физику, администрирование Unix и сетей.