«

»

Окт 14 2015

Распечатать Запись

Создание контента MPEG-DASH с помощью MP4Box и FFmpeg

mp4box_ffmpeg_mpeg-dash Сегодня поговорим о технологии адаптивной потоковой передачи данных Dynamic Adaptive Streaming over HTTP, которую еще часто называют MPEG-DASH.

MPEG-DASH

 Данная технология уже реализована в популярных медиа-серверах Wowza Streaming Engine и Nimble Streamer. MPEG-DASH может использоваться как для Live вещание в режиме реального времени так и для видео по запросу VoD.

 Смысл данной технологии заключается в том, что один основной поток разбивается на несколько потоков с разными битовыми скоростями. Клиент (медиа плеер зрителя) запрашивает тот поток, который имеет наиболее подходящий для него битрейт.

 Сегодня разговор пойдет о том, каким образом можно преобразовать видеофайл в формат MPEG-DASH с несколькими битовыми скоростями. Созданный MPEG-DASH контент можно разместить в директорию обычного веб-сервера Apache и проиграть в видеоплеере, например, в HTML5 Adaptive Streaming Player for MPEG-DASH & HLS.

FFmpeg

 Для подготовки видео потребуются следующие программы:

 ffmpeg – утилита из пакета FFmpeg. FFmpeg — набор свободных библиотек и утилит с открытым исходным кодом, которые позволяют записывать, конвертировать и передавать цифровые аудио- и видеозаписи в различных форматах. Веб-сайт проекта: http://ffmpeg.org.

 Для создания контента в MPEG-DASH формате пакет FFmpeg должен быть скомпилирован с поддержкой кодеков H.264 (libx264) и AAC (libfdk_aac). Этот факт можно узнать с помощью команды ffmpeg -codecs. Команда покажет все поддерживаемые данной сборкой ffmpeg кодеки.

MP4Box

 MP4Box – программа для перепаковки мультимедиа из пакета GPAC. GPAC – кроссплатформенная библиотека, предоставляющая инструменты для упаковки, мультиплексирования и стриминга MPEG-4 контента. Веб-сайт: https://gpac.wp.mines-telecom.fr.

Создание MPEG-DASH контента

Подготовку MPEG-DASH контента можно разбить на два этапа:

 1. Конвертация исходного видео в MPEG-4 формат

 Конвертация потока видео в формат h.264 с пригодными для трансляции по сети настройками:

ffmpeg -i <input_video> -vcodec libx264 -preset slow \
-x264opts fps=24:bitrate=2400:pass=1:vbv-maxrate=4800:vbv-bufsize=9600:keyint=96:min-keyint=96:scenecut=0:no-scenecut \
-vf scale=1280:720 <output_video>.264

  • -i <input_video> – видео, которое необходимо конвертировать;
  • vcodec libx264 – выбор кодека x264 (H.264) для кодирования потока видео;
  • -preset slow – выбор предустановленного набора настроек x264 для кодирования;
  • -x264opts <строка> – ручная настройка кодека (параметры разделяются двоеточием);
  • fps=24 – желаемая частота кадров конвертированного видео;
  • bitrate=2400 – битрейт (kb/s) конвертированного видео;
  • vbv-maxrate=4800 – настройка vbv буфера, значение должно быть в два раза больше установленного битрейта (2400*2=4800);
  • vbv-bufsize=9600 – настройка vbv буфера, значение должно быть в 4 раза больше установленного битрейта (2400*4=9600);
  • keyint=96 – расстояние между I-кадрами, значение = желаемая длина сегмента (в секундах) * частота кадров (4 * 24 = 96);
  • min-keyint=96 – аналогично предыдущему параметру;
  • scenecut=0 – отключение адаптивного алгоритма вставки I-кадров;
  • no-scenecut – аналогично предыдущему;
  • pass=1 – количество проходов кодирования;
  • -vf scale=1280:720 – изменение разрешения видео, можно опустить.

 Конвертация потока аудио из файла:

