вторник, 16 декабря 2008 г.

ffmpeg или видео на телефоне

Случилось приятное =), у меня появился телефон с 8Gb карточкой который крутит музыку и видео. Естественно захотелось на нем смотреть фильмы. Естественно ffmpeg должен помочь.

На повестке дня были следующие проблемы:
  • размер файла с фильмом
  • качество картинки
Сразу о грустном. Добиться отличного качества при размере экрана 320x240 не возможно. Как я только над параметрами не издевался. Перечитал половину интернета. Но если к задаче подойти практично, то все не так уж и плохо.

Выбирал из 3-х вариантов кодеков mpeg4 (libxvid, mpeg4, h264). Качество получаемого изображения, при настройках по умолчанию, примерно одинаковое, особенно учитывая устройство просмотра и то, что в качестве исходного изображения уже был сжатый avi файл. Возможно, при налчии качественного исходного материала, можно добиться лучшей картинки, но в моем случае это не актуально.

По результатам тестов я выяснил, что при одинаковом качестве, кодек h264 выдает результат наилучший по качеству (субъективно) и самое главное, размер итогового файла на 10-15% меньше. Меня это вполне устроило, не смотря на почти двух кратный проигрыш по времени. Для себя поставил галочку, если буду торопиться - mpeg4.

Теперь в общем то переходим собственно к самому ffmpeg. Разберем мой простенький тестовый пример:

#ffmpeg -i kino.avi -vcodec h264 -acodec libfaac -ac 2 -ab 32kb -s 320x240 kino.mp4
  • -i kino.avi - исходный файл
  • -vcodec h264 - указывается кодек (libxvid, mpeg4)
  • -acodec libfaac - кодек для звуковой дорожки
  • -ac 2 - количество каналов. 2 - стерео, 1 - моно. Надо проверить - играет ли пой телефон 5.1 звук =). Если параметр не указан - берутся характеристики из исходного фильма.
  • -ab 32kb - битрейт звуковой дорожки. Я осознанно зажал его в 32kb, т.к. объемного звука на динамиках телефона =) не добиться. 32kb достаточно для нормальной передачи звука и минимальных издержек на звуковую дорожку.
  • -s 320x240 - размер кадра для конвертированного фильма
  • kino.mp4 - готовый фильм
При экспериментах, чтобы не ждать пока перекодируется весь фильм, я развлекался на одном кусочке. Вырезать кусок фильма при помощи ffmpeg можно используя следующие опции:
  • -ss 150 - отступить от начала файла 150 секунд, можно указывать время hh:mm:ss
  • -t 60 - конвертировать 60 секунд видео от текущей позиции
Так как не все фильмы в формате 4:3, то надо вдумчиво подходить к параметру -s, и выбирать значения в зависимости от размера файла оригинала. Например мне попался TV-рип неплохого качества 720x576 но у него были черные полосы по бокам и сверху и снизу. Я указал для итогового файла заранее больший размер и поставил опции обрезания кадра по сторонам таким образом, что результирующий размер, точно вписывался в 320x240. Нижу привожу пример необходимых опций:

-s 360x288 -croptop 24 -cropbottom 24 -cropleft 20 -cropright 20 kino.mp4

Для оценки изменений я вырезал некоторые кадры и сравнивал, что в итоге получается, для этого опять же подошел ffmpeg:

#ffmpeg -i kino.mp4 -ss 10 -vframes 1 -an -sameq -f mjpeg kino.mp4.jpg

Опция -ss означает из какого места вырезать кадр. Указывается в секундах от начала ролика или в формате hh:mm:ss.

Вот в общем то и все =). Загоняю свои любимые фильмы в телефон.

1 комментарий:

plutov.by комментирует...

Я для H264 и HTML5 делал так: http://plutov.by/post/html5_ffmpeg