пятница, 3 февраля 2012 г.

Кодирование аудио/видео при помощи ffmpeg


FFmpeg - полноценное кроссплатформное решение для записи, конвертации и воспроизведения звука и видео.


Это очень быстрый аудиовидеоконвертер, в состав которого входит лучшая библиотека аудио- и видеокодеков libavcodec. Кроме того, FFmpeg подходит и для записи потокового звука и видео. 



Компоненты
Проект состоит из нескольких компонент: ffmpeg - инструментальное средство командной строки для преобразования одного формата видео файлов в другой.
С его помощью также можно с ТВ тюнера в режиме реального времени захватывать и кодировать видеоизображение;

ffserver является HTTP и RTSP мультимедийным потоковым сервером, предназначенным для прямых трансляций. С его помощью можно во время прямого эфира выполнять временной сдвиг видеоизображения;

ffplay является простым медиаплеером, базирующимся на библиотеках SDL и FFmpeg;

ffprobe — инструментальное средство командной строки для отображения (анализа — прим.пер.) мультимедийной информации;

libavcodec является библиотекой, в которой находятся все аудио и видео кодеки пакета FFmpeg. Для того, чтобы получить максимальную производительность и возможность их повторного использования, большинство кодеков были разработаны с нуля;

libavformat - это библиотека, в которой содержатся средства для работы с форматами аудио и видео контейнеров;

libavutil является вспомогательной библиотекой, в которой находятся процедуры, общие для различных частей FFmpeg. В этой библиотеке есть adler32, crc, md5, sha1 декомпрессор lzo, кодер / декодер Base64, кодер / декодер des, кодер / декодер rc4 и кодер / декодер aes;

libpostproc - это библиотека, в которой находятся процедуры постобработки видеозаписей;

libswscale - это библиотека, в которой находятся процедуры масштабирования и цветового попиксельного преобразования видеоизображений;

libavfilter является фильтром, заменяющим vhook, который позволяет выполнять модификацию или анализ видео / аудио записи между декодированием и кодированием.


Основные ключи:
-i file исходный файл видео;
-vcodec для указания видеокодеков(например libx264),
-acodec для аудиокодека(например mp3),
-s (size) для размера кадра, указывается как Ширинф x Высота (WxH),
-r  устанавливает количество кадров, генерируемых в буфере кадров FPS (по умолчанию — 25 кадров),
-b для битрейта видео,
-f — формат видео на выходе (например flv);
-ar для частоты дискретизации звука(должна быть кратна 11кГц, например - 22050 ),
-ab для битрейта аудио (например 32k)
-ac  — количество каналов звука (например 2)

-g — плотность ключевых кадров (по ним осуществляется перемотка, чем плотнее (1- каждый кадр ключевой) — тем лучше для перемотки, но значительно вырастает размер файла), если значение равно FPS(-r), то ключевой кадр вставляется каждую секунду (так по умолчанию);
-vframes  — ограничение на количество кадров видео(например 100);
-y — перезаписать файл, если он уже существует;
-vn отключение записи видео
-ss - указывается начальная позиция в секундах; также поддерживается формат "hh:mm:ss[.xxx]"
-t ограничивается продолжительность преобразования / захвата, указываемая в секундах; также поддерживается формат "hh:mm:ss[.xxx]".
 -deinterlace - использовать деинтерлейсинг видео (создания одного кадра из двух полукадров чересстрочного формата для дальнейшего вывода на экран с прогрессивной развёрткой, такой как компьютерный монитор. Применяется в компьютерных системах обработки видео, плоскопанельных телевизорах и т. д.).
Примечание: Теперь этот параметр считается устаревшим и вместо него используется фильтр вида  -vf "yadif=0:0:0"
-vf  - применение фильтров к входному потоку (Просмотреть, какие фильтры доступны можно командой: ffmpeg -filters).Более полное описание фильтров можно посмотреть в Libavfilter Documentation
Примеров использования (привед только значение опции):
-vf "pad=568:320:78:0:black [o1]; movie=/path/to/logos/logo1.png [logo];\[o1][logo] overlay=main_w-overlay_w:0 [out1];[out1] yadiff=0:0:0 [out]"

