Сегодня поговорим о технологии адаптивной потоковой передачи данных 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, пишите. Если вам нужно что-то настроить или получить консультацию по медиа серверам и системам, также можете обращаться ко мне и нашей команде. Также разную полезную информацию на данную тему вы можете найти в нашем Справочнике по видеотрансляциям.
Заключение
Эта статья была написана, отредактирована и опубликована совместно c моими коллегами и специалистами Пестовым Игорем и Петровым Евгением.
Приглашаю подписаться на новости моей публичной страницы ВКонтакте, ее адрес http://vk.com/itmultimedia . Буду рад видеть Вас в своих подписчиках!
Всего хорошего!
Комментарии: