← Форум / Инструменты / Конвертируем видео, используя связку ffmpeg + libx264 + qt-faststart. Сравнение и использование пресетов libx264.
В прошлой статье — ссылка, я описывал процедуру установки на сервере HTTP стримминга и необходимых пакетов для кодирования видео — ffmpeg + libx264 + qt-faststart..
Теперь рассмотрим сам процесс кодировки видео файлов.
Итак немного пояснения:
1. Мы используем формат MP4.
2. ffmpeg — пакет, который выполняет всю работу, у него есть свои параметры, которые можно посмотреть тут — ссылка Могу сказать что это мощный инструмент работы с видео файлами, кроме обычных операций, может делать водные знаки, вырезать кадры и анимацию из видео файлах, получать информацию о файле, работать со звуковыми дорожками и т.д. У него есть альтернатива — mencoder, сразу скажу что я его не использовал, т.к. все нужные операции прекрасно выполняет ffmpeg.
3. libx264 — собственно тот кодек, который поддерживает HTTP стримминг на сервере, один из лучших в плане кач-во/битрейт.. У него есть свои "пресеты", о которых будет речь дальше..
4. qt-faststart — идет как плагин к ffmpeg’y, его назначение — переносит мета данные в начало файла (чтобы был "быстрый" стримминг без предзагрузки всего файла)
Я выбрал формат файлов — mp4, его плюсом является то, что можно файл кодировать в несколько прогонов, тем самым повышая качество и уменьшая битрейт видео (но как вы понимаете увеличивается в разы время кодирования).. Чтобы кодировать видео в 2 захода, первый раз пишется параметр "-pass 1" при втором заходе пишется "-pass 2", сразу пример:
На данном примере, показывается кодирование файла в 2 прохода и после qt-faststart переносит мета данные вначало файла..
Я предлогаю воспользоватся пресетами libx264 (все опции кодировки вам писать не нужно, надо лиш выбрать один из вариантов). Они меняются в зависимости от кач-ва и скорости кодирования видео файла, т.е. чем лучше кач-во тем дольше по времени кодируется файл и наооборот. Ниже на диаграмме видны названия пресетов и сравнение их по скорости конвертирования:
Собственно по их названию можно понять какой пресет чему соответствует, распишу некоторые в порядке уменьшения скорости кодирования/повышения качества видео:
-ultrafast
-superfast
-veryfast
-faster
-fast
-normal
-medium
и далее в обратно порядке идут пресеты из серии "slow"
Многие забугорные сайты рекомендуют использовать пресет "slower" как лучшее соотношение кач-ва/битрейта.. я же кодирую у себя на VPS’e в пресете "medium", кач-во получается хорошее..
По поводу ultrafast пресета могу сказать что кодирует очень быстро, но кач-во прямо видно что ужасное.. вот уже начиная с superfast кач-во вполне хорошее. Я даже толком не вижу разницу в качестве между veryfast-faster-fast-normal-medium пресетами :)
И на конец как пользоватся этими пресетами:
/usr/local/bin/ffmpeg -i $filename -f mp4 -s $resolution -b $vbitrate k -vcodec libx264 -preset medium -acodec libfaac -ar 44100 -ab $abitrate k -threads 1 $filetmp
/usr/local/bin/ffmpeg — путь до ffmpeg в системе, иногда получается писать просто ffmpeg, но во избежании ошибок, рекомендую писать полный путь..
$filename — название исходного файла
-f — формат файла
-s — разрешение файла
-b $vbitrate k — битрейт файла, $vbitrate — указывается значение в цифрах, k — означет что значения в кбитах
libx264 -preset medium — тут должно быть понятно, выбираем один из пресетов..
-acodec libfaac -ar 44100 -ab $abitrate k — сначала выбирается аудиокодек, в данном случае libfaac, далее частота звука, битрейт, k — означет что значения в кбитах
-threads 1 — разрешает ffmpeg’y использовать только одно ядро процессора..
$filetmp — конечный файл..
В конечном итоге в терминале должен быть код, примерно такого вида:
Если знаете php, то разобратся не трудно, я же распишу откуда взяты переменные..
дело в том что в php есть хороший класс для работы с ffmpeg, php5-ffmpeg, с помощью которого можно получить любую информацию о файле: длительность ролика, битрейт, кол-во кадров и многое другое.. подробнее можно ознакомится на сайте — ссылка
Распишу, переменные, которые использовались в строке выше:
$movie = new ffmpeg_movie($filename) // в $filename передаем видео файл, который собираемся кодировать (полный путь до него)
$time = $movie->getDuration(); // продолжительность видеозаписи
$halftime = gmdate("H:i:s", $time / 2); // делим её на 2
$x = $movie->getFrameWidth(); // ширина кадра
$y = $movie->getFrameHeight(); // высота кадра
$audio = $movie->hasAudio(); // наличие звука: 1 - есть, 0 - нету
$vbit = round($movie->getVideoBitRate() / 1024); - битрейт видео в кбитах
$abit = round($movie->getAudioBitRate() / 1024); - битрейт звука в кбитах
$size = round($x / $y, 1) > '1.6' ? '640x360' : '640x480'; // далее идут проверки на разрешении экрана
if ($x < 640 || $y < 480)
$size = $x . 'x' . $y;
Это мой простенький вариант, написанный на скорую руку, на самом деле тут можно и класс написать целый для работы :)
Ну и на последок покажу как я вырезаю кадр из видео файла:
в данном случае показано, что с центра видео файла (-ss $halftime) будет вырезан один скриншот размером 180x135, если не указывать -s 180x135, будет вырезан скриншот оригинального разрешения .. Можно с легкостью вырезать анимацию и склеить, пример есть на том же сайте — ссылка
И на последок переносим мета данные в начало файла:
/usr/local/bin/qt-faststart $filetmp $filenew
$filetmp — исходный файл после конвертирования,
$filenew — конечный файл с перенесенными мета данными, и вообщем готовый для стримминга файл :)
Указываются полные пути!
На этом все, надеюсь данная статья поможит вам..
Сделал простенький движок по конвертированию видео файлов, смотреть тут — ссылка
ЗЫ: кому нужна помощь, обращайтесь icq — 444886246
Здраствуйте, по поводу вшивания субтитров файл не знаю, имхо только файл портится.. лучше подключать отдельный srt файл, тогда можно их включать и выключать..
подробнее тут ссылка
в теории в какой то мере должно быть улучшение, но так я не замечал.. :) обычно один проход делают или два..
сейчас так вообще конвертим в один проход и с пресетом fast-faster и все круто (т.к. исходник HD кач-во от 720p минимум), я заметил что чем быстрее пресет, там битрейт скачит на +-15%, а если медленный пресет он оптмизирует видео файл своими алгоритмами, в итоге файл как правило весит чудок поменьше на 12%
вот пару ссылок: в HD (720p) ссылка и 720х400 ссылка кач-во очень сильно зависит от исходника, если рип делаеш из HD 1080 1020гбайтного файла и двдрипа, разница будет очень ощутимая
А если конвертировать в FLV 3 прохода будет качество лучше чем 2 прохода? если улучшения будет то можно сделать, а так зря не хочеться потратить время еще на один проход,
Первая конечно качественно.
я думаю парится так не стоит.. конвертироватся будет очень очень долго)) а результат будет мизерный, если и будет..
первый файл в 1800 битрейте + звук 128 ~ 2мбита поток в 720p
подскажите: а как сделать сохранение нескольких кадров, на определенном периоде и с определенным временным шагом? например, собрать все снимки с периодичностью 5 минут.
Просто один центральный кадр может оказаться не самым удачным, хочется дать возможность пользовательского выбора скриншота.
Вопрос автору поста, в версии ffmpeg для win нету libfaac, в версии под linux написано что-то про компиляцию с дополнительными ключами, как автор получил эту версию aac кодека, она платная ?
И второй вопрос для конвертирования видео какие технические требования, и можно ли использовать эти серверы для раздачи контента?
Без собственных проб и ошибок не обойдетесь.
На данный момент рекомендую программу для видеоредактирования Bolide Movie Creator. Ссылка на описание http://movie-creator.com/rus/videomontazh/" rel="nofollow">ссылка</a> простая, несложная программа. Основные принципы качественного видеомонтажа останутся наверное неизменными еще долго.
подробнее тут
сейчас так вообще конвертим в один проход и с пресетом fast-faster и все круто (т.к. исходник HD кач-во от 720p минимум), я заметил что чем быстрее пресет, там битрейт скачит на +-15%, а если медленный пресет он оптмизирует видео файл своими алгоритмами, в итоге файл как правило весит чудок поменьше на 12%
вот пару ссылок: в HD (720p)
Первая конечно качественно.
первый файл в 1800 битрейте + звук 128 ~ 2мбита поток в 720p
/usr/local/bin/ffmpeg -i /home/input.avi -f mp4 -s 640x480 -b 512k -vcodec libx264 -preset medium -acodec libfaac -ar 44100 -ab 96k -threads 1 /home/output.mp4
Жду вашего ответа(
vk.com/neeles
design.just@mail.ru
Просто один центральный кадр может оказаться не самым удачным, хочется дать возможность пользовательского выбора скриншота.
И второй вопрос для конвертирования видео какие технические требования, и можно ли использовать эти серверы для раздачи контента?
конвертируйте с -movflags faststart
На данный момент рекомендую программу для видеоредактирования Bolide Movie Creator. Ссылка на описание http://movie-creator.com/rus/videomontazh/" rel="nofollow">ссылка</a> простая, несложная программа. Основные принципы качественного видеомонтажа останутся наверное неизменными еще долго.