ffmpeg -i <input_video> \
-acodec libfdk_aac -b:a 128000 <output>.aac

  • -i <input_video> – конвертируемое видео;
  • -acodec libfdk_aac – выбор кодека для кодирования потока аудио;
  • -b:a:0 128000 – выбор битрейта аудио.

 При необходимости можно сконвертировать видео и аудио в несколько файлов с разными битрейтами. После завершения конвертации можно приступать ко второму этапу.

 2. Перепаковка и нарезка файла на сегменты, пригодные для стриминга по сети:

 В первую очередь упаковываем видео и аудио потоки в MP4 контейнер:

MP4Box -add <input_video>.264 <output_video>.mp4
MP4Box -add <input_audio>.aac <output_audio>.mp4

 Опция -add добавляет мультимедиа поток в выходной файл. Существующие плееры не поддерживают мультиплексированные потоки, поэтому необходимо упаковать отдельно каждый поток в MP4 контейнер. Затем MP4-файлы нужно нарезать на сегменты и создать общий MPD манифест со служебной информацией и описанием:

MP4Box -dash 4000 -frag 4000 -rap -segment-name %s/segment_ \
-url-template -out <final_manifest>.mpd \
<input_video_1>.mp4 <…>.mp4 <input_audio_1>.mp4

  • -dash 4000 – данная опция делит видео на сегменты, длина сегмента выражена в миллисекундах;
  • -frag 4000 – аналогично предыдущей, задает максимальную длину сегмента;
  • -rap – сегменты будут начинаться с I-кадра;
  • -segment-name %s/segment_ – задает начало названия каждого сегмента. В данном случае сегменты будут помещены в директории с названием MP4 файла потока. %s – стороковый литерал, заменяемый названием обрабатываемого потока;
  • -url-template – вместо описания всех сегментов в манифесте будет использоваться шаблон, существенно влияет на размер MPD файла.

 В итоге, в рабочей директории появятся папки с сегментами для каждого потока и общий MPD-файл с их описанием.

 В качестве примера приведем подготовку свободно распространяемого видеофайла Sintel.2010.720p.mkv (источник: http://download.blender.org/demo/movies/Sintel.2010.720p.mkv). Перекодируем поток видео из данного файла (битрейт 2000 kb\s, оптимизирован для сегментов длительностью 4 секунды) :

ffmpeg -i Sintel.2010.720p.mkv -vcodec libx264 -preset slow \
-x264opts fps=24:bitrate=2000:pass=1:vbv-maxrate=4000:vbv-bufsize=9000:keyint=96:min-keyint=96:scenecut=0:no-scenecut \
-vf scale=1280:720 sintel_video_b2000k.264

 Перекодируем поток аудио (битрейт 128 kb\s):

ffmpeg -i Sintel.2010.720p.mkv \
-acodec libfdk_aac -b:a 128000 sintel_audio_b128k.aac

 Упакуем в контейнер mp4:

MP4Box -add sintel_video_b2000k.264 sintel_video.mp4
MP4Box -add sintel_audio_b128k.aac sintel_audio.mp4

 Создадим папку и сконвертируем видео в MPEG-DASH формат:

MP4Box -dash 4000 -frag 4000 -rap -segment-name %s/seg_ \
-url-template -out final.mpd sintel_video.mp4 sintel_audio.mp4

 После выполнения команды в рабочей директории будут находиться папки с сегментами и манифест файл с расширением MPD. Копируем все это на веб сервер Apache. Осталось указать видеоплееру в качестве источника воспроизведения сформированный MPD файл, после чего можно будет смотреть видео с использованием новой технологии MPEG-DASH.

MPEG-DASH_MP4box

MPEG-DASH_MP4box_MPD_file

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

Заключение

  Эта статья была написана, отредактирована и опубликована совместно c моими коллегами и специалистами Пестовым Игорем и Петровым Евгением.

 Приглашаю подписаться на новости моей публичной страницы ВКонтакте, ее адрес http://vk.com/itmultimedia . Буду рад видеть Вас в своих подписчиках!

 Всего хорошего! 


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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>