# Удаление всех опций PAD -vf pad=width:height:x:y:color
# width, height- ширина и высота соответственно выходного видео
# x, y смещение, где разместить входного изображения в мягкой области  
# по отношению к верхней / левой границы выходного изображения. 
#    Выражение х может ссылаться на значение, установленное по 
# выражению у, и наоборот. По умолчанию значение х и у = 0.
# color - цвет полос для заполнения. Задается Hex значением
# 0xRRGGBB[AA]. Значение по умолчанию - "black".
pad=568:320:78:0:black [o1];

# movie - чтение видеопотока с контенера. В данном случае он используется для установки своего логотипа на видео
movie=/path/to/logos/logo1.png [logo];

# overlay - накладывает одно видео (помечено как [logo] ) поверх второго
# (помечено как [o1])
[o1][logo] overlay=main_w-overlay_w:0 [out1]
# yadif - убирает деинтерлейс с входящего видео [out1]
# и выдает его на выход [out]
[out1] yadiff=0:0:0 [out]
Примечание: кроме базовых ключей для ffmpeg  можно использовать также и специальные ключи для библиотек кодирования для тюнинга.

Дополнительные ключи при использовании кодака libx264:
Т.е. для ffmpeg указана опция -vcodec libx264.
А опции для libx264 можно также посмотреть в список ключей libx264
-trellis <0,1,2> Используется для улучшения качества изображения (результат ~5%). Кодирование занимает немного больше времени. В целом рекомендуется использовать (например: -trellis 2)
Значения:
0 - отключен
1: включен только при финальном кодировании
2: Включен всегда


-presets или -vpre  использует пред установки, конфиги которых хранятся в PREFIX/share/ffmpeg или $HOME/.ffmpeg (например в gentoo - /usr/share/ffmpeg).
Неплохо описано в статье HOWTO: ffmpeg & x264 presets
Пример использования - "-presets baseline" укажет использовать настройки из файла /usr/share/ffmpeg/libx264-baseline.ffpreset. Можно также и самому составлять файлы прессетов



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


В следующем примере мы сконвертируем файл mpg в avi с использованием видеокодека mpeg4 с размером кадра 320×240 и битрейтом видео 300 кбит/с. Для звука используем кодек mp3 с битрейтом 64 кбит/с и частотой дискретизации 22 050 Гц. Кроме того, принудительно укажем формат файла avi.
ffmpeg -i file.mpg -vcodec mpeg4 -s 320x240 -b 300k -r 10 \
-acodec mp3 -ar 22050 -ab 64k -f avi file.avi

Примечание: Если некоторые из этих параметров пропущены, FFmpeg будет использовать значения по умолчанию.
Примеры использования:
Получение информации о файле.
 # ffmpeg -i 116661
ffmpeg version 0.7.6, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec  1 2011 14:40:04 with gcc 4.5.3
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --disable-static --enable-gpl --enable-version3 --enable-postproc --enable-avfilter --disable-stripping --disable-debug --disable-doc --disable-network --disable-vaapi --disable-ffplay --disable-vdpau --enable-libmp3lame --enable-libvo-aacenc --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libfaac --enable-nonfree --disable-indev=v4l --disable-indev=alsa --disable-indev=oss --disable-indev=jack --disable-outdev=alsa --disable-outdev=oss --disable-altivec --disable-avx --enable-hardcoded-tables
  libavutil    50. 43. 0 / 50. 43. 0
  libavcodec   52.122. 0 / 52.122. 0
  libavformat  52.110. 0 / 52.110. 0
  libavdevice  52.  5. 0 / 52.  5. 0
  libavfilter   1. 80. 0 /  1. 80. 0
  libswscale    0. 14. 1 /  0. 14. 1
  libpostproc  51.  2. 0 / 51.  2. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '116661':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    creation_time   : 1970-01-01 00:00:00
    title           : M_P_HORROR_DISC3B M_P_
    encoder         : DigiArty AV Encoder Core
    genre           : MyDVD
  Duration: 01:02:07.46, start: 0.000000, bitrate: 1932 kb/s
    Stream #0.0(und): Video: mpeg4, yuv420p, 708x540 [PAR 54:55 DAR 354:275], 1799 kb/s, 30 fps, 30 tbr, 30 tbn, 30 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 127 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

