Основы мультимедийных приложений

Дерек Херман
Derek Herman
Джо Медли
Joe Medley

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

Сначала мы опишем базовое использование двух распространенных мультимедийных утилит командной строки: Shaka Packager и FFmpeg , а затем поможем вам быстро установить эти инструменты. Зачем охватывать два приложения? Хотя оба они мощны и полезны сами по себе, ни один из них не дает всего необходимого для подготовки медиа к Интернету. Мы также создали страницы «Преобразование мультимедиа» и «Шифрование мультимедиа» , на которых показано множество более распространенных операций с этими двумя приложениями.

Эти приложения — не единственные варианты, доступные для задач манипулирования файлами, но они являются двумя наиболее распространенными и мощными. Другие варианты включают приложения с графическим интерфейсом Miro , HandBrake и VLC . Существуют также сервисы кодирования/транскодирования, такие как Zencoder , Amazon Elastic Encoder и Google Transcoder API .

Шака Пэкигер

Shaka Packager — это бесплатный SDK для упаковки мультимедиа. Если бы вы использовали на своем сайте медиаплеер, для подготовки файлов вы бы использовали Shaka Packager. Он поддерживает преобразование для двух наиболее распространенных протоколов потокового видео: динамическую адаптивную потоковую передачу через HTTP ( DASH ) или потоковую передачу HTTP Live ( HLS ). Shaka Packager поддерживает ключевые функции безопасности: общее шифрование и управление цифровыми правами Widevine (DRM). Он также может обрабатывать потоковое вещание и видео по запросу.

Несмотря на то, что написано на упаковке, эта утилита предназначена не только для разработчиков C++. Вы можете использовать его как библиотеку для создания мультимедийного программного обеспечения, так и как утилиту командной строки для подготовки мультимедийных файлов для воспроизведения в Интернете. Именно последняя способность нам здесь пригодится. Фактически, для создателей веб-медиа Shaka Packager — единственный способ выполнить некоторые задачи, не тратя денег на дорогие коммерческие приложения.

Вот базовый шаблон команды Shaka Packager:

packager stream_descriptor [stream_descriptor-2 [stream_descriptor-n]] [flags]

Это не совсем то, что вы получите, если наберете packager -help . Этот пример легче рассуждать, и он отражает примеры в документации Shaka Packager . Обратите внимание, что в шаблоне имеется несколько stream_descriptor . Хотя мы этого не показываем, вы можете управлять видео- и аудиопотоками файла отдельно с помощью одной команды.

Сравните этот базовый шаблон с простым использованием, отображающим характеристики файла. В примере мы выстроили эквивалентные части.

packager stream_descriptor [stream_descriptor-n] [flags]

packager input=glocken.mp4                       --dump_stream_info

Команда выводит это:

File "glocken.mp4":
Found 2 stream(s).
Stream [0] type: Video
 codec_string: avc1.640028
 time_scale: 30000
 duration: 300300 (10.0 seconds)
 is_encrypted: false
 codec: H264
 width: 1920
 height: 1080
 pixel_aspect_ratio: 1:1
 trick_play_factor: 0
 nalu_length_size: 4

Stream [1] type: Audio
 codec_string: mp4a.40.2
 time_scale: 48000
 duration: 481280 (10.0 seconds)
 is_encrypted: false
 codec: AAC
 sample_bits: 16
 num_channels: 2
 sampling_frequency: 48000
 language: eng
 seek_preroll_ns: 20833

Найдите характеристики, обсуждаемые в разделе «Основы работы с медиафайлами», и обратите внимание на несколько вещей. Высота и ширина соответствуют формату Full HD, а аудио- и видеокодеки являются одними из предпочтительных кодеков для своих типов контейнеров: AAC для аудио и H264 для видео. Обратите также внимание, что потоки обозначаются числами. Они полезны для операций, которые управляют аудио и видео отдельно.

Обратите внимание, что приведенный выше вывод не показывает битрейт. Несмотря на то, чего не хватает, этот вывод легче читать, поэтому мы используем его всякий раз, когда можем. Когда нам нужна информация, которую Shaka Packager не может получить, например, битрейт, мы используем FFmpeg.

