Форум / Рецепты / Конвертация видео
В этой статье вы узнаете, как правильно конвертировать видео для сайта с помощью ffmpeg аналогично Youtube и Vimeo.
Все примеры будут показаны для конечного видеофайла, размеры которого 640x360 (360p)

В ffmpeg все дорожки начинаются с нуля.
Если в вашем видеофайле у вас есть несколько аудиодорожек, первая Русская и вторая Английская (к примеру). Значит в 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)'"

Если необходимо усилить звук, тогда вам нужно указать следующие параметры в dB. Например усилить звук на 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 -max_muxing_queue_size 1024
-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
dankerСсылка на пост (Смотрели 24125)10.01.17 12:20     Ответить
Ваше имя*
 E-mail* (не публикуется)
 
 
Если пишете о проблеме, то приложите, пожалуйста, ссылку на свой плеер отсюда — Плеер: Файл > Код > Ссылка
Вставка кода — [code][/code] дублировать ответы на e-mail
1
seek 16.01.17 - 18:33
В чем преимущество передачи файла в hls?
2
PHPSID 21.02.17 - 10:46
Да он похоже сам не знает. Скопипастил видимо где-то.
3
seek 21.02.17 - 19:25
А сам знаешь?
4
PHPSID 21.02.17 - 19:32
5
seek 21.02.17 - 19:45
Вопрос звучал: "Сам знаешь?, вполне конкретный вопрос.
6
PHPSID 21.02.17 - 19:52
Знаю, но описывать лень — мне за это не заплатишь. В гугле уже есть описания. Гугли и читай.
7
danker 22.02.17 - 10:29
seek запуск видео происходит мгновенно в отличии от mp4.
8
seek 02.03.17 - 11:32
А конфиги nginx не расписал
9
PHPSID 23.01.17 - 21:27
Это для какакой версии FFMPEG -map 0:a:1 ?
У меня не работает, работает только fmpeg -i INPUT -map 0:0 -map 0:N OUTPUT
10
danker 23.01.17 - 22:50
Не могу сказать с какой точно, но начиная с версии 3.x работает.
11
PHPSID 24.01.17 - 23:31
ffmpeg -V что кажет у вас?
12
PHPSID 24.01.17 - 23:34
Да и по дефолту FFMPEG и так берет дефолтную дорожку 0.1. Так что указывать не имеет смыла, если нет необходимости.
13
serzhbsv 28.03.17 - 17:47
уебещный формат потока у меня визде он дропается и глючит в 100 раз хуже ведет себя чем mp4
14
seek 03.03.18 - 11:48
кто нить подружил этот модуль с nginx secure link?
Сообщить об ошибке на сайте
 Uppod © 2008–2020
Сообщить об ошибке на сайте
Если ошибка относится к плееру, а не сайту, либо Вы хотите получить ответ на вопрос —
лучше написать на форуме