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

    Общий рейтинг статьи: 0 (проголосовало 0 )
    Опубликовано:  [просмотров 535]


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

    Консоль 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 поистине безграничны и о всех ее возможностях вы можете узнать из официальной документации. 

     


    Связанные записи в блоге

    Обсуждение статьи

    Ваш комментарий: