Библиотека сайта rus-linux.net
Хакинг FFmpeg с помощью Python - часть первая
Оригинал: Hacking FFmpeg With Python – Part One
Автор: SureSwift Content
Дата публикации: 16 февраля 2017 года
Перевод: А. Кривошей
Дата перевода: март 2018 г.
FFmpeg - отличный мультимедийный фреймворк, который помогает вам обрабатывать аудио и видео файлы. Что я имею в виду? Вы можете легко конвертировать файлы из одного формата в другой, извлекать аудио из видео, сжимать видео и даже извлекать из видео снимки. Есть много интересных вещей, которые вы сможете сделать с помощью этого инструмента. Он написан в основном на языке программирования C и является приложением с открытым исходным кодом.
В этом руководстве вы узнаете, как использовать язык программирования python для взаимодействия с FFmpeg, чтобы автоматизировать некоторые простые задачи.
Настройка python и ffmpeg
Версия python, используемая в этой статье, это Python 2.7.x, поэтому обязательно установите именно ее на свой компьютер, прежде чем идти дальше, поскольку другая версия может привести к возникновению ошибок при запуске кода в интерактивной оболочке python.
Компиляция из исходного кода может сначала показаться сложной, но поскольку она работает практически в любом дистрибутиве Linux, мы будем использовать именно ее, поскольку охватить все менеджеры пакетов Linux не представляется возможным.
Откройте терминал и загрузите правильный пакет python с помощью утилиты wget, как показано ниже:
$ wget --no-check-certificate https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
Примечание: wget - это утилита командной строки, которая используется для загрузки файлов по протоколу http.
После завершения загрузки python 2.7.x нам понадобится tar:
$ tar -xzf Python-2.7.11.tgz
Смените рабочую директорию с помощью следующей команды:
$ cd Python-2.7.11
Чтобы скомпилировать и установить python на вашем компьютере, выполните приведенные ниже команды одну за другой:
$ ./configure $ make $ sudo make install
Перед компиляцией и установкой FFmpeg рекомендуется протестировать новую версию python. Следующая команда запускает python2.7.x на вашей машине, чтобы проверить его:
$ python2.7
Если вы увидели оболочку python, значит установка прошла успешно.
То же самое нужно сделать для FFmpeg. Первый шаг - загрузить исходный код с официального сайта с помощью команды:
$ wget https://github.com/FFmpeg/FFmpeg/archive/master.zip
Далее распаковываем zip-архив:
$ unzip master.zip
Когда наша директория готова, с помощью следующей команды проверяем, что все готово к компиляции:
$ ./configure
Если эта команда отработала без ошибок, теперь вы можете скомпилировать и установить FFmpeg с помощью следующих команд:
$ make $ su -c 'make install'
По завершении установки FFmpeg мы настоятельно рекомендуем выполнить тот же тест, что и с оболочкой python, чтобы убедиться, что инструмент работает правильно.
Для запуска FFmpeg из командной строки можно использовать следующую команду:
$ ffmpeg
Несколько практических примеров использования FFMpeg
Прежде чем перейти к хакингу FFmpeg с помощью Python, рекомендуется рассмотреть некоторые из функций, которые может предложить этот мультимедийный фреймворк.
В комплект поставки FFmpeg входит утилита ffprobe. Его можно использовать для получения информации об аудио- или видеофайлах, например о потоках, формате и т.д.:
$ ffprobe -show_format -show_streams test.mp4
Приведенная выше команда проверяет файл «test.mp4» на теги формата и потоки. Вывод команды очень длинный.
[STREAM] index=1 codec_name=aac codec_long_name=AAC (Advanced Audio Coding) profile=LC codec_type=audio codec_time_base=1/44100 codec_tag_string=mp4a codec_tag=0x6134706d sample_fmt=fltp sample_rate=44100 channels=2 channel_layout=stereo bits_per_sample=0 id=N/A r_frame_rate=0/0 avg_frame_rate=0/0 time_base=1/44100 start_pts=0 start_time=0.000000 duration_ts=9262080 duration=210.024490 bit_rate=95999 max_bit_rate=103664 bits_per_raw_sample=N/A nb_frames=9045 nb_read_frames=N/A nb_read_packets=N/A DISPOSITION:default=1 DISPOSITION:dub=0 DISPOSITION:original=0 DISPOSITION:comment=0 DISPOSITION:lyrics=0 DISPOSITION:karaoke=0 DISPOSITION:forced=0 DISPOSITION:hearing_impaired=0 DISPOSITION:visual_impaired=0 DISPOSITION:clean_effects=0 DISPOSITION:attached_pic=0 DISPOSITION:timed_thumbnails=0 TAG:creation_time=2015-04-23T08:06:29.000000Z TAG:language=eng TAG:handler_name=IsoMedia File Produced by Google, 5-11-2011 [/STREAM] [FORMAT] filename=test.mp4 nb_streams=2 nb_programs=0 format_name=mov,mp4,m4a,3gp,3g2,mj2 format_long_name=QuickTime / MOV start_time=0.000000 duration=210.023333 size=8691199 bit_rate=331056 probe_score=100 TAG:major_brand=mp42 TAG:minor_version=0 TAG:compatible_brands=isommp42 TAG:creation_time=2015-04-23T08:06:28.000000Z [/FORMAT]
Результат выполнения этой команды дает нам много информации о потоках файла. Каждый поток имеет свой индекс. Первый поток имеет индекс 0, но для целей этой статьи отображаются не все потоки, исследованные ffprobe.
Предположим, вы хотите извлечь из музыкального видео только аудиопоток. Идеальная команда - это та, которая копирует аудиопоток без повторного перекодирования:
$ ffmpeg -i video.mp4 -vn -acodec copy audio.aac
Вышеприведенная команда полезна, когда нужно извлечь аудиопоток. Однако есть одна большая проблема. Копирование аудиопотока требует знания правильного расширения, которым в приведенном выше случае является .acc. Здесь ffprobe становится действительно полезным!
Для поиска правильного расширения копируемого аудиофайла достаточно взглянуть на значение codec_name внутри информации об аудиопотоке, которая выводится с помощью утилиты ffprobe:
[STREAM] index=1 codec_name=aac ........ ........ ....... [/STREAM]
Дополнительную информацию о том, как использовать утилиту командной строки ffmpeg, можно получить в
Использование python для взаимодействия с ffmpeg
Python - это язык программирования высокого уровня, который идеально подходит для создания скриптов, автоматизирующих различные операции. Не обязательно быть экспертом в python, чтобы следовать этому руководству или использовать другие коды Python. Даже новичок в кодировании сможет понимать и запускать коды, приведенные в этой статье.
Запустите оболочку python, используя следующую команду:
$ python2.7
В стандартных библиотеках python имеется множество модулей. Тот, который нам нужен, называется subprocess. Чтобы использовать модуль python, сначала его необходимо импортировать, используя следующую команду:
$ import subprocess
Но каково назначение модуля, который мы только что импортировали? Согласно официальной документации python модуль subprocess позволяет вам запускать процесс. Другими словами, вы можете запускать программу через python. Вы также можете подключаться к ее каналам ввода/вывода, и даже получать возвращаемые программой коды.
Следующий пример даст вам лучшее представление о том, как можно использовать модуль subprocess для создания процесса.
p = subprocess.Popen('ls', stderr=subprocess.PIPE, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
Этот код python запускает команду ls, которая выводит список всех файлов внутри каталога. Затем мы получаем вывод данного процесса, связавшись с ним, как показано ниже.
output, _ = p.communicate()
Для печати вывода можно использовать оператор print:
print(_)
Вышеприведенный оператор отображает вывод, возвращаемый в результате подключения к процессу. Если все работает правильно, вы должны получить список файлов и подкаталогов внутри текущего рабочего каталога.
Python также может создать процесс для утилиты ffmpeg, как показано ниже:
cmds = ['/usr/local/bin/ffmpeg'] ffmpeg_p = subprocess.Popen(cmds, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Подключимся к процессу, чтобы получить его вывод:
output, _ = ffmpeg_p.communicate()
Отобразим вывод ffmpeg с помощью оператора print:
print(_)
Вывод оператора print:
ffmpeg version 3.2 Copyright (c) 2000-2016 the FFmpeg developers configuration: --prefix=/usr/local/Cellar/ffmpeg/3.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda libavutil 55. 34.100 / 55. 34.100 libavcodec 57. 64.100 / 57. 64.100 libavformat 57. 56.100 / 57. 56.100 libavdevice 57. 1.100 / 57. 1.100 libavfilter 6. 65.100 / 6. 65.100 libavresample 3. 1. 0 / 3. 1. 0 libswscale 4. 2.100 / 4. 2.100 libswresample 2. 3.100 / 2. 3.100 libpostproc 54. 1.100 / 54. 1.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... Use -h to get full help or, even better, run 'man ffmpeg'
Это то же самое, что и запуск команды ffmpeg из консоли, но теперь для выполнения этой работы мы используем python.
Получение потоков и формата видеофайла с помощью python так же не представляет сложностей:
cmds = ['/usr/local/bin/ffprobe', '-show_format', '-show_streams', 'test.mp4']
Как вы можете видеть, мы храним команды в списке python. Список задается с помощью квадратных скобок.
Затем открываем новый процесс и передаем ему cmds в качестве аргумента, как показано ниже:
ffprobe_p = subprocess.Popen(cmds, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Чтобы получить потоки и формат видеофайла, нужно использовать метод communicate, как в предыдущих примерах.
output, _ = ffprobe_p.communicate()
Затем с помощью оператора print выводится информация о потоках и формате файла.
Заключение
FFmpeg - это инструмент, используемый не только такими гиками, как мы! Мультимедийная индустрия также его использует. Сейчас много шума вокруг Youtube, использующего его для кодирования видео. Запоминать весь список команд, которые этот фреймворк может предложить, не нужно, но это идеальный случай, когда язык скриптов, такой как Python, становится действительно полезным в связке с FFmpeg.
Интересное только начинается, ждите продолжения!