Просмотр поддерживаемых форматов 
Примечание:по умолчанию ffmpeg е поддерживает кодаки h264, для этого нужно пересобирать его из исходных кодов
# ffmpeg -formats
...
Конвертация формата видеофайлов 
Предположим, у нас есть фильм в формате wmv и нам надо конвертировать его в avi. Следующая команда легко это сделает.

ffmpeg -i input_file.wmv output_file.avi
Здесь input_file файл исходного формата, а output_file формат, в который нам надо преобразовать файл.
Для конвертации avi в mp3 запустите следующую команду:
ffmpeg -i file.avi file.mp3 


Для конвертации avi в dvd для NTSC (распространенный в Северной Америке стандарт), применяйте параметр -target:
ffmpeg -i file.avi -target ntsc-dvd file.mpg 


Можно указать и соотношение сторон параметром -aspect:
ffmpeg -i file.avi -target ntsc-dvd -aspect 4:3 file.mpg 


Если исходный видеофайл был в формате wmv, конвертируем его в dvd таким образом:
ffmpeg -i file.wmv -target ntsc-dvd -aspect 4:3 file.mpg 


Аналогично, если исходный файл flv это флэш-видео, команда будет такой:
ffmpeg -i file.flv -target ntsc-dvd -aspect 4:3 file.mpg 


Из asf конвертируем в avi:
ffmpeg -i file.asf file.avi 


Аналогично из файла swf можно сделать mov для воспроизведения в Quicktime.
ffmpeg -i file.swf file.mov 


Например, у нас есть фильм в avi и нам нужно сконвертировать его в vcd (Video CD) для воспроизведения на CD-проигрывателе:
ffmpeg -i movie.avi -target pal-vcd movie.mpg


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

Кадр можно обрезать сверху, снизу, слева или справа. Чтобы срезать по 25 пикселов сверху и снизу, запустим следующую команду:
ffmpeg -i file.avi -croptop 25 -cropbottom 25 file_crop.mpg


Чтобы дополнить изображение белыми полосами сверху и снизу по 20 и 30 пикселов соответственно, запустим следующую команду:
fmpeg -i file.mpg -padtop 20 -padbottom 30 -padcolor 000000 -f avi file_pad.avi


Извлечение звука из видеофайла

Это мой любимый пункт, так как я постоянно извлекаю аудиодорожки из юмористических передач. Чтобы извлечь звук из моей любимой передачи Джорджа Карлина в файле show.avi, используем для FFmpeg параметр -vn.
ffmpeg -i show.avi -vn show_audio.mp3 


Захват звука и изображения

FFmpeg может использовать источники видео, совместимые с video4linux и источники звука, совместимые с OSS (Open Sound System). Для захвата звука или видео используется такая команда:
ffmpeg /tmp/out.mpg

Извлечение изображений из видеозаписи 
Иногда полезно из видеозаписи извлечь несколько изображений и это можно легко сделать с помощью ffmpeg:
ffmpeg -i test.mpg image%d.jpg

Для каждой секунды видео можно создать 25 изображений, но с помощью параметра -r можно указать создавать большее или меньшее количество изображений. Параметр -r устанавливает количество кадров, генерируемых в буфере кадров (по умолчанию — 25 кадров).

