Заметки программиста | info.sectorit.net

 
Конвертирование видео FLV, AVI, 3GP для телефона. FFMPEG - примеры и параметры конвертирования. PDF Печать E-mail
Оценка пользователей: / 8
ПлохоОтлично 
OS - Ubuntu
Автор: Sorbing    13.04.11 19:24

ffmpeg-ubuntu-10Решил я разобраться подробнее с конвертацией видео - параметрами, форматами, инструментами. Все познания занотирую - кому-то да сгодится и сам полистаю коль запамятую ).

Иструмент для конвертирования, однозначно FFMPEG - консольная /мы ведь под линуксом/ утилита с богатым функционалом и открытым кодом. Инструменты типа "в два тыка батоном" решил не использовать, поскольку ".. решил разобраться подробнее с конвертацией видео.." да и возможности таких инструментов уступают.

Что же нужно:

  1. Установить сам FFMPEG;
  2. Установить следующие кодеки с возможностью кодирования: видео - H263, H264, аудио - libfaac, aac;
  3. Научиться как этим всем пользоваться ). Как видео-то кодировать - опции кодирования, соотношение качество видео/размер видео.

Переходим к делу..

Установка FFMPEG + кодек H263.

apt-get install ffmpeg x264

(( неа, так просто не получиться, придется ручками собирать.

Подготовка

# Удалить если установлены
sudo apt-get remove ffmpeg x264 libx264-dev
# Обновляем репозитории
sudo apt-get update
# Ставим subversion, git, кодеки
sudo apt-get install build-essential subversion git-core checkinstall yasm texi2html
libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libvorbis-dev libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev

Ставим кодек x264

cd
git clone git://git.videolan.org/x264.git
cd x264
./configure
make
sudo checkinstall --pkgname=x264 --pkgversion "2:0.'grep X264_BUILD x264.h -m1 | \
cut -d' ' -f3'.'git rev-list HEAD | wc -l'+git'git rev-list HEAD -n 1 | \
head -c 7'" --backup=no --default --deldoc=yes

Ставим LIBVPX

cd
git clone git://review.webmproject.org/libvpx.git
cd libvpx
./configure
make
sudo checkinstall --pkgname=libvpx --pkgversion="'date +%Y%m%d%H%M'-git" --backup=no \
--default --deldoc=yes

Ставим кодек MP3 - libmp3lame

sudo apt-get remove libmp3lame-dev
sudo apt-get install nasm
cd
wget http://downloads.sourceforge.net/project/lame/lame/3.98.4/lame-3.98.4.tar.gz
tar xzvf lame-3.98.4.tar.gz
cd lame-3.98.4
./configure --enable-nasm --disable-shared
make
sudo checkinstall --pkgname=lame-ffmpeg --pkgversion="3.98.4" --backup=no --default --deldoc=yes

Ставим FFMPEG

cd
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
cd ffmpeg
./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc \
--enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb \
--enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid \
--enable-x11grab --enable-libvpx
make
sudo checkinstall --pkgname=ffmpeg --pkgversion "4:SVN-r'LANG=C svn info | \
grep Revision | awk '{ print $NF }''" --backup=no --default --deldoc=yes
hash x264 ffmpeg ffplay

Уфф.. ставится все около часа.. Можно также посмотреть другие интструкции по установке:

  1.  http://zenway.ru/page/howto-install-ffmpeg-x264 - устанавливал этим методом.
  2. http://ubuntuforums.org/showthread.php?t=786095 - ffmpeg установился в /usr/local/bin/ffmpeg.

Опции FFMPEG.

Посмотреть все поддерживаемые форматы видео и аудио (доступные кодеки и их возможности):

ffmpeg -formats

Расшифровка сокращений описывающих возможности кодека:

  • D        Декодирование (чтение этого формата) доступно
  • E        Кодирование (конвертирование в этот формат) доступно
  • V/A/S  Доступны кодеки для: Видео / Аудио / Субтитров
  • S        Кодек поддерживает фрагменты (хмм.. что за фрагменты?)
  • D        Кодек поддерживает прямой рендеринг (а это зачем?)
  • T        Кодек может обрабатывать входные усеченния в случайных местах, а не только в кадре границ (Похоже на "кроп"..).

Для одного фидео-файла не известного формата могут понадобиться два кодека, поскольку любой видео-файл состоит из аудио и видео потока.

Найти информацию о поддержке 3gp:

ffmpeg -formats | grep 3gp

Посмотреть информацию (параметры кодирования) видео/аудио файла:

ffmpeg -i video.avi

Синтаксис:

ffmpeg [[infile_options][-i infile]]... {[outfile_options] outfile}...

Параметры конвертирования FFMPEG.

Базовые:

-i video.avi - имя исходного файла;

-y - заменить файл при кодировании, если он присутствует;

-ss 00:02:00 - смещение по времени от начала файла (position). Здесь: пропустить первые 2 мин (сдвиг в сек.). Задается в сек. или временем в формате: hh:mm:ss[.xxx]

-t 300 - длительность видео/аудио (duration). Здесь: кодировать только 5 мин. файла. Задается в сек. или временем в формате: hh:mm:ss[.xxx]

-fs 2048 - установить максимальный размер выходного файла. Похоже что в байтах.

-vpre ipod320    - задать файл с предустановленными параметрами конвертирования (preset). Значения: slow, medium, ipod320, ipod640 ().

!!! При задании предустановок типа -vpre ipod320 или -vpre ipod640, обязательно перед ними задайте базовую предустановку типа -vpre slow ИЛИ -vpre medium

-threads 0 - колличество ядер в компьютере. Значения: 0 - 4. 0 - автоматически определить количество ядер процессора и использовать их в процессе работы.

  

Аудио:

-acodec - аудио-кодек; // libfaac, aac, libmp3lame,

-ab 128k - аудио битрейт;

-ar 22050 - частота дискретизации звука (Гц); Обязательно кратное 11кГц. Значения: 8000, 11025, 16000, 22050, 44100;

-ac 1 - колличество каналов в аудиопотоке (1 - моно, 2 - стерео);

-an - БЕЗ звука (при первом проходе кодирования например, т.к. звук нам не нужен или если хотим убрать звук).

Видео:

-vcodec - указать каким кодеком кодировать видео; // vibx264

-f avi - формат исходящего видео-файла (контейнер для видео) (можно опустить эту опцию и задавать формат в расширении файла). Пример: -f dvd - контейнер VOB.

-s qvga - размер картинки (под какое расширение экрана нужно кодировать). Или так:  -s 320x240

-r 20 - кадров в сек. (FPS); // 1-30, default = 25.

-b 200k - средний битрейт кодирования видеопотока (bit/s). Здесь: установить битрейт в 100 kbps. Примеры: 30k, 200k, 512k, 1024k

-bt 4000k - допуск значения видео битрейта. Хз что это...

-maxrate 9000k - маскисмальный битрейт кодирования видеопотока.

-vframes 5 - задать лимит видео кадров.

-target vcd - тип выходного файла (задает предустановленые опции выходного видео потока: bitrate, codecs, buffer sizes). Значения: "vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...

-aspect 4:3 - соотношение сторон. Значения: 4:3, 16:9, 1.3333

-vf crop=width:height:x:y - обрезка файла (краев). Размер и смещение. Отмеряем в px.

-vf pad=width:height:x:y:color - установить отступ от края, смещение и цвет подложки. Отмеряем в px.

-me_range 20 - ???

-deinterlace - ???

-pass 2 - - задать этот параметр, вы будете конвертировать видео в 2 этапа. -pass 1 - первый этап, -pass 2 - второй проход (для получения фиксированных размеров битрейта).

-g 24 - группировка фреймов для задания шага перемотки. Если значение -g = -r, это означает что шаг перемотки = 1 сек.

-vn - отключить запись видео.

-map 0.0 - указываем какой видеопоток кодировать. 

-map 1.0 - указывает какой аудиопоток кодировать.

Например в одном файле может быть: 0.0 - видеопток, 0.1 - русская аудиодорожка, 1.0 - английская аудиодорожка

Подробнее про параметры конвертирования...

Доступные размеры "картинки" для формата 3GP: qcif - 176x144, 352x288, 640x480, 

Доступные размеры картинки для конвертирования видео: sqcif - 128x96; qcif - 176x144, cif - 352x288, 4cif - 704x576, - qqvga160x120, cga - 320x200, qvga - 320x240, vga - 640x480, svga - 800x600, xga - 1024x768, uxga - 1600x1200, qxga - 2048x1536,  sxga1280x1024, qsxga - 2560x2048, hsxga - 5120x4096, wvga - 852x480, wxga - 1366x768, wsxga - 1600x1024, wuxga - 1920x1200, woxga - 2560x1600, wqsxga - 3200x2048, wquxga - 3840x2400, whsxga - 6400x4096, whuxga - 7680x4800, ega - 640x350, hd480 - 852x480, hd720 - 1280x720, hd1080 - 1920x1080.

Доступные форматы-контейнеры: (-f): x11grab, image2

Примеры конвертирования.

Задача №1. FLV to 3GP. Размер файла вырос из 38MB до 45 MB

/usr/local/bin/ffmpeg -i clip.flv -s 176x144 -vcodec h263 -r 25 -b 200 -ab 6.7k -sameq -acodec libfaac -ac 1 -ar 8000 /home/www/flv/clip-01.3gp

Задача №2. FLV to MP4. Конвертировал под андроид с разрешением 320x240.

При задании предустановок типа -vpre ipod320 или -vpre ipod640, обязательно перед ними задайте базовую предустановку типа -vpre slow ИЛИ -vpre medium

# Эта комманда конвертирует только 30 сек. видео. Уберите опцию: -t 30
ffmpeg -i bruno_mars_240.flv -acodec libfaac -ab 64k -aq 100 -ac 1 -vcodec libx264 -vpre slow -vpre ipod320 -crf 18 -threads 0 -t 30 bruno_mars_240_01.mp4
# или так
ffmpeg -i bruno_mars_240.flv -vcodec libx264 -threads 0 -r 25 -g 50 -b 500k -bt 500k -acodec libfaac -ar 44100 -ab 64k -ac 1 -s 320x240 -t 30 -vpre slow bruno_mars_240_06.mp4
# Если андроид после конвертации кодеком libx264 воспроизводит черный экран
# кодируем с помощью mpeg4
ffmpeg -i bruno_mars_240.flv -s 320x240 -vcodec mpeg4 -b 512000 -acodec libfaac -ac 1 -ar 16000 -r 13 -ab 32000 -aspect 3:2 -t 10 -y bruno_mars_240_mobi.mp4

Задача №3. FLV to AVI.

ffmpeg -i bruno_mars_240.flv -s 320x240 -vcodec mpeg4 -r 15 -acodec libmp3lame -ac 1 -ar 22050 -ab 96k bruno_mars_240_01.avi

Задача №4. Захват видео с дисплея монитора.

-f alsa -i pulse - снять звук с микрофона;

-f x11grab -i :0.0 - снять видео с монитора номер рас (с первого моника - 0.0);

# аудиопоток с микрофона
ffmpeg -f alsa -ac 2 -i pulse -f x11grab -r 30 -s 1366x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 -t 5 output.mkv
# без аудиопотока
ffmpeg -f alsa -ac 1 -f x11grab -r 30 -s 1366x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0  output.mkv

Задача №5. Ужимаем видеофайл

ffmpeg -i output.mkv -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -vpre slow -crf 22 -threads 0 final.mp4

-crt N - коэффициент сжатия. По мере увеличения значения увеличивается степень сжатия (но теряется качество!); Обычно N от 18 до 28.

-t 5 - время съемки 5 сек;

Задача №6. Сохранить кадр из видео в изображение

-ss 30 - смещение 30 сек.

# Сохранить первый кадр с 3-й мин. 1-й сек. 961-й милисек.:
ffmpeg -i bruno_mars_240.flv -f image2 -ss 00:03:01.961 -vframes 1 -y frame.jpg
# Сохранить первый кадр с 3-й мин. 1-й сек. 961-й милисек. как изображение размером 320x240 и обрезать края сверху и снизу: 
ffmpeg -i bruno_mars_240.flv -f image2 -s 320x240 -ss 00:03:01.961 -vframes 1 -vf crop=320:165:0:40 -y frame.jpg

Вот что мы получили в результате этих манипуляций соответственно:

ffmpeg-frame-capture-image

ffmpeg-frame-capture-image-and-crop

Другие решения: FFmpeg Howto

Соответствия форматов видео - аудио и видео кодекам:

AVI

Аудио: raw, pcm, mp3, ac3, aac

Видео:

MPG

Аудио:

Видео:

3GP

Аудио:

Видео:

FLV

Аудио: mp3,pcm,aac

Видео: H.263, H.264

 

Рекоммендации:

Перед кодированием убедитесь что выбранный кодек поддерживает именно КОДИРОВАНИЕ:
Пример №1:
ffmpeg -codecs | grep libfaac
Вы увидите:
  EA    libfaac         libfaac AAC (Advanced Audio Codec)
A - это аудио кодек.
E - этот кодек может кодировать видео.
Пример №2:
ffmpeg -codecs | grep aac
Вы увидите:
DEA    aac             Advanced Audio Coding
A - это аудио кодек.
E - этот кодек может кодировать видео.
E - этот кодек также может и ДЕкодировать видео.

При кодировании видео для мобильных устройств установите колличество кадров 12-15 (-r 15). Слабая подсистема видео все равно не сможет воспроизводить все кадры, а файл вы ужмете.

Долго искал сервис для скачивания видео с youtube-а, и понял что оптимальное решение это плагины. Для Chrome-аDownload YouTube Videos as MP4/FLV

Поскольку у меня андроид, вот список кодеков и форматов видео, которые поддерживаются Android: H.263: 3GPP (.3gp) и MPEG-4 (.mp4), H.264 AVC: 3GPP (.3gp) и MPEG-4 (.mp4), MPEG-4 SP: 3GPP (.3gp)

Предустановки (-vpre) я нашел в каталоге: /usr/local/share/ffmpeg

P.S. Не разобрался как указать номер кадра для сохранения, поэтому для сохранения 24-го кадра задавал сдвиг милисекундами. Мож кто подскажет?

sudo apt-get remove ffmpeg x264 libx264-dev
Последнее обновление: 20.04.11 15:26
 

Добавить комментарий


Защитный код
Обновить

Поиск


[+]
  • Increase font size
  • Decrease font size
  • Default font size
  • default color
  • blue color
  • green color