FFmpeg

FFmpeg также является бесплатным приложением для записи, преобразования и потоковой передачи мультимедийных файлов. Его возможности не лучше и не хуже, чем у Shaka Packager. Они просто другие.

Базовый шаблон команды FFmpeg выглядит следующим образом:

ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output

Как и Shaka Packager, это приложение может обрабатывать несколько потоков. Некоторые из его параметров используются в нескольких местах и ​​по-разному управляют выводом файла в зависимости от того, где они находятся в команде. Помните об этом, просматривая вопросы FFmpeg на Stack Overflow и подобных сайтах.

Мы еще раз сравним базовый шаблон с примером отображения характеристик файла.

    ffmpeg [GeneralOptions] [InputFileOptions] -i input        [OutputFileOptions] output

    ffmpeg                                     -i glocken.mp4

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

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'glocken.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.17.100
  Duration: 00:01:47.53, start: 0.000000, bitrate: 10715 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080, 10579 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified

Установка приложений с помощью Docker

Если вы планируете следовать нашим инструкциям и попробовать наши команды, вы можете либо установить необходимые инструменты вручную, либо пойти по простому пути и использовать Docker . Мы предлагаем использовать Docker, потому что это сэкономит вам много времени. Кроме того, мы предоставили инструкции, которые помогут вам быстро настроить.

  1. Начните с создания где-нибудь на вашем компьютере нового каталога с именем media-tools ; вы можете использовать любое имя, которое вам нравится, просто учтите, что следующие инструкции предполагают, что вы используете media-tools в качестве имени каталога.

  2. Создайте docker и media каталог внутри media-tools . Это позволит сохранить ваш media каталог вне контекста сборки. Это важно, поскольку на media хранятся файлы, над которыми мы планируем выполнять операции, и некоторые из них могут быть довольно большими. Размещение Dockerfile непосредственно в media-tools замедлит создание образа, если вы когда-нибудь пересоберете его в будущем — возможно, для изменения установленных версий.

  3. Создайте /media-tools/docker/Dockerfile и добавьте следующие инструкции по сборке:

    FROM google/shaka-packager:release-v2.4.3 as packager
    FROM jrottenberg/ffmpeg:4.3.2-alpine38
    COPY --from=packager /usr/bin /usr/bin
    ENTRYPOINT  ["sh"]
    
  4. Создайте изображение:

    docker build -t media-tools ./docker
    
  5. Запустите изображение как интерактивную оболочку. В Linux:

    docker run -w /media -v ${PWD}/media:/media -it --rm media-tools
    /media #
    

    В Windows:

    docker run -w /media -v %cd%/media:/media -it --rm media-tools
    /media #
    

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

/media # ffmpeg -version
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 6.4.0 (Alpine 6.4.0)
configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-fontconfig --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxcb --enable-libx265 --enable-libxvid --enable-libx264 --enable-nonfree --enable-openssl --enable-libfdk_aac --enable-postproc --enable-small --enable-version3 --enable-libbluray --enable-libzmq --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-libopenjpeg --enable-libkvazaar --enable-libaom --extra-libs=-lpthread --enable-libsrt --enable-libaribb24 --extra-cflags=-I/opt/ffmpeg/include --extra-ldflags=-L/opt/ffmpeg/lib
libavutil      56. 51.100 / 56. 51.100
libavcodec     58. 91.100 / 58. 91.100
libavformat    58. 45.100 / 58. 45.100
libavdevice    58. 10.100 / 58. 10.100
libavfilter     7. 85.100 /  7. 85.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  7.100 /  5.  7.100
libswresample   3.  7.100 /  3.  7.100
libpostproc    55.  7.100 / 55.  7.100
/media # packager --version
packager version v2.4.3-dd9870075f-release

Теперь, когда вы попробовали свои силы в использовании Shaka Packager и FFmpeg, вы можете продолжить изучение основных понятий, а затем — основы потоковой передачи мультимедиа .