ffmpeg -i test.mpg -r 1 image%d.jpg
С помощью этой команды вы каждую секунду будет получать одно изображение.

Создание демороликов
С помощью ffmpeg также можно создать простой ролик, использующий скриншоты с вашего рабочего стола.
Для этого мы будем использовать некоторые из флагов, показанные в первом примере:
ffmpeg -f x11grab -r 25 -s wxga -i :0.0 /tmp/outputFile.mpg

Примечание: 0.0 является номером display.screen (дисплея.экрана) для вашего сервера X11 точно также, как это указано в переменной окружения DISPLAY.
Вы сможете сохранять по 25 кадров в секунду c вашего экрана wxga (или с помощью параметра -s вы можете указать разрешение, например, 1024 × 768) и поместить видео mpg в /tmp.

Обрезка видео по времени
Указываем начать запись с 10-й секунды и делать захват втечении 60 секунд
ffmpeg -ss 00:00:10 -t 60 -i test.mpg  /tmp/outputFile.mpg


Преобразование изображений в видеозапись
Скажем, у вас много изображений с именами "img001.jpg"', "img002.jpg" и далее в такой же самой последовательности. Вы можете преобразовать их в видеозапись с помощью следующей команды:
ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg

Получение видеозаписи с вебкамеры
Чтобы сделать запись видео, запустите ffmpeg со следующими параметрами:
ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 out.mpg

Чтобы записать аудио и видео, используйте:
ffmpeg -f oss -i /dev/dsp -f video4linux2 -s 320x240 -i /dev/video0 out.mpg

Это всего лишь несколько примеров; с помощью ffmpeg можно выполнять разнообразное редактирование аудио и видеозаписей, и в сети есть много тому примеров.

P.S. Если у кого-то будут рекомендации, дополнения или уточнения - коментируйте! Я с радостью дополню статью.

UPDATE 29.02.2012


Ссылки:
Обработка аудио- и видеофайлов с помощью FFmpeg
список ключей libx264
HOWTO: ffmpeg & x264 presets
Семь трюков с ffmpeg
Кодирование видео в FLV и MP4 (H.264) с помощью FFmpeg
Конвертирование (кодирование) видеопотоков/файлов mencoder, ffmpeg, vlc  FFMPEG and Mencoder на youtube (Video, Eng)
Пять лучших пакетов видеомонтажа под Linux

9 комментариев:

  1. Консоль, как всегда, рулит. Спасибо

    ОтветитьУдалить
  2. а как конвертировать несколько видео в несколько mp3 файлов сразу?

    ОтветитьУдалить
    Ответы
    1. А кто мешает запустить несколько процессов параллельно?

      Удалить
  3. В примере захвата видео с камеры "ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 out.mpg", ключ -f указывает на формат, тогда вопрос что такое "video4linux2"? И второй вопрос, если записать нужно определенный промежуток времени или не определенный, как остановить процесс записи?

    ОтветитьУдалить
  4. Мне нужно из сонивегаса с помощью фреймсервера перенаправить видео в кодировщик. Что делать - не ведаю

    ОтветитьУдалить
  5. Оформление дерьмо. Фон должен быть светлым. Ааааа, я догадался, автор ещё учится в школе и от классной доски не может отвыкнуть.

    ОтветитьУдалить
  6. Похоже вы являетесь экспертом в Usability, User Interfaces и заодно дизайнером. Ваше мнение очень важно для нас.

    P.S. С подобным подходом к изложению своих мыслей, вы можете пойти в сторону леса быстрым шагом. В дальнейшем, прошу воздержваться от посещения данного блога,во избежание травмирования вашей тонкой и чувстительной дешевной организации. Всего доброго.


    С Уваженим,
    Автор блога.

    ОтветитьУдалить
  7. Автор, большое спасибо.

    ОтветитьУдалить
  8. Автор, спасибо. Помогло.

    ОтветитьУдалить