рекомендации

понедельник, 8 июня 2020 г.

Хакинг FFmpeg с помощью Python - часть первая

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.

Комментариев нет:

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