Кодирование видео в 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. Чтобы начать кодирование нам нужно знать какое разрешение у видео файла. Посмотреть можно либо в плеере либо на сайте, откуда это видео было скачано. Допустим видео имеет разрешение 720×304 как обычный фильм хорошего качества. Но для веба нам этого будет жирновато. Уменьшим разрешение в 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 говорит о том, что при наличии плохих фреймов они будут пропускаться и заменяться хорошими.

На практике скажу — этот скрипт наиболее качественно конвертирует видео. Сам им пользуюсь. Примеры фильмов, перекодированные этим скриптом можно посмотреть у меня на блоге в разделе Фильмы.

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

Поделитесь статьей:
Константин

Константин

Программист, фрилансер, фотограф любитель, автолюбитель, геймер, писатель, читатель.

Отправить ответ

Оставьте первый комментарий!

Notify of
avatar
2000
wpDiscuz
Весь контент, размещенный на сайте madjack.ru является интеллектуальной собственностью автора (если явно не указано обратное).
При копировании или использовании контента - обязательно указывайте ссылку на страницу с ним.
Все права защищены © Дьяков Константин Сергеевич, 2008-2015