Конвертация видео и настройка сервера (HLS, DASH и MP4)Данный материал прислан пользователем, мы не проверяли его достоверность и просим извинить за возможные неточности У нас есть MP4 файл, мы хотим чтобы он отдавался по типу HLS, DASH и MP4. Для настольных систем DASH или HLS, для смарт-тв, телефонов и других устройств MP4. Есть два способа. Первый это конвертировать из одного файла в два формата, MP4 и затем из него же в HLS. Соответственно место на нашем жестком диске уменьшится в двое. Первый вариант нас не устраивает. Пойдем вторым. И так. Вот как мы сделаем. Мы сконвертируем файл в MP4 и будет отдавать его посредством DASH/HLS (transmuxing) и MP4 (progressive). Но давайте по порядку. Как правильно конвертировать видео для сайта с помощью ffmpeg аналогично Vimeo и Youtube. Разберем подробно детали. Все примеры будут показаны для конечного видео файла, размеры которого 640x360 (360p) В ffmpeg все дорожки начинаются с нуля. Например в вашем видео у вас есть две аудиодорожки, 1 и 2. Но в ffmpeg они будут числиться как 0 и 1. То-есть если вы хотите конвертировать видео со второй аудиодорожкой то вам нужно указать ее как 1 (-map 0:a:1). А если вам нужна первая аудиодорожка то соответственно выставить 0 (-map 0:a:0). Но как узнать какая из них первая и какая вторая? Открываем видео через vlc, нажимаем вверху на Аудио, затем Аудиодорожка и тот порядок в котором они расположены в vlc, тот и будет действителен для ffmpeg. Это касается и других дорожек, включая видео и субтитры. Файл который должен быть сконвертирован -i /home/www/video/input.mkv Видеодорожка как известно у нас одна (смотреть выше) -map 0:v:0 Аудиодорожка начинается с нуля (смотреть выше) -map 0:a:0 Видео кодек для mp4 (обязательно). Указывайте так, как показано ниже, ничего не удаляя. -vcodec libx264 -pix_fmt yuv420p Синхронизация видео (обязательно). Для web нужно указывать именно 1. Другие варианты будут работать не со всеми видео файлами. -vsync 1 Синхронизация аудио (обязательно) -async 1 Цвет картинки BT.709 -color_primaries 1 -color_trc 1 -colorspace 1 Правильно масштабируем видео. Ниже указан размер который на выходе будет 640 (ширина) на 360 (высота). scale="’w=if(gt(a,16/9),640,-2):h=if(gt(a,16/9),-2,360)’" указывает на то, что видео будет масштабироваться так чтобы картинка и лица не растягивались, то-есть сохранять пропорции. Например. У вас есть видео файл, размеры которого 1280x512 то на выходе вы получите файл с размерами 640x272. И это правильный подход. -vf scale="'w=if(gt(a,16/9),640,-2):h=if(gt(a,16/9),-2,360)'" Качество картинки. Указывайте 20 -crf 20 Совместимость с телефонами и Смарт-ТВ. -preset medium -profile:v high -level 3.1 Максимальный битрейт видео 800k -maxrate 800k -bufsize 1200k Аудио кодек. Указывайте aac или libfdk_aac. Мы рекомендуем использовать aac. Подробнее можно почитать на странице ffmpeg: https://trac.ffmpeg.org/wiki/Encode/AAC (английский) Если вы все таки выберите libfdk_aac, то ffmpeg должен быть скомпилирован должным образом: https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#libfdk-aac -acodec aac Аудиодорожку делаем стерео -ac 2 Битрейт аудио -ab 128k Конечный файл будет mp4 -f mp4 Обязательный параметр для воспроизведения видео на сайте. Если вы не укажите эти параметры то ваше видео не сможет воспроизводится пока файл не скачается целиком. А нам этого не надо. Поэтому обязательно укажите эти параметры. -movflags +faststart Последнее что нужно указать, так это то, куда сохранится конечный видео файл. Укажите свой путь. /home/www/video/output.mp4 Примеры размеров и битрейтов видео: 360p: 640x360 -vf scale="'w=if(gt(a,16/9),640,-2):h=if(gt(a,16/9),-2,360)'" -ab 128k -maxrate 800k -bufsize 1200k 480p: 854x480 -vf scale="'w=if(gt(a,16/9),854,-2):h=if(gt(a,16/9),-2,480)'" -ab 128k -maxrate 1200k -bufsize 4200k 720p: 1280x720 -vf scale="'w=if(gt(a,16/9),1280,-2):h=if(gt(a,16/9),-2,720)'" -ab 196k -maxrate 2000k -bufsize 6400k 1080p: 1920x1080 -vf scale="'w=if(gt(a,16/9),1920,-2):h=if(gt(a,16/9),-2,1080)'" -ab 320k -maxrate 2800k -bufsize 8200k Устранить чересстрочность и масштабировать видео (разделять запятой). Параметр yadif должен стоять первым. -vf yadif,scale="'w=if(gt(a,16/9),640,-2):h=if(gt(a,16/9),-2,360)'" Усиление звука начиная от 1dB. Например усилить звук на 5dB -af "volume=5dB" Полная команда: ffmpeg -y -i /home/www/video/input.mkv -map_metadata -1 -map 0:v:0 -map 0:a:0 -vcodec libx264 -pix_fmt yuv420p -vsync 1 -async 1 -color_primaries 1 -color_trc 1 -colorspace 1 -vf scale="'w=if(gt(a,16/9),640,-2):h=if(gt(a,16/9),-2,360)'" -crf 20 -preset medium -profile:v high -level 3.1 -maxrate 800k -bufsize 1200k -acodec aac -ac 2 -ab 128k -f mp4 -movflags +faststart /home/www/video/output.mp4Наш файл mp4 готов. Можно приступить к настройке сервера и софта. Сервер: Ubuntu 14.04 Скачиваем и распаковываем следующий софт: Веб сервер nginx: https://nginx.org/download/nginx-1.12.1.tar.gz Модуль для hls и mp4: https://github.com/kaltura/nginx-vod-module/archive/1.19.zip Модуль для статистики: https://github.com/vozlt/nginx-module-vts/archive/v0.1.3.zip Скрипт для запуска nginx: https://yadi.sk/d/qbm8J7Iy389iWA Файл с настройками nginx: https://yadi.sk/i/V3MTS3u3389yvRЗаливаем на сервер к примеру в каталог /home/www/nginx. Пути соответственно должны получится такими: /home/www/nginx/nginx-1.12.1 /home/www/nginx/nginx-vod-module-1.19 /home/www/nginx/nginx-module-vts-0.1.3 /home/www/nginx/nginx_source /home/www/nginx/nginx.confЗаходим на сервер через ssh, в каталог /home/www/nginx/nginx-1.12.1 и выполняем следующие команды:
chmod +x configureСофт установлен. Каталог в котором будут хранится наши видео файлы: /home/www/video/ Запускаем nginx командой: service nginx restart Все готово. Теперь поместим наш видео файл в каталог /home/www/video/. Полный путь которого получится примерно таким: /home/www/video/output.mp4 mp4 доступен по адресу: localhost/mp4/output.mp4 hls доступен по адресу: localhost/hls/output.mp4/index.m3u8 dash доступен по адресу: localhost/dash/output.mp4/manifest.mpd статистика доступна по адресу: localhost/status/ ОБНОВЛЕНИЕ 14.09.17 Установите на сервере ffmpeg и mediainfo. Скачайте php скрипт: https://yadi.sk/d/RLaFDg023MtPqN Откройте файл convert.php и измените следующие настройки $FFMPEG_PATH = "/usr/bin/ffmpeg"; Путь до Мediainfo $MEDIAINFO_PATH = "/usr/bin/mediainfo"; Видео файл который нужно сконвертировать $input = "/home/www/Semnadtsat-mgnovenij-vesny-1-serija.mkv"; Качество видео 360, 480, 720, 1080 $quality = 360; Аудиодорожка $audio_stream = 1; Увеличить звук на N dB $audio_volume = 0; Субтитры. Будут вшиты в видео. Если не нужно, то просто оставьте как есть — 0 $subtitles_stream = 0; Обрезать видео, начиная с N секунд. Если нужно обрезать первые 2 минуты видео, то просто укажите 120 $start_at = 0; Запустите скрипт на сервере через ssh, командой: php /home/www/convert.php Дождитесь пока файл сконвертируется. |