Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

ffmpeg

Оригинал документа лежит на http://howto-pages.org/ffmpeg/

© Copyright 2006-2009 Howard Pritchett.

Введение

ffmpeg можно найти на официальном сайте ffmpeg.

Этот докуменьт о том , как поставить ffmpeg и сопутствующие библиотеки для поддержки различных кодеков. Мы узнаем базовые основы видеофайлов , как работают видео-плейеры , как работать с видео-файлами , обьединять несколько файлов и т.д.

Зависимости

Поддержка кодеков и форматов гарантируется наличием встроенных библиотек libavformat и libavcodec. Для добавления дополнительных кодеков нужны установить внешние библиотеки и натравить на них ffmpeg .

  • MP3
    Поддержка MP3 - библиотека LAME MPEG Audio Layer-III :
    http://lame.sourceforge.net.
  • GSM
    Для того , чтобы приаттачить аудио к e-mail , нужно использовать библиотеку GSM :
    libgsm-1.0.13.tar.bz2
    libgsm-1.0.13.tar.bz2.md5
  • DivX
    DivX - это вариант MPEG4. Для ffmpeg требуется внешняя библиотека XviD , которая лежит тут :
    xvid.org.
  • AMR
    3G-мобильные телефоны используют специальные кодеки в формате .3gp , которые доступны тут :
    3gpp.org
  • OGG/Vorbis
    Vorbis - аудио-кодек , похожий на MP3 , и полностью свободный , в отличие MP3:
    xiph.org.
  • AAC − Advanced Audio Coding
    Известен как MPEG-4 audio, используется на iPod и 3G :
    sourceforge.net.

Основы AUDIO/VIDEO

avmux

Для хранения audio и video нужно много места . Для стандартног видео в формате 720x480 pixels, 30 фреймов в секунду и 24-bit RGB color, речь идет о 1,036,800 байтах на фрейм. Это около 30MB в секунду, или около 200GB для 2-часового мувика . Нужно что-то сделать для того , чтобы все это хранить , например , в формате Digital Versatile Disc (DVD). Данные нужно сжать.

