Программное обеспечение, Личные разработки, Проекты, Портфолио, Хитрости, Заметки, Статьи...

Кодирование видео в FLV на FreeBSD

Кодирование видео в FLVСегодня я расскажу маленький секрет, как самому кодировать видео любых форматов в FLV, дабы его можно было смотреть через Flash плееры. Все на самом деле очень просто. Нам потребуется /ports/multimedia/mencoder, /ports/multimedia/flvtool++ и маленький скриптик на shell.
При установке mencoder выбираем те кодеки, которые нам нужны. Дабы не ошибиться можно выбрать все, что предлагают. Ну вот, установили mencoder и flvtool++. Кстати, FLVTool++ нам нужен, чтобы была поддержка перемотки видео при воспроизведении. Но это совсем не обязательно.

Теперь создаем скрипт. Назовем его mencoder.sh. Этот скрипт позволит нам кодировать видео в любое разрешение, с любым битрейтом и с любым качеством как видео так и звука.

#!/bin/sh
/usr/local/bin/mencoder $1 -o $2 \
-of lavf \
-oac mp3lame \
-aid 1 \
-lameopts abr:br=56 \
-srate 22050 \
-af volnorm=2 \
-ovc lavc \
-lavcopts vcodec=flv:vbitrate=1024:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 \
-vf scale=$3:$4,harddup
/usr/local/bin/flvtool++ $2 $2.seek.flv
Теперь нам нужен видео файл. Допустим это будет фильм film.avi. Чтобы начать кодирование нам нужно знать какое разрешение у видео файла. Посмотреть можно либо в плеере либо на сайте, откуда это видео было скачано. Допустим видео имеет разрешение 720x304 как обычный фильм хорошего качества. Но для веба нам этого будет жирновато. Уменьшим разрешение в 2 раза. А также урежем качество звука в 2 раза с 44100 до 22050. Так как фильмы в веб смотрят в основном на компьютерных колонках или в наушниках на качество это заметно не отразится, зато отразиться на размер результирующего файла и его битрейт. В скрипте указан максимальный битрейт 1024 килобита. Что примерно 128килобайт в секунду.

Переписываем видео файл в одну папку с mencoder.sh. Даем права на запуск скрипту командой chmod +x mencoder.sh. И запускаем скрипт такой строчкой:
./mencoder.sh film.avi film.flv 360 152
Результатом выполнения скрипта будет 2 дополнительных файла и информация примерно такого содержания:
MEncoder 1.0rc2-3.4.6 (C) 2000-2007 MPlayer Team
CPU: Intel(R) Xeon(R) CPU           X3210  @ 2.13GHz (Family: 6, Model: 15, Stepping: 11)
CPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled with runtime CPU detection.
success: format: 0  data: 0x0 - 0x51328000
AVI file format detected.
[aviheader] Video stream found, -vid 0
[aviheader] Audio stream found, -aid 1
VIDEO:  [XVID]  720x304  12bpp  25.000 fps  1503.9 kbps (183.6 kbyte/s)
[V] filefmt:3  fourcc:0x44495658  size:720x304  fps:25.00  ftime:=0.0400
==========================================================================
Opening audio decoder: [liba52] AC3 decoding with liba52
Using SSE optimized IMDCT transform
Using MMX optimized resampler
AUDIO: 48000 Hz, 2 ch, s16le, 192.0 kbit/12.50% (ratio: 24000->192000)
Selected audio codec: [a52] afm: liba52 (AC3-liba52)
==========================================================================
** MUXER_LAVF *****************************************************************
REMEMBER: MEncoder's libavformat muxing is presently broken and can generate
INCORRECT files in the presence of B frames. Moreover, due to bugs MPlayer
will play these INCORRECT files as if nothing were wrong!
*******************************************************************************
OK, exit
Opening video filter: [expand osd=1]
Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
Opening video filter: [harddup]
Opening video filter: [scale w=360 h=152]
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffodivx] vfm: ffmpeg (FFmpeg MPEG-4)
==========================================================================
MP3 audio selected.
VDec: vo config request - 720 x 304 (preferred colorspace: Planar YV12)
VDec: using Planar YV12 as output csp (no 0)
Movie-Aspect is 2.37:1 - prescaling to correct movie aspect.
SwScaler: reducing / aligning filtersize 9 -> 8
SwScaler: reducing / aligning filtersize 9 -> 8
SwScaler: reducing / aligning filtersize 9 -> 8
SwScaler: reducing / aligning filtersize 9 -> 8
[swscaler @ 0x8646f38]SwScaler: BICUBIC scaler, from yuv420p to yuv420p using MMX2
[swscaler @ 0x8646f38]SwScaler: using 8-tap MMX scaler for horizontal luminance scaling
[swscaler @ 0x8646f38]SwScaler: using 8-tap MMX scaler for horizontal chrominance scaling
[swscaler @ 0x8646f38]SwScaler: using n-tap MMX scaler for vertical scaling (YV12 like)
[swscaler @ 0x8646f38]SwScaler: 720x304 -> 360x152
videocodec: libavcodec (360x152 fourcc=31564c46 [FLV1])
[VE_LAVC] High quality encoding selected (non-realtime)!
Compiler did not align stack variables. Libavcodec has been miscompiled
and may be very slow or crash. This is not a bug in libavcodec,
but in the compiler. You may try recompiling using gcc >= 4.2.
Do not report crashes to FFmpeg developers.
VIDEO CODEC ID: 22
AUDIO CODEC ID: 15001, TAG: 0
Writing header...
Pos:   0.8s     22f ( 0%)  0.00fps Trem:   0min   0mb  A-V:0.082 [0:8]
Skipping frame!
Pos:  15.3s    385f ( 0%) 109.69fps Trem:   0min   0mb  A-V:0.066 [292:53]
Перекодирование может затянуться до часа-двух. В зависимости от мощности компьютера.
Теперь о файлах, которые мы получим в результате выполнения скрипта.
film.flv - это файл перекодированный AVI => FLV.
film.flv.seek.flv - это файл FLV с поддержкой перемотки.

Если нам файл без перемотки не нужен, то добавим в конец скрипта еще 2 строчки:
rm -f $2
mv $2.seek.flv $2
Тогда будет только film.flv и уже с поддержкой перемотки.

Параметров у mencoder очень много. В скрипте использованы лишь основные. Давайте их рассмотрим.
  • -oac mp3lame - Означает, что звук будем кодировать в MP3 формат.
  • -srate 22050 - Означает, что качество звука будет 22050Khz.
  • -af volnorm=2 - Означает, что будет производиться нормализация громкости.
  • vbitrate=1024 - Означает, что итоговый битрейт видеофайла не будет превышать 1024Килобита
  • -vf scale=$3:$4,harddup - Означает что размер видео будет изменен в $3 по ширине и в $4 по высоте. А также harddup говорит о том, что при наличии плохих фреймов они будут пропускаться и заменяться хорошими.
На практике скажу - этот скрипт наиболее качественно конвертирует видео. Сам им пользуюсь. Примеры фильмов, перекодированные этим скриптом можно посмотреть у меня на блоге в разделе Фильмы.

Кому понравилось/не понравилось и есть что предложить жду отзывов в коментах.

Комментировать

OpenID принимается здесь Узнать больше об OpenID
  • Rambler's Top100

Об этой записи

Сообщение опубликовано 26.03.2010 09:53. Автор — Безумный Джек.

Предыдущая запись — Кнопка Retweet своими руками? Легко!

Следующая запись — Создание карты сайта (Google Sitemap) в Movable Type

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.