MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Настройка качества кодирования в FFmpeg: переменный и постоянный битрейт для Mpeg4
30.10.2016
20:31
Автор: Xintrea
Текстовые метки: ffmpeg, mpeg4, качество, битрейт, vbr, variable bitrate, constant bitrate
Раздел: Компьютер - Linux - Видео - FFmpeg

Стандарт MPEG-4 итерации 2, известный так же как MPEG-4, Xvid и DivX - это видео-кодек, который широко использовался до распространения кодека H.264. Конвертор FFmpeg имеет два энкодера для вывода видео в формате MPEG-4. Это внешнее кодирование с помощью библиотеки libxvid:


ffmpeg -i input.avi -c:v libxvid output.avi


и встроенный энкодер Mpeg-4:


ffmpeg -i input.avi -c:v mpeg4 -vtag xvid output.avi


Встроенный энкодер имеет то преимущество, что не требует дополнительных библиотек. Оба энкодера обеспечивают выходной поток примерно одинакового качества, но для более низких битрейтов (например, для 1000 Кби/сек для формата 720p), libxvid будет давать более лучшее качество чем mpeg4.


По-умолчанию, четырехбайтовая сигнатура стандарта FourCC, прописываемая в файл формата Mpeg4, будет FMP4. Если необходимо прописать другой код FourCC, можно воспользоваться опцией -vtag. Например, опция -vtag xvid заставит FFmpeg сохранить в сигнатуре FourCC формат XVID, а не формат по-умолчанию.


Примечание: в этом руководстве описывается использование контейнера AVI для содержимого формата Xvid, так как такая связка поддерживается всеми, даже достаточно старыми устройствами. Для современных устройств лучше подходит формат H.264 для видео, и AAC для аудио.



Настройка переменного битрейта через опцию qscale


Вы можете установить уровень качества генерируемого видеопотока через опцию -qscale:v n (данная опция имеет так же сокращенное обозначение -q:v n), где n - это число от 1 до 31. Значение 1 обозначает лучшее качество и более большую длину результирующего файла, а 31 - более низкое качество и, соответственно, более малый размер файла. Эта опция задает режим с переменным битрейтом, и примерно аналогична опции -qp (постоянный параметр квантизации QP) для кодека x264. Использование переменного битрейта является предпочтительным способом, по сравнению с постоянным (константным) битрейтом.


Так же, можно указывать уровень качества для аудио-потока с помощью опции -qscale:a n (или, используя сокращение, -q:a n). Значение n меняется в зависимости от используемого энкодера. Для кодирования звука в MP3 нужно указывать значение, воспринимаемое енкодером libmp3lame. Данные значения можно найти в руководстве MP3 Encoding Guide.


Пример:


ffmpeg -i input.avi -c:v mpeg4 -vtag xvid -qscale:v 3 -c:a libmp3lame -qscale:a 4 output.avi


Необходимость в использовании максимального качества -qscale:v 1 возникает достаточно редко. Обычно максимальное качество выствляется при подготовке видео для использования в программах редактирования видео (так называемое монтажное видео), но для такого видео лучше использовать монтажный кодек, например mjpeg (дает наилучшее соотношение размер/качество) или Huffyuv (сжатие без потерь с большим итоговым размером данных). Так же следует обратить внимание, что итоговое видео, полученное через libxvid займет гораздо больше места, чем при использовании встроенного в FFmpeg енкодера mpeg4.



Постоянный битрейт


Также, в FFmpeg можно настроить постоянный (константный) битрей через опцию -b:v. Постоянный битрейт лучше всего использовать при друхпроходном кодировании. Вот адаптированный пример из руководства пользователя x264: ваше видео имеет продолжительность 10 минут (т. е. 600 секунд) и требуется получить размер выходного файла равный 50Мб. Тогда битрейт равен размеру файла деленному на продолжительность файла:


(50 MB * 8192) / 600 seconds = ~683 kilobits/s total bitrate


где 8192 - это конвертация Мб в килобиты. Учитывая, что поток аудио примерно 128 Кбит/сек, имеем:


683k - 128k (desired audio bitrate) = 555k video bitrate



Двухпроходное кодирование


Пример использования кодирования в два прохода для FFmpeg:


ffmpeg -y -i input.avi -c:v mpeg4 -vtag xvid -b:v 555k -pass 1 -an -f avi /dev/null


ffmpeg -i input.avi -c:v mpeg4 -vtag xvid -b:v 555k -pass 2 -c:a libmp3lame -b:a 128k output.avi


Небольшой трюк для пользователей Windows: вместо /dev/null можно писать NULL.


На певом этапе будет создан специальный индексный файл, который будет использоваться при кодировании на втором этапе.



Так же в этом разделе:
 
MyTetra Share v.0.44
Яндекс индекс цитирования