Традиционные методы сжатия ZIP, gz , bzip2 не подходят . Нужны алгоритмы сжатия , которые не ухудшают качество аудио и видео . Такие алгоритмы кодирования-декодирования называются кодеками. Некоторые кодеки входят во внутреннюю ffmpeg-библиотеку libavcodec , другие лежат во dytiyb[ kb,f[ LAME, libgsm, XviD, AMR , libvorbis.

После того , как видео-поток и аудио-поток закодирован нужным кодеком, он ложится в один файл , который называется контейнером. Один из контейнеров - AVI (Audio-Video Interleaved). AVI - это всего лишь способ обьединения закодированных audio и video в один файл.

Алгоритмы упаковки и извлечения audio и video данных находятся в основном во внутренней ffmpeg-библиотеке - libavformat.

После загрузки контейнера , мы находим в нем инфу о том , какой кодек нужен для извлечения данных . audio и video потоки извлекаются и проходят через соответствующие кодеки , на выходе мы получаем готовые - сырые - "raw" - audio и video данные.

Что такое FFMPEG ?

ffmpeg - утилита , со встроенным декодером и енкодером , позволяющая конвертировать файлы из одного формата в другой , например , имея исходный VOB-файл с DVD , включающий MPEG2 видео и AC3 audio , можно его сконвертировать в AVI файл с MPEG4 video и MP3 audio.

ffmpeg может манипулировать над audio и video данными перед кодированием. Сюда входит изменение аудио-рейта , фрейм-рейта для видео , ресайзинг , добавление баров , изменение aspect ratio для картинки (если контейнер это позволит). ffmpeg позволяет делать импорт audio и video из различных источников .

Сборка FFMPEG

Идем на http://ffmpeg.org/download.html и выполняем инструкции .

По умолчанию после инсталляции ffmpeg должен лечь в /usr/local/bin .

Итак , конфигурация ffmpeg :

$ ./configure --enable-gpl --enable-liba52 --enable-libgsm --enable-libxvid \
 --enable-libamr_nb --enable-libamr_wb --enable-libmp3lame --enable-libogg \
 --enable-libvorbis --enable-libfaac --enable-libfaad --enable-shared

Пояснения:

  • --enable-liba52
    это часть libavcodec, включающая кодеки для AC3 audio
  • --enable-libgsm --enable-libxvid
    использовать эти 2 библиотеки
  • --enable-libamr_nb --enable-libamr_wb
    поддержка для AMR
  • --enable-libmp3lame --enable-libogg --enable-libvorbis --enable-libfaac --enable-libfaad
    поддержка кодеков
  • --enable-shared
    компиляция libavformat, libavcodec , libavutils как shared libraries. Это может понадобиться для написания своего собственного софта с поддержкой этих библиотек, что позволит динамически прилинковывать их во время выполнения .

При выполнении конфигурации вывод может быть таким :

install prefix            /usr/local
 source path               /home/howard/src/ffmpeg
 C compiler                gcc
 make                      make
 .align is power-of-two    no
 ARCH                      x86_32 (generic)
 big-endian                no
 MMX enabled               yes
 CMOV enabled              no
 CMOV is fast              no
 gprof enabled             no
 debug symbols             yes
 strip symbols             yes
 optimize                  yes
 static                    yes
 shared                    no
 postprocessing support    no
 software scaler enabled   no
 video hooking             yes
 Imlib2 support            no
 FreeType support          yes
 network support           yes
 IPv6 support              yes
 threading support         no
 SDL support               yes
 Sun medialib support      no
 AVISynth enabled          no
 liba52 support            yes
 liba52 dlopened           no
 libamr-nb support         yes
 libamr-wb support         yes
 libfaac enabled           yes
 libfaad enabled           yes
 libfaad dlopened          no
 libgsm enabled            yes
 libmp3lame enabled        yes
 libnut enabled            no
 libogg enabled            yes
 libtheora enabled         no
 libvorbis enabled         yes
 x264 enabled              no
 XviD enabled              yes
 zlib enabled              yes
 License: GPL
 Creating config.mak and config.h...

Далее - компиляция :

$ make

Далее , надо прибить предыдущие версии библиотек :

$ su -c "rm -f /usr/local/lib/libav{format,codec,util}.*"
 Password: (enter your root password here)
   ... or for some distros:
 $ sudo rm -f /usr/local/lib/libav{format,codec,util}.*

Теперь инсталляция :

$ make install

ffmpeg инсталлирован !

BASIC AUDIO TRANSCODING

Попробуем "зарипать" - от слова ripping - данные с аудио-CD и получить файл audio.wav.

ffmpeg идентифицирует файл . При этом выводится информация .

$ ffmpeg -i audio.wav
 FFmpeg version SVN-r9607, Copyright (c) 2000-2007 Fabrice Bellard, et al.
   configuration:  {snipped for brevity}
   libavutil version: 49.4.1
   libavcodec version: 51.40.4
   libavformat version: 51.12.1
   built on Jul 12 2007 20:22:46, gcc: 3.4.6
 Input #0, wav, from 'audio.wav':
   Duration: 00:05:08.1, start: 0.000000, bitrate: 1411 kb/s
   Stream #0.0: Audio: pcm_s16le, 44100 Hz, stereo, 1411 kb/s
 Must supply at least one output file

Мы видим , что трек по длительности занимает 5 минут 8.1 секунд, кодек - PCM (Pulse Code Modulated) , 16-bit. Рейт - 44100Hz, 2 канала (stereo) результирующий бит-рейт - 1411kbit/s.

Конвертируем его в MP3 :

$ ffmpeg -i audio.wav -acodec mp3 -ab 192k audio.mp3
 FFmpeg version SVN-r9607, Copyright (c) 2000-2007 Fabrice Bellard, et al.
   configuration:  {snipped for brevity}
   libavutil version: 49.4.1
   libavcodec version: 51.40.4
   libavformat version: 51.12.1
   built on Jul 12 2007 20:22:46, gcc: 3.4.6
 Input #0, wav, from 'audio.wav':
   Duration: 00:05:08.1, start: 0.000000, bitrate: 1411 kb/s
   Stream #0.0: Audio: pcm_s16le, 44100 Hz, stereo, 1411 kb/s
 Output #0, mp3, to 'audio.mp3':
   Stream #0.0: Audio: mp3, 44100 Hz, stereo, 192 kb/s
 Stream mapping:
   Stream #0.0 -> #0.0
 Press [q] to stop encoding
 [mp3 @ 0x852f018]lame: output buffer too small (buffer index: 592, free bytes: 1712)
 size=    7221kB time=308.1 bitrate= 192.0kbits/s
 video:0kB audio:7221kB global headers:0kB muxing overhead 0.000000%

На ошибку можно не обращать внимание . Это результат обмена данными между ffmpeg и внешним кодеком - LAME. Делаем :

$ ls -ls
 total 60384
  7236 -rw-r--r--  1 howard users  7394742 2006-10-10 23:36 audio.mp3
 53148 -rw-r--r--  1 howard users 54363436 2006-10-10 23:20 audio.wav

Получаем MP3 , размер которого на порядок меньше WAV file.

Пояснения :

  • -i audio.wav
    имя входного файла
  • -acodec mp3
    This tells ffmpeg to use the "mp3" audio codec to create the target file.
  • -ab 192k
    ffmpeg будет использовать бит-рейт 192 kbit/s. Это максимальное качество для аудио.
  • audio.mp3
    имя выходного файла audio.mp3.

Теперь поменяем 22050 Hz вместо 44100 Hz, сделаем моно , понизим bitrate и сгенерим MP2 файл вместоf MP3:

$ ffmpeg -i audio.wav -acodec mp2 -ac 1 -ar 22050 -ab 64k audio.mp2
 FFmpeg version SVN-r9607, Copyright (c) 2000-2007 Fabrice Bellard, et al.
   configuration:  {snipped for brevity}
   libavutil version: 49.4.1
   libavcodec version: 51.40.4
   libavformat version: 51.12.1
   built on Jul 12 2007 20:22:46, gcc: 3.4.6
 Input #0, wav, from 'audio.wav':
   Duration: 00:05:08.1, start: 0.000000, bitrate: 1411 kb/s
   Stream #0.0: Audio: pcm_s16le, 44100 Hz, stereo, 1411 kb/s
 Output #0, mp2, to 'audio.mp2':
   Stream #0.0: Audio: mp2, 22050 Hz, mono, 64 kb/s
 Stream mapping:
   Stream #0.0 -> #0.0
 Press [q] to stop encoding
 size=    2407kB time=308.1 bitrate=  64.0kbits/s
 video:0kB audio:2407kB global headers:0kB muxing overhead 0.000000%

audio.mp2 еще меньше , чем audio.mp3.

Теперь сконвертируем этот MP2 назад в WAV PCM с 8-bit вместо 16-bit. Для WAV PCM bit rate не нужен :

$ ffmpeg -i audio.mp2 -acodec pcm_u8 audio.8bit.wav
 FFmpeg version SVN-r9607, Copyright (c) 2000-2007 Fabrice Bellard, et al.
   configuration:  {snipped for brevity}
   libavutil version: 49.4.1
   libavcodec version: 51.40.4
   libavformat version: 51.12.1
   built on Jul 12 2007 20:22:46, gcc: 3.4.6
 Input #0, mp3, from 'audio.mp2':
   Duration: 00:05:08.1, start: 0.000000, bitrate: 63 kb/s
   Stream #0.0: Audio: mp2, 22050 Hz, mono, 64 kb/s
 Output #0, wav, to 'audio.8bit.wav':
   Stream #0.0: Audio: pcm_u8, 22050 Hz, mono, 176 kb/s
 Stream mapping:
   Stream #0.0 -> #0.0
 Press [q] to stop encoding
 size=    6635kB time=308.1 bitrate= 176.4kbits/s
 video:0kB audio:6635kB global headers:0kB muxing overhead 0.000648%

Для вывода поддерживаемых форматов надо набрать команду :

$ ffmpeg -formats

BASIC VIDEO TRANSCODING

Попробуем заграбить Flash Video - .flv файл.

Выполним команду :

$ ffmpeg -i kitty.flv
 {output snipped}
 Seems that stream 1 comes from film source: 1000.00 (1000/1) -> 25.00 (25/1)
 Input #0, flv, from 'kitty.flv':
   Duration: 00:01:43.4, start: 0.000000, bitrate: N/A
   Stream #0.0: Audio: mp3, 22050 Hz, mono
   Stream #0.1: Video: flv, yuv420p, 320x240, 25.00 fps(r)

Это mono , 22050 Hz , MP3-encoded. Кодек - "flv" (Flash Video), "yuv420p" - кодирование цвета , разрешение - 320x240 , frame rate - 25 frames в секунду. Выполним команду :

$ ffmpeg -i kitty.flv -target ntsc-dvd -aspect 4:3 kitty.mpg
 {snipped}
 Seems that stream 1 comes from film source: 1000.00 (1000/1) -> 25.00 (25/1)
 Input #0, flv, from 'kitty.flv':
   Duration: 00:01:43.4, start: 0.000000, bitrate: N/A
   Stream #0.0: Audio: mp3, 22050 Hz, mono
   Stream #0.1: Video: flv, yuv420p, 320x240, 25.00 fps(r)
 Output #0, dvd, to 'kitty.mpg':
   Stream #0.0: Video: mpeg2video, yuv420p, 720x480, q=2-31, 6000 kb/s, 29.97 fps(c)
   Stream #0.1: Audio: ac3, 48000 Hz, mono, 448 kb/s
 Stream mapping:
   Stream #0.1 -> #0.0
   Stream #0.0 -> #0.1
 Press [q] to stop encoding
 frame= 3095 q=2.0 Lsize=   45130kB time=103.2 bitrate=3581.1kbits/s
 video:31666kB audio:5660kB global headers:0kB muxing overhead 20.909333%

Пояснения :

  • -target ntsc-dvd
    "-target" - целевая команда - что делать с результатом - NTSC DVD-Video. При этом - устанавливаются MPEG2 video, yuv420p color encoding, 720x480 pixel image size, 6 mbit/s bit rate, 29.97 frames в секунду . audio - ac3-encoded , rate - 48 KHz, mono , 448 kbit/s. Это стандарт для DVD-Video.
  • -aspect 4:3
    MPEG2 video позволяет т.н. anamorphic дисплэй - при этом aspect ratio (отношение ширины к высоте) может зависеть от соотношения физической ширины самого пиксела к высоте пиксела. Стандарт DVDs таков , что картинка будет растягиваться так , чтобы aspect ratio оставался таким , каким он задан в опции '-aspect'.

Попробуем получить файл меньшего размера :

$ ffmpeg -i kitty.flv -target ntsc-dvd -b 2000k -acodec mp2 -ar 22050 -ab 64k -aspect 4:3 kitty2.mpg
 {snipped}
 Seems that stream 1 comes from film source: 1000.00 (1000/1) -> 25.00 (25/1)
 Input #0, flv, from 'kitty.flv':
   Duration: 00:01:43.4, start: 0.000000, bitrate: N/A
   Stream #0.0: Audio: mp3, 22050 Hz, mono
   Stream #0.1: Video: flv, yuv420p, 320x240, 25.00 fps(r)
 Output #0, dvd, to 'kitty2.mpg':
   Stream #0.0: Video: mpeg2video, yuv420p, 720x480, q=2-31, 2000 kb/s, 29.97 fps(c)
   Stream #0.1: Audio: mp2, 22050 Hz, mono, 64 kb/s
 Stream mapping:
   Stream #0.1 -> #0.0
   Stream #0.0 -> #0.1
 Press [q] to stop encoding
 frame= 3095 q=4.7 Lsize=   27174kB time=103.2 bitrate=2156.3kbits/s
 video:21521kB audio:809kB global headers:0kB muxing overhead 21.696595%

Имеем:

27208 -rw-r--r--  1 howard users 27826176 2006-10-12 21:36 kitty2.mpg
  4252 -rw-r--r--  1 howard users  4340341 2006-10-11 13:31 kitty.flv
 45184 -rw-r--r--  1 howard users 46213120 2006-10-12 13:25 kitty.mpg

Второй MPEG меньше, чем первый , но оба они больше , чем оригинальный Flash Video file. Попробуем сделать транскод в MPEG4, с размером 320x240 , frame rate = 10 fps :

$ ffmpeg -i kitty.mpg -vcodec mpeg4 -s 320x240 -b 300k -r 10 -acodec mp3 -ar 22050 -ab 64k -f avi kitty.avi
 {snipped}
 Input #0, mpeg, from 'kitty.mpg':
   Duration: 00:01:42.8, start: 0.500000, bitrate: 3595 kb/s
   Stream #0.0[0x1e0]: Video: mpeg2video, yuv420p, 720x480, 9000 kb/s, 29.97 fps(r)
   Stream #0.1[0x80]: Audio: ac3, 48000 Hz, mono, 448 kb/s
 Output #0, avi, to 'kitty.avi':
   Stream #0.0: Video: mpeg4, yuv420p, 320x240, q=2-31, 300 kb/s, 10.00 fps(c)
   Stream #0.1: Audio: mp3, 22050 Hz, mono, 64 kb/s
 Stream mapping:
   Stream #0.0 -> #0.0
   Stream #0.1 -> #0.1
 Press [q] to stop encoding
 frame= 1034 q=4.3 Lsize=    4837kB time=103.4 bitrate= 383.2kbits/s

Примечания:

  • video codec устанавливается опцией "-vcodec" , размер картинки - "-s" option, video bitrate - "-b" , frame rate - "-r".
  • "-f" - формат контейнера

УПРАВЛЕНИЕ РАЗМЕРОМ КАРТИНКИ

Возьмем исходный kitty.flv и сделаем его широкоформатным MPEG-ом , как в DVD-Video. Проблема в том , что aspect ratio = 4:3, а не 16:9 . Текущий размер - 320x240. Если нам нужен широко-экранный aspect ratio, его высота должна быть 320/(16/9)=180 вместо 240. При этом картинка деформируется . Придется пожертвовать частью картинки , обрезать ее , т.е. сделать т.н. "crop" . Мы уберем по 30 пикселов сверху и снизу : и получим нужный формат 16:9 NTSC DVD:

$ ffmpeg -i kitty.flv -croptop 30 -cropbottom 30 -target ntsc-dvd -aspect 16:9 kitty.169.mpg

Теперь переведем формат 16:9 NTSC в 480x360 AVI с частотой в 15 фреймов в секунду У нас останутся черные полосы сверху и снизу для сохранения aspect ratio:

$ fmpeg -i kitty.169.mpg -acodec mp3 -ar 44100 -ab 128k -vcodec msmpeg4v2 -b 500k \
 -s 480x270 -r 15 -padtop 44 -padbottom 46 -padcolor 000000 -f avi kitty.letterbox.avi

Пояснения:

  • При ширине 480 получаем высоту 480/(16/9)=270
  • Высоту 270 нужно довести до 360 для получения 4:3 aspect ratio, поэтому мы добавляем 90 . Мы выбираем 44 и 46 , потому что эти числа должны быть четными , поэтому 45 использовать нельзя .
  • Цвет рамки задается в формане # html - 000000

ПОКАДРОВАЯ ОБРАБОТКА

Иногда возникает необходимость посмотреть несколько секунд или минут ролика. Опция "-t" помогает определить размер такого куска . Можно определить продолжительность просто в виде числа секунд (напр: "-t 90" если вы хотите полторы минуты видео) или использовать формат hh:mm:ss.sss (напр: "-t 00:02:37.200" для 2 минут и 37.2 секунд).

Если нужен кусок не с начала , можно определить , сколько надо отмотать , прежде чем начнется выдирание : для этого есть опция "-ss" , например , взять 12-минутный кусок не с начала , а через 3 минуты после старта ролика : "-ss 180" или "-ss 00:03:00", затем "-t 720" или "-t 00:12:00".

Вырезание AUDIO или VIDEO

Мы можем заменить аудио-дорожку в ролике или извлечь ее в формате mp3 .

Опция "-an" оставляет только видео-поток , уменьшая размер самого ролика .

Опция "-vn" делает то же самое для звука . Мы извлечем звук из него , при этом sample rate будет равен 44100 Hz , 16-bit и 2 канала (stereo) , получив на выходе WAV :

$ ffmpeg -i mandelbrot.flv -vn -acodec pcm_s16le -ar 44100 -ac 2 mandelbrot.wav

Формат аудио внутри ролика может быть MP3 :

Input #0, flv, from 'mandelbrot.flv':
   Duration: 00:04:25.7, start: 0.000000, bitrate: N/A
   Stream #0.0: Audio: mp3, 22050 Hz, mono
   Stream #0.1: Video: flv, yuv420p, 320x240, 29.97 fps(r)

Можно извлечь его напрямую , без конвертации :

$ ffmpeg -i mandelbrot.flv -vn -acodec copy mandelbrot.mp3

MAPPING CHANNELS

Стандартный DVD включает 8 аудио-потоков . ffmpeg будет работать с одним . Посмотрим на формат vob-а :

$ ffmpeg -i mr.vob
 FFmpeg version SVN-r9607, Copyright (c) 2000-2007 Fabrice Bellard, et al.
 {snipped}
 Seems that stream 0 comes from film source: 25.00 (25025/1001) -> 25.00 (25/1)
 Input #0, mpeg, from 'mr.vob':
   Duration: 00:03:16.2, start: 620.890956, bitrate: 7704 kb/s
   Stream #0.0[0x1e0]: Video: mpeg2video, yuv420p, 720x576, 6799 kb/s, 25.00 fps(r)
   Stream #0.1[0x89]: Audio: dts, 48000 Hz, stereo, 768 kb/s
   Stream #0.2[0x80]: Audio: ac3, 48000 Hz, 5:1, 384 kb/s
   Stream #0.3[0x83]: Audio: ac3, 48000 Hz, stereo, 96 kb/s
   Stream #0.4[0x82]: Audio: ac3, 48000 Hz, stereo, 96 kb/s
   Stream #0.5[0x84]: Audio: ac3, 48000 Hz, stereo, 192 kb/s
   Stream #0.6[0x2d]: Subtitle: dvdsub
   Stream #0.7[0x2c]: Subtitle: dvdsub
   Stream #0.8[0x2b]: Subtitle: dvdsub
   Stream #0.9[0x2a]: Subtitle: dvdsub
   Stream #0.10[0x29]: Subtitle: dvdsub
   Stream #0.11[0x28]: Subtitle: dvdsub
   Stream #0.12[0x27]: Subtitle: dvdsub
   Stream #0.13[0x26]: Subtitle: dvdsub
   Stream #0.14[0x25]: Subtitle: dvdsub
   Stream #0.15[0x24]: Subtitle: dvdsub
   Stream #0.16[0x23]: Subtitle: dvdsub
   Stream #0.17[0x22]: Subtitle: dvdsub
   Stream #0.18[0x21]: Subtitle: dvdsub
   Stream #0.19[0x20]: Subtitle: dvdsub

Первый поток - stream - #0.0 - это видео-поток. #0.1 - DTS-encoded sound track , #0.2 - AC3-encoded Dolby 5:1 sound track. #0.3 - #0.5 - это стерео аудио-потоки с комментами . Допустим мне нужен моно MP3 с комментариями из 3-го потока . Если ffmpeg-у не сказать номер потока , он начнет транскодить первый попавшийся , т.е. DTS . Используем опцию "-map" :

$ ffmpeg -i mr.vob -map 0:3 -vn -acodec mp3 -ar 22050 -ab 96k -ac 1 mr.mp3

"-map input:stream" указывает ffmpeg-у на нужный поток . ffmpeg может обрабатывать сразу несколько файлов . "input" начинается с 0 для первого файла , 1 для второго и т.д."stream" - число потоков , которые мы хотим обработать , также начинается с нуля . "-map 0:3" означает , что мы хотим использовать 4-й поток из первого файла .

"-map" можно использовать для генерации нового ролика из .vob , например #0.0 для видео и #0.5 для аудио. Первый "-map" определяет видео-поток и второй - аудио-поток :

$ ffmpeg -i mr.vob -map 0:0 -map 0:5 -vcodec mpeg4 -b 1000k \
 -s 640x360 -acodec mp3 -ar 22050 -ab 64k -ac 1 -f avi mr.avi

MULTIPLE SOURCES

Следующая технология описывает , как vob-формат переложить в мпег :

  1. берем видео из .vob и аудио из выделенного ранее .wav файла и транскодируем на лету :
$ ffmpeg -i oldmovie.vob -i altered_audio.wav -map 0:0 -map 1:0 -target ntsc-dvd \
 -b required_video_bit_rate -aspect 16:9 newmovie.mpg

Или используя MP2 audio с низким bit rate:

$ ffmpeg -i oldmovie.vob -i altered_audio.wav -map 0:0 -map 1:0 -target ntsc-dvd \
 -b required_video_bit_rate -acodec mp2 -ab audio_bit_rate -aspect 16:9 newmovie.mpg

ПАУЗЫ

Иногда звук и видео могут рас-синхронизироваться . Их можно поставить в соответствие друг другу :

$ ffmpeg -i input_1 -itsoffset 00:00:03.5 -i input_2 ...........

Здесь input_2 стартует через 3.5 секунды после старта input_1.

Можно определить несколько синхронизаций :

$ ffmpeg -i video_source -itsoffet delay -i audio_source -map 0:x -map 1:y ......

Обратная задача - когда видео отстает от звука :

$ ffmpeg -i audio_source -itsoffet delay -i video_source -map 1:x -map 0:y ......

ANAMORPHIC VIDEO

Речь идет о ситуации , когда физическое изображение отображаемое на экране, имеет те же пропорции, что и число пикселов, составляющих ширину и высоты изображения. Например , Flash Video имеет разрешение 320x240 пикселов , и aspect ratio of 4:3. 320/240 = 4/3. Мы обрежем пустые края в 16:9 DVD-Video и приведем его к виду 4:3.

Картинку нужно сжать , чтобы перейти от пиксельного aspect ratio к физическому aspect ratio.

Картинка в формате NTSC DVD-Video имеет разрешение 720x480 пикселов. Пиксельный aspect ratio = 720/480. Физический aspect ratio - 16:9 . Если мы разделим физический aspect ratio на пиксельный aspect ratio , мы получим Anamorphic Factor, который называется delta δ, который представляет aspect ratio самого пиксела .

Возможны 3 варианта :

  • δ > 1 − Картинка растягивается по горизонтали
  • δ = 1 − pixel aspect ratio = physical aspect ratio
  • δ < 1 − Изображение сжимается по горизонтали .

В данном случае: δ = 16/9 / (720/480)
δ = 16/9 x 480/720 = (16x480)/(9x720) = 7680/6480 = ( 2^9 x 3 x 5 ) / ( 2^4 x 3^4 x 5 ) = 2^5 / 3^3
δ = 32/27

речь идет о том , чтобы обрезать картинку для поддержки anamorphic factor.

Вычислим величину "W" :

W/H x δ = 4/3, or
W = 4/3 x H/δ

H=480 пикселов. Отсюда W=540 pixels

Если мы уберем 180 пикселов , уменьшив ширину 720 до 540 то получим требуемое aspect ratio = 4:3:

540/480 x δ = 540/480 x 32/27 = ( 540 x 32 ) / ( 480 x 27 ) = 17280 / 12960 = 2^7x3^3x5 / ( 2^5x3^4x5 ) = 4/3
QED.

Таким образом , чтобы трансформировать масштаб 16:9 NTSC video в 4:3 video, нужно сделать следующее :

$ ffmpeg -i original_video -cropleft 90 -cropright 90 \
 -target ntsc-dvd ........ -aspect 4:3 output_video

Вместо обрезания, добавим черные бары сверху и снизу:

δ' = 4/3 / (720/480) = ( 480 x 4 ) / ( 720 x 3 ) = 160 / 180 = 8/9

Мы видим, что 4:3 video для NTSC DVD имеет anamorphic factor меньший чем 1, что означает , что картинка будет сплющена по горизонтали .

Определим высоту картинки :

H' = ( H / δ ) x δ' = ( 480 / (32/27) ) x 8/9 = 15 x 27 x 8/9 = 3240/9 = 360

Проверка :

720/360 x 8/9 = 5760/3240 = (2^7 x 3^2 x 5) / (2^3 x 3^4 x 5) = 2^4 / 3^2 = 16/9
QED.

Нужно добавить 120 пикселов по высоте :

$ ffmpeg -i input_video -target ntsc-dvd ............. \
 -s 720x360 -padtop 60 -padbottom 60 -padcolor 000000 -aspect 4:3 output_video

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

     $  ffmpeg -sameq -ss 00:50:00 -t 1000 -i input.avi -y output.avi
   




Пример:
Следующий сценарий я привожу в качестве того, как можно обработать видеоматериал, используя лишь командную строку. Вся работа сделана с помощью одной программы - ffmpeg.
Исходные данные: имеются видеофайлы, снятые видеокамерой: 01.avi, 02.avi, 03.avi, 05.avi, 06.avi, 07.avi, 08.avi. Они имеют формат видео mjpeg, разрешение - 640x480. Нужно реализовать следующий сценарий:
1. В файлах 01, 02, 03, 08 добавить текст в нижней части экрана
2. В файлах 03, 05, 06, 07 полностью заменить исходный звук на музыкальный фон
3. В файле 08 на исходный звук наложить фоновую музыку
4. Слить все фидеофайлы в один итоговый файл

Для реализации этого сценария понадобятся два внешних mp3-файла с музыкой - 03.mp3, 08.mp3. Также понадобятся 4 картинки с текстом размером 640x30 пикселов, сделанные в gimp-е - 01.png, 02.png, 03.png, 08.png. Также понадобятся 4 текстовых файла: list-01-02.txt, list-01-07.txt, list-01-08.txt, list-03-07.txt:

     list-01-02.txt:
     
     file '_01.avi'
     file '_02.avi'
   

     list-01-07.txt:
     
     file '_01-02.avi'
     file '_03-07.avi'
   

     list-03-07.txt:
     
     file '_03.avi'
     file '_05.avi'
     file '_06.avi'
     file '_07.avi'
   

     list-01-08.txt:
     
     file '_01-07.avi'
     file '__08.avi'
   

Мой сценарий выглядит так:

 #!/bin/sh
 
 ########################## накладываем на видео  сверху картинку
 ####### при этом происходит конвертация видео-формата mjpeg в mpeg4
 ####### параметр between(t,0,18) - здесь 18 - это полное время всего видеофайла в секундах
 ffmpeg -i 01.avi -i 01.png -y -filter_complex "[0:v][1:v] overlay=0:400:enable='between(t,0,5)'" -qscale 0 _01.avi.
 ffmpeg -i 02.avi -i 02.png -y -filter_complex "[0:v][1:v] overlay=0:400:enable='between(t,0,18)'" -qscale 0 _02.avi
 ffmpeg -i 03.avi -i 03.png -y -filter_complex "[0:v][1:v] overlay=0:400:enable='between(t,0,43)'" -qscale 0  _03.avi
 ffmpeg -i 05.avi -i 03.png -y -filter_complex "[0:v][1:v] overlay=0:600:enable='between(t,0,95)'" -qscale 0  _05.avi
 ffmpeg -i 06.avi -i 03.png -y -filter_complex "[0:v][1:v] overlay=0:600:enable='between(t,0,35)'" -qscale 0  _06.avi
 ffmpeg -i 07.avi -i 03.png -y -filter_complex "[0:v][1:v] overlay=0:600:enable='between(t,0,32)'" -qscale 0  _07.avi
 ffmpeg -i 08.avi -i 08.png -y -filter_complex "[0:v][1:v] overlay=0:450:enable='between(t,0,80)'" -qscale 0  _08.avi
 
 
 ##################################3 конкатенация видео
 ffmpeg -y -f concat -i list-01-02.txt -c copy _01-02.avi
 ffmpeg -y -f concat -i list-03-07.txt -c copy 03-07.avi
 
 ######################## заменяем шум на музыку
 ffmpeg -y -i 03-07.avi -i 03.mp3 -map 0:v -map 1:a -codec copy -shortest _03-07.avi
 
 ffmpeg -y -f concat -i list-01-07.txt -c copy _01-07.avi
 
 ###### 1. копируем аудио-дорожку из видео в отдельный mp3-файл
 ffmpeg -y -i _08.avi -acodec libmp3lame  _08.mp3
 ###### 2. Обьединяем два mp3 в один
 ffmpeg -y -i 08.mp3 -i _08.mp3 -filter_complex "[0:a][1:a]amerge[aout]" -map "[aout]" __08.mp3
 ##### 3.  заменяем звуковую дорожку оргинала на внешний аудио-файл с самого начала
 ffmpeg -y -i _08.avi -i __08.mp3 -map 0:v -map 1:a -codec copy -shortest __08.avi
 
 ########################## делаем финальную конкатенацию
 ffmpeg -y -f concat -i list-01-08.txt -c copy _01-08.avi
 
 
   

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

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье
jen
  Отличная мануала!
спасибо!
2010-11-20 08:46:21
ArtIMen
  Спасибо, легко нашёл всё нужное.
2010-12-22 17:41:19
Митя
  Спасибо! Освободили от тягостного перевода)
2011-02-28 16:35:00
Ruslan
  Спасибо, помогло объяснение про -map
2011-07-14 17:31:50
Den
  Хороший мануал. 
У меня есть рекордер пишущий в mpeg2 720x576, я записал с тв-эфира широкоформатное видео, 
но оно воспроизводится на всех широкоформатных дисплеях с полосами по боках, как его 
перекодировать в таком случае.
2011-12-23 16:13:15
Яковлев Сергей
  Пропорция должна быть 4:3 или 16:9 - тогда черных полос не будет
2011-12-23 16:29:02
Антон
  Хорошая статья, вот только я не пойму как из Mp3 сконвертировать aac
2012-06-12 00:37:00
Яковлев Сергей
  вроде вот так можно:

ffmpeg   -i input.mp3    -acodec aac   -ab 128    output.aac


2012-06-12 11:29:19
AlexandeRRR
  Всем привет!
 У меня такая проблема: есть прога (по изуч. Английского) которая читает видеофайлы формата .mov , так вот часть файлов нечаяно удалил. 
Скачал их в другом формате .mp4 в инете. Пытался их перекодировать с помощью FFmpeg в .mov, всё получилось однако файлы ни читаются этой прогой (по изуч. Английского). 
Думаю, что проблема в параметрах. Данные файла, который читается такие:
 Duration: 00:01:50.2, start: 0.000000, bitrate: 680 kbs
 Stream #0.0(eng): Video: svq1, yuv410p, 320x240, 15.00 fps(r)
 Stream #0.1(eng): Audio: mp2. 44100 Hz, stereo
 Stream #0.2(eng): Data: text  0x74786574
 Короче помогите написать код в файле .bat, чтобы контертнуть в формат .mov с такими же параметрами файл .mp4
 Заранее благодарен!!!

2014-02-01 23:59:12
Яковлев Сергей
  Можно попробовать так:
 ffmpeg -i input_file.mp4 -acodec copy -vcodec copy -f mov output_file.mov
или так:
ffmpeg -i input.mp4 -c:v libx264 -preset fast -profile:v baseline out.mov
или так
ffmpeg -i input.mp4 -s 212x120 -y -strict experimental -acodec aac -ab 96k -ac 2 -ar 48000 -vcodec mov -vprofile baseline -g 48 -b 85000 
-level 30 -threads 64 input.mov

2014-02-02 11:14:59
tuck
  Немножко не понял про рассинхрон виео и звука. Есть видео KINO.MP4, где звук отстает на 2 секунды. 
Какая должна быть строка кодиования?
И еще, рассказывалось, что ffmpeg умеет в одной строке кодирования пожать сразу два файла. 
Один, например в Divx с качеством видео 4, второй файл тоже в дивыкс, но с качеством 6. 
Понятно, что можно кодирование с "6" поставить в новую строку bat-файла, но интересен вышеуказанный способ.
Заранее спасибо.
2014-02-16 04:17:15
Яковлев Сергей
  Для ликвидации рассинхронизации между видео и аудио можно использовать следующий пример:

 ffmpeg -i original.avi -itsoffset 2 -i original.avi -map 0:0 -map 1:1  -acodec copy -vcodec copy synced.avi

Исходный файл - original.avi.  
В команде этот входящий параметр параметр указывается дважды - -i original.avi
В исходном файле по умолчанию первым потоком идет видео, и оно берется первым - -map 0:0
Ффмпег извлекает видео и аудио независимо друг от друга, но результат сливает в один с исходным
качеством -   -acodec copy -vcodec copy
Также мы говорим делать отставание в звуке на 2 секунды -  -itsoffset 2.

2014-02-16 12:08:17
Alex
  Здравствуйте!
Помогите разобраться в одном деле. Есть куча видео файлов с ip-видео камер, 
файлики по 128Мгб около 3,5 минут длительностью в формате mpeg-ts. Подробнее
General
ID                             : 256 (0x100)
Complete name                  : F:123
ecord04D5E_192.168.1.123_12014-12-0204D5E_192.168.1.123_1_20141202234304.ts
Format                         : MPEG-TS
File size                      : 128 MiB
Duration                       : 3mn 28s
Overall bit rate mode          : Variable
Overall bit rate               : 5 156 Kbps

Video
ID                             : 4113 (0x1011)
Menu ID                        : 4096 (0x1000)
Format                         : AVC
FormatInfo                    : Advanced Video Codec
Format profile                 : Baseline@L4.0
Format settings, CABAC         : No
Format settings, ReFrames      : 1 frame
Format settings, GOP           : M=1, N=50
Codec ID                       : 27
Duration                       : 3mn 28s
Bit rate                       : 4 902 Kbps
Width                          : 1 280 pixels
Height                         : 720 pixels
Display aspect ratio           : 16:9
Color space                    : YUV
Chroma subsampling             : 4:2:0
Bit depth                      : 8 bits
Scan type                      : Progressive
Stream size                    : 122 MiB (95%)

Menu
ID                             : 4096 (0x1000)
Menu ID                        : 4096 (0x1000)
Duration                       : 3mn 28s
List                           : 4113 (0x1011) (AVC)

Инфа из Media Player Classic
Можно ли при помощи ffmpeg конвертить каким либо образом чтобы уменьшить их размер?
В мануале что то подобных примеров не встретил..
Заранее благодарен.
2014-12-09 10:10:15
Яковлев Сергей
  Формат AVC - он же h.264 - можно сконвертировать например вот так:

      ffmpeg -i input.mts -vcodec mjpeg -b 100M -acodec pcm_s16be output.mov

 или вот так

       ffmpeg -i input.m2ts -c:v copy -c:a aac -strict experimental -b:a 128k output.mp4
2014-12-09 16:06:16
Алла
  Всё, разобралась сама.
Вот так можно сделать в bat-файле, чтобы был одинаковый звук слева и справа:
Так суммировать исходные левый и правый:
set pan="pan=stereo|c0=c0+c1|c1=c0+c1"
Так брать только один левыйправый:
set pan="pan=stereo|c0=c0"
set pan="pan=stereo|c1=c1"
ffmpeg -report -i input.VOB -map 0:1 -map 0:2 -vcodec rawvideo -vf "yadif=mode=send_frame:parity=tff:deint=all,
 scale=w=768:h=576:interl=0:flags=lanczos" -af %pan% -acodec pcm_s16le -ar 48000 -ac 2 output.avi
2015-03-02 05:04:47
Rony
  Privet vsem! Skajite pojaluysta kak mojna odnoy comandoy pre vixode poluchit 3 raznie video, 720, 480, 360 
2016-01-10 12:15:42
Яковлев Сергей
  Для того, чтобы распараллелить вывод в разные файлы с разным качеством, можно использовать обратный слэш:
ffmpeg -i input.avi -s 1280x720   output1.avi \
	-s  640x480  output2.avi \
	-s  320x240  output3.avi 

Если нужно положить в один контейнер несколько форматов, можно использовать -filter_complex:
ffmpeg  -i input.avi -filter_complex "[0:v]scale=1280x720;[0:v]scale=640x480;[0:v]scale=320x240"  output.mkv


2016-01-10 16:31:33
Rony
  Spasibo vam bolshoe :) Ochen pomoglo )
2016-01-23 10:37:56