Обработка видео-файлов в консоли Linux

HELP-ME-24.COM (Freelance Team), Черноусов Антон

Недавно я принял участие в небольшом стартапе и моей задачей являлась разработка скрипта для обработки двадцати тысяч небольших видео-фрагментов представляющих собой вступительные ролики к видео-играм.

Консоль Linux предоставляет практически неограниченные возможности пакетной обработки информации и это так же справедливо и для пакетной обработки видео-файлов. Сегодня мы рассмотрим несколько практических примеров пакетной обработки группы видео-файлов.

Как я уже говорил, мне требовалось провести пакетную обработку достаточно большого количества однотипных видео-фрагментов. Собственно последовательная обработка файлов в каталоге проблемы не представляет и может быть реализована простым скриптом:

#!/bin/sh

ls /data/game-store/ | while read line;
do
echo "Build Video: $line"
...
done

Скрипт получает список файлов в каталоге и передает его в цикл последовательного перебора элементов, где текущий элемент помещается в переменную $line. В дальнейшем, эта переменная и используется для передачи командам обработки видео.

В большинстве случаев, для обработки видео в Linux, используется утилита ffmpeg и даже большая часть видео-редакторов  генерирует скрипты для последовательного применения команд ffmpeg.

Обработка видео в консоли Linux

 

Конвертация видео-файлов в Linux при помощи FFMPEG

FFMPEG позволяет осуществить быструю конвертацию видео-файлов из любого поддерживаемого формата в другой (и он естественно так же должен поддерживаться), а получить список поддерживаемых кодеков можно командой:

$ ffmpeg -codecs

Получить сведения о формате исходного видео-ролика можно командой:

$ ffmpeg -i ./video-store/0a31a.mov

В моем случае я получил следующие сведения:

Metadata:
major_brand : qt
minor_version : 537331968
compatible_brands: qt
creation_time : 2017-06-25 03:05:37
Duration: 00:00:29.64, start: 0.000000, bitrate: 9251 kb/s
Stream #0:0(eng): Video: cscd (CSCD / 0x44435343), bgr24, 512x448,
8467 kb/s, 60.12 fps, 60 tbr, 48k tbn, 48k tbc (default)

Переданные мне на обработку видеоролики имеют довольно большой объем (около 20 мб на минутный видео-фрагмент) и первым делом требовалось их преобразовать.

В большинстве случаев формат исходного файла определяется автоматически и требуется лишь задать формат результирующего файла, причем достаточно лишь указать его расширение, например:

$ ffmpeg -i ./small.flv ./small.mp4

Обратите внимание, что входящая в штатную поставку Ubuntu Linux версия FFMPEG является устаревшей (ffmpeg version 2.8.11) и может некорректно обрабатывать современные форматы видео-файлов. В результате обработки вы можете получить файл нулевого объема и ошибку:

The encoder 'aac' is experimental but experimental codecs are not enabled,
add '-strict -2' if you want to use it.

Для обновления версии FFMPEG выполните в консоли следующие команды (текущая версия на официальном сайте 3.3.2):

# add-apt-repository ppa:jonathonf/ffmpeg-3
# apt update && sudo apt upgrade

По завершении обновления проверьте текущую версию установленного пакета:

$ ffmpeg -v
ffmpeg version 3.3.2-1~16.04.york1 Copyright (c) 2000-2017 the FFmpeg developers

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

Обработка видео-файла без потери качества

Как я уже говорил выше, вы можете задать формат и кодек результирующего файла добавив следующую опцию:

$ ffmpeg -i ./source.mov -c:v vp9 -c:a libvorbis ./output.vp9

Наиболее распространенным кодеком является H.264 именно его я и использовал, а команда преобразования файла приобрела вид:

$ ffmpeg -i ./source -c:v libx264 -c:a libvorbis ./dest.mp4

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

-qscale 0

Использование опции qscale несколько увеличит объем файла.

Использование аппаратного ускорения при конвертации файлов

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

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

$ ffmpeg -y -hwaccel cuvid -i ./source -c:v h264_qsv -c:a libvorbis -qscale 0 \
./source.mp4

Изменить размер видео-файла (масштабирование изображения)

Для преобразования мне предоставили файлы самого разного разрешения и их требовалось преобразовать таким образом, чтобы их ширина стала 250 px (предварительный просмотр на экране выбора).

За реализацию функционала масштабирования отвечает опция -s, которая принимает два параметра ширина и высота результирующего видеофайла. Вы можете добавить параметр -s 250x250 и изображение будет масштабировано до 250 пикселей по вертикали и 250 по горизонтали.

Это наиболее простая реализация преобразования размеров изображения и она отлично работает если вам заранее известно, что соотношение размеров сторон у всех файлов будет одинаковым, но в моем случае потребовалось использовать другую опцию которая выровняла ширину изображений сохранив пропорцию высоты к ширине изображения:

-vf scale=250:-1

Вырезать прямоугольную часть из видео-файла

Помимо базовых операций преобразования вы можете вырезать прямоугольную область из изображения. Для этого служит опция -filter:v "crop=800:600:113:79", а полностью команда извлечения части изображения будет выглядеть следующим образом:

$ ffmpeg -i ./screen_video_record.mp4 -filter:v "crop=800:600:113:79" \
./crop-screen_video_record.mp4

Представленный пример предназначен для того, чтобы вырезать из видео, прямоугольный фрагмент размером 800 на 600 смещенный на 113 и 79 пикселей от верхнего левого края.

Изменить fps (частота кадров в секунду) видеофайла

$ ffmpeg -i ./crop-480-screen_video_record.mp4 -qscale 0 -r 30 -y \
./crop-480-30fps-screen_video_record.mp4

Новая частота кадров определяется параметром -r (в нашем случае преобразовали в 30 кадров в секунду).

Извлечение изображения из видеофайла

И напоследок мне необходимо извлечь одно изображение которое будет выступать превью к видео, но не с первого кадра видео-файла, а со смещением в 10 секунд.

Для этого используется следующая консольная команда:

$ ffmpeg -i ./source.mp4 -ss 00:00:10 -vframes 1 ./thumb.jpg

  • -ss 00:00:10 - смещение в 10 секунд
  • -vframes 1 - один снимок

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

 

Оставьте комментарий

Вы должны быть вошедший в чтобы отправить комментарий