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
Для хранения 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-формат переложить в мпег :
- берем видео из .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
ecord 04D5E_192.168.1.123_12014-12-02 04D5E_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 | |
|