Форум / Инструменты / Конвертируем видео, используя связку 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", сразу пример:

infile ="video.avi"
tmpfile="video_tmp.mp4"
outfile="video.mp4"
options="-vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256
-partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8
-me_method hex -subq 7 -trellis 1 -refs 5 -bf 3
-flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16
-g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10
-qmax 51 -qdiff 4"

ffmpeg -y -i "$infile" -an -pass 1 -threads 2 $options "$tmpfile"

ffmpeg -y -i "$infile" -acodec libfaac -ar 44100 -ab 96k -pass 2 -threads 2 $options "$tmpfile"

qt-faststart "$tmpfile" "$outfile"

На данном примере, показывается кодирование файла в 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 — конечный файл..

В конечном итоге в терминале должен быть код, примерно такого вида:

/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

Для тех кто использует серверный язык программирования php, выглядит это так:

/usr/local/bin/ffmpeg -i ' . $filename . ' -f mp4 -s ' . $size . ' -b ' . $vbitrate
. 'k -vcodec libx264 -preset medium -acodec libfaac -ar 44100 -ab '
. $abitrate . 'k -threads 1 ' . $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;

Это мой простенький вариант, написанный на скорую руку, на самом деле тут можно и класс написать целый для работы :)

Ну и на последок покажу как я вырезаю кадр из видео файла:

/usr/local/bin/ffmpeg -i $filename -an -ss $halftime -r 1 -vframes 1 -y -s 180x135 -f mjpeg $screen

в данном случае показано, что с центра видео файла (-ss $halftime) будет вырезан один скриншот размером 180x135, если не указывать -s 180x135, будет вырезан скриншот оригинального разрешения .. Можно с легкостью вырезать анимацию и склеить, пример есть на том же сайте — ссылка

И на последок переносим мета данные в начало файла:

/usr/local/bin/qt-faststart $filetmp $filenew

$filetmp — исходный файл после конвертирования,
$filenew — конечный файл с перенесенными мета данными, и вообщем готовый для стримминга файл :)
Указываются полные пути!

На этом все, надеюсь данная статья поможит вам..
Сделал простенький движок по конвертированию видео файлов, смотреть тут — ссылка
ЗЫ: кому нужна помощь, обращайтесь icq — 444886246
zerom1ndСсылка на пост (Смотрели 48328)14.05.12 02:18     Ответить
Ваше имя*
 E-mail* (не публикуется)
 
 
Если пишете о проблеме, то приложите, пожалуйста, ссылку на свой плеер отсюда — Плеер: Файл > Код > Ссылка
Вставка кода — [code][/code] дублировать ответы на e-mail
1
NAFANJA 31.05.12 - 13:45
А есть решения чтобы и сабы вшивались?
2
zerom1nd 01.06.12 - 23:57
Здраствуйте, по поводу вшивания субтитров файл не знаю, имхо только файл портится.. лучше подключать отдельный srt файл, тогда можно их включать и выключать..
подробнее тут — ссылка
3
vitas555 07.07.12 - 04:08
поставил и настроил наш сервер с конвертированием, защитой ссылок, торрентом (с веб интерфейсом)..
4
vanek678 08.07.12 - 04:39
воспользовались услугами автора — качественно настроил сервер и обьяснил что к чему :)
5
abasive 10.07.12 - 20:34
Не подскажете если конвертировать на 3 прохода, то качество улучшиться?
6
zerom1nd 10.07.12 - 20:46
в теории в какой то мере должно быть улучшение, но так я не замечал.. :) обычно один проход делают или два..
сейчас так вообще конвертим в один проход и с пресетом fast-faster и все круто (т.к. исходник HD кач-во от 720p минимум), я заметил что чем быстрее пресет, там битрейт скачит на +-15%, а если медленный пресет — он оптмизирует видео файл своими алгоритмами, в итоге файл как правило весит чудок поменьше на 1–2%

вот пару ссылок: в HD (720p) — ссылка и 720х400 — ссылка кач-во очень сильно зависит от исходника, если рип делаеш из HD 1080 10–20гбайтного файла и двдрипа, разница будет очень ощутимая
7
abasive 10.07.12 - 21:27
А если конвертировать в FLV 3 прохода будет качество лучше чем 2 прохода? если улучшения будет то можно сделать, а так зря не хочеться потратить время еще на один проход,
Первая конечно качественно.
8
zerom1nd 11.07.12 - 00:58
я думаю парится так не стоит.. конвертироватся будет очень очень долго)) а результат будет мизерный, если и будет..
первый файл — в 1800 битрейте + звук 128 ~ 2мбита поток в 720p
9
xxxzonacom 14.12.12 - 20:43
А как конвертировать сразу несколько файлов? а то по очереди это нужно постоянно у компьютера сидеть…

/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
10
zerom1nd 15.02.13 - 00:36
глянь суда — ссылка
11
neeles 08.11.14 - 13:19
Требуется помощь в настройке!
Жду вашего ответа(
vk.com/neeles
design.just@mail.ru
12
winch0 09.01.15 - 12:43
подскажите: а как сделать сохранение нескольких кадров, на определенном периоде и с определенным временным шагом? например, собрать все снимки с периодичностью 5 минут.
Просто один центральный кадр может оказаться не самым удачным, хочется дать возможность пользовательского выбора скриншота.
13
zurkevich 01.04.15 - 05:00
Вопрос автору поста, в версии ffmpeg для win нету libfaac, в версии под linux написано что-то про компиляцию с дополнительными ключами, как автор получил эту версию aac кодека, она платная ?

И второй вопрос для конвертирования видео какие технические требования, и можно ли использовать эти серверы для раздачи контента?
14
zerom1nd 01.04.15 - 05:03
в теме есть мой контакт.
15
WMoo 17.10.15 - 16:28
У тебя нету эл.почта или что нибудь другое кроме ICQ?
16
zerom1nd 17.10.15 - 16:45
skype: zeromind3 email: zerom1nd@yandex.ru
17
ncs 23.12.16 - 18:55
qt-faststart не нужен, просто потеря времени и усложнение процесса
конвертируйте с -movflags faststart
18
popovich 16.01.17 - 16:10
Без собственных проб и ошибок не обойдетесь.
На данный момент рекомендую программу для видеоредактирования Bolide Movie Creator. Ссылка на описание http://movie-creator.com/rus/videomontazh/" rel="nofollow">ссылка</a> простая, несложная программа. Основные принципы качественного видеомонтажа останутся наверное неизменными еще долго.
Сообщить об ошибке на сайте
 Uppod © 2008–2020
Сообщить об ошибке на сайте
Если ошибка относится к плееру, а не сайту, либо Вы хотите получить ответ на вопрос —
лучше написать на форуме