Portál AbcLinuxu, 8. května 2024 11:14

Hrajeme si s FFmpeg/Libav (1/2)

8. 2. 2012 | Max Devaine
Články - Hrajeme si s FFmpeg/Libav (1/2)  

Co dnes na webu letí a jak připravit videa pro přehrávání na internetu, aby se na ně podívalo co nejvíce lidí? Co všechno vlastně dnešní webové prohlížeče podporují?

Obsah

Formát videa/audia + formát kontejneru a kodek

link

Je to stále omílaný problém, ale stále jej hodně lidí ignoruje, takže si budeme muset nuceně zopakovat, co je to formát videa/audia a kontejner.
Video soubor se velmi jednoduše řečeno skládá z těchto částí:

Když se vás tedy někdo zeptá, v jakém formátu máte nějaké video, tak informace o kontejneru je spíše irelevantní (mám to v avi, mkv apod.) a důležitější je informace o formátu, ve kterém byla video a audio stopa encodována (mám to v H.264 a AAC).

Nějaký rozsáhlejší text je třeba: Multimediální kontejner, Kontejner, Matroska: multimédia v úhledném balíčku

Co dnes letí?

link

Nejvíce se dnes používá toto:

BD-Ripy
MPEG-4 AVC, H.264 + AC3, DTS a to celé zabalené do kontejneru matroska (mkv)

Web
MPEG-4 AVC, H.264 + AAC + flv kontejner

Youtube
MPEG-4 AVC, H.264 + AAC + MP4 kontejner
MPEG-4 AVC, H.264 + AAC + flv kontejner
VP8 + Vorbis + webm kontejner

FFmpeg nebo Libav?

link

FFmpeg známe všichní, je to kolekce svobodného multiplatformního software, která nám přinesla možnost kódovat/dekódovat/převádět aj. pracovat s A/V streamy. Od začátku se jednalo o velmi kvalitní projekt, který nejen toto všechno umožnil na Linuxu, ale i na Windows a jiných platformách. Tento projekt stále žije a implementuje nové a nové funkce. A jak už to bývá, voda se občas vře, a tak se nám situace trochu komplikuje.

Libav je fork FFmpegu, zde na AbcLinuxu o tom bylo několik zmínek: Libav: fork FFmpegu, Libav 0.7, Libav 0.8

Podle některých jazyků jsou lidi kolem Libav ti hodní, kterým by se mělo fandit. Stručný souhrn událostí (pohled z jedné strany):

Co tedy teď? Pro co se rozhodnout? Dáme Libav šanci? Kdo do poslední chvíle neví, tak nechť to přenechá náhodě hlava(FFmpeg)/orel(Libav): Dice

FFmpeg

link

Ne, na minci mi nepadla hlava, ale dáme šanci oběma projektům. Začneme tedy starou klasikou, projektem FFmpeg.

GNU/Debian – FFmpeg distribučně

link

Jak dostat do debianu nějakou novější verzi FFmpeg místo postarší distribuční?

ffmpeg -version
FFmpeg version SVN-r0.5.6-4:0.5.6-3, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --extra-version=4:0.5.6-3 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libdirac --enable-libgsm --enable-libopenjpeg --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libfaad --enable-libdc1394 --enable-shared --disable-static
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 1 / 52.20. 1
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    0. 4. 0 /  0. 4. 0
  libswscale     0. 7. 1 /  0. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Dec 31 2011 16:14:46, gcc: 4.4.5

Jednoduše, nainstalujeme si FFmpeg z debian-multimedia, vizte http://wiki.debian.org/MultimediaCodecs.
Přesně tedy takto, nejdříve přidáme další repositář do balíčkovacího systému:

nano /etc/apt/sources.list
deb http://www.debian-multimedia.org squeeze main non-free

Ještě je potřeba přihodit klíče, ať máme do budoucna aspoň nějakou úroveň zabezpečení ze zmíněného repositáře :

wget http://www.debian-multimedia.org/pool/main/d/debian-multimedia-keyring/debian-multimedia-keyring_2010.12.26_all.deb
dpkg -i debian-multimedia-keyring_2010.12.26_all.deb

Nyní už jen stačí nainstalovat FFmpeg a nezbytné věci kolem :

aptitude update
aptitude install ffmpeg lame faad x264 w64codecs libvpx0 libtheora0
ffmpeg -version                                                                                                                                                                                                                    
ffmpeg version , Copyright (c) 2000-2011 the FFmpeg developers
  built on Jan 13 2012 08:07:42 with gcc 4.4.5
  configuration: --enable-libdc1394 --prefix=/usr --extra-cflags='-Wall -g ' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-avfilter --enable-libdirac --disable-decoder=libdirac --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-libvpx --enable-librtmp --extra-libs=-lgcrypt --disable-altivec --disable-armv5te --disable-armv6 --disable-vis
  libavutil    50. 43. 0 / 50. 43. 0
  libavcodec   52.123. 0 / 52.123. 0
  libavformat  52.111. 0 / 52.111. 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

Libav – kompilace

link

Na Libav si ukážeme kompilaci ze zdrojových kodů, která je velmi primitivní a lze takto samozřejmě postupovat i u projektu FFmpeg. U GNU/Debian Lenny se musely kompilovat všechny potřebné knihovny okolo, protože nebyly v repositáři „debian-multimedia“, ale u Squeezeho je to jiná káva, vše máme připraveno, takže se můžeme zabývat jen Libav.

Jen ještě připomenu, že repositář „debian-multimedia“ máme přidaný, jen jsme nic zatím neinstalovali a kdo instaloval, tak si zase odinstaluje :

aptitude remove ffmpeg

Nejdříve budeme potřebovat potřebné balíčky a vývojové nástroje :

aptitude install build-essential checkinstall yasm libtheora-dev libtheora0 libx264-dev libx264-118 libvpx0 libvpx-dev rtmpdump libopencore-amrnb-dev libopencore-amrwb-dev libmp3lame-dev libvorbis-dev libxvidcore-dev libopenjpeg-dev libfaac-dev libspeex-dev libdirac-dev libavc1394-dev libschroedinger-dev libx11-dev libgsm1-dev librtmp-dev libdc1394-22-dev libavutil-dev

Stáhneme si poslední verzi Libav, rozbalíme a jdeme na to:

wget -c http://libav.org/releases/libav-0.8.tar.gz
tar xvfz libav-0.8.tar.gz
cd libav-0.8
./configure --enable-libdc1394 --prefix=/usr --extra-cflags='-Wall -g ' --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --enable-avfilter --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-libvpx --enable-librtmp --disable-altivec --disable-armv5te --disable-armv6 --disable-vis --enable-libgsm --disable-debug
make
checkinstall --pkgname=libav --pkgversion "0.8.0`date +%Y%m%d`" --backup=no --default --maintainer=max@devaine.cz --install=no
dpkg -i libav_0.8.*_amd64.deb

Tak, máme nainstalováno, jen to tedy zkoukneme:

ffmpeg -version
ffmpeg version 0.8, Copyright (c) 2000-2011 the Libav developers
  built on Jan 27 2012 23:33:18 with gcc 4.4.5
This program is not developed anymore and is only provided for compatibility. Use avconv instead (see Changelog for the list of incompatible changes).
ffmpeg 0.8
libavutil    51. 21. 0 / 51. 21. 0
libavcodec   53. 34. 0 / 53. 34. 0
libavformat  53. 20. 0 / 53. 20. 0
libavdevice  53.  2. 0 / 53.  2. 0
libavfilter   2. 15. 0 /  2. 15. 0
libswscale    2.  1. 0 /  2.  1. 0
libpostproc  52.  0. 0 / 52.  0. 0

Jednoduše řečeno, spouštěč s názvem ffmpeg máme, ale s varováním, že již existují nekompatibilní změny a máme použít rovnou avconv, který ho nahrazuje. K přejmenování došlo u těchto nástrojů :
ffmpeg -> avconv
ffplay -> avplay
ffprobe -> avprobe
ffserver -> avserver

avconv -version
avconv version 0.8, Copyright (c) 2000-2011 the Libav developers
  built on Jan 27 2012 23:33:18 with gcc 4.4.5
avconv 0.8
libavutil    51. 21. 0 / 51. 21. 0
libavcodec   53. 34. 0 / 53. 34. 0
libavformat  53. 20. 0 / 53. 20. 0
libavdevice  53.  2. 0 / 53.  2. 0
libavfilter   2. 15. 0 /  2. 15. 0
libswscale    2.  1. 0 /  2.  1. 0
libpostproc  52.  0. 0 / 52.  0. 0

Na seznam podporovaných kodeků a formátů kontejnerů, které je schopné avconv kodovat a dekodovat, se můžeme podívat takto :

# seznam kodeků
avconv -codecs
# seznam formátů kontejnerů :
avconv -formats

Mediainfo

link

Jelikož budeme pracovat s A/V, tak by nebyl špatný nástroj, který by uměl číst metadata z A/V souborů. Mediainfo v tomto ohledu není vůbec špatný a je stále vyvíjený. Můžeme si ho tedy naistalovat:

wget -c http://dfn.dl.sourceforge.net/project/zenlib/ZenLib/0.4.23/libzen0_0.4.23-1_amd64.Debian_6.0.deb
wget -c http://garr.dl.sourceforge.net/project/mediainfo/binary/libmediainfo0/0.7.51/libmediainfo0_0.7.51-1_amd64.Debian_6.0.deb
wget -c http://freefr.dl.sourceforge.net/project/mediainfo/binary/mediainfo/0.7.51/mediainfo_0.7.51-1_amd64.Debian_6.0.deb

dpkg -i libzen0_0.4.23-1_amd64.Debian_6.0.deb
dpkg -i libmediainfo0_0.7.51-1_amd64.Debian_6.0.deb
dpkg -i mediainfo_0.7.51-1_amd64.Debian_6.0.deb

Použití je pak velmi jednoduché :

mediainfo WebM-demo.webm
General
Complete name                            : WebM-demo.webm
Format                                   : WebM
Format version                           : Version 2
File size                                : 1.12 MiB
Duration                                 : 36s 459ms
Overall bit rate mode                    : Variable
Overall bit rate                         : 257 Kbps
Writing application                      : google
Writing library                          : google

Video
ID                                       : 1
Format                                   : VP8
Codec ID                                 : V_VP8
Duration                                 : 36s 458ms
Bit rate                                 : 110 Kbps
Width                                    : 854 pixels
Height                                   : 480 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 24.000 fps
Compression mode                         : Lossy
Bits/(Pixel*Frame)                       : 0.011
Stream size                              : 488 KiB (43%)
Language                                 : English
Default                                  : Yes
Forced                                   : No

Audio
ID                                       : 2
Format                                   : Vorbis
Format settings, Floor                   : 1
Codec ID                                 : A_VORBIS
Duration                                 : 36s 459ms
Bit rate mode                            : Variable
Bit rate                                 : 128 Kbps
Channel(s)                               : 2 channels
Sampling rate                            : 44.1 KHz
Compression mode                         : Lossy
Stream size                              : 570 KiB (50%)
Language                                 : English
Default                                  : Yes
Forced                                   : No

Mediainfo není samozřejmě nic povinného, vše lze udělat i třeba za pomocí mplayeru, ale není to tak pěkné a neumí toho tolik :

mplayer -vo null -ao null -frames 0 -identify WebM-demo.webm
MPlayer2 c4093e7 (C) 2000-2011 MPlayer Team
162 audio & 361 video codecs
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing WebM Demo  with Leonardo Dicaprio - Shot with Red Camera.webm.
Cache fill: 13.95% (1169840 bytes)

ID_VIDEO_ID=0
[mkv] Track ID 1: video (V_VP8), -vid 0
ID_AUDIO_ID=0
ID_AID_0_LANG=und
[mkv] Track ID 2: audio (A_VORBIS), -aid 0, -alang und
[mkv] Will play video track 1.
Detected file format: Matroska
VIDEO:  [VP80]  854x480  24bpp  24.000 fps    0.0 kbps ( 0.0 kbyte/s)
Load subtitles in .
ID_FILENAME=WebM-demo.webm
ID_DEMUXER=mkv
ID_VIDEO_FORMAT=VP80
ID_VIDEO_BITRATE=0
ID_VIDEO_WIDTH=854
ID_VIDEO_HEIGHT=480
ID_VIDEO_FPS=24.000
ID_VIDEO_ASPECT=0.0000
ID_AUDIO_FORMAT=vrbs
ID_AUDIO_BITRATE=0
ID_AUDIO_RATE=44100
ID_AUDIO_NCH=2
ID_START_TIME=0.00
ID_LENGTH=36.46
ID_SEEKABLE=1
ID_CHAPTERS=0
[ass] auto-open
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Asking decoder to use 4 threads if supported.
Selected video codec: [ffvp8] vfm: ffmpeg (FFmpeg VP8)
==========================================================================
ID_VIDEO_CODEC=ffvp8
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
AUDIO: 44100 Hz, 2 ch, s16le, 0.0 kbit/0.00% (ratio: 0->176400)
ID_AUDIO_BITRATE=0
ID_AUDIO_RATE=44100
ID_AUDIO_NCH=2
Selected audio codec: [ffvorbis] afm: ffmpeg (FFmpeg Vorbis)
==========================================================================
AO: [null] 44100Hz 2ch s16le (2 bytes per sample)
ID_AUDIO_CODEC=ffvorbis
Starting playback...


Exiting... (End of file)
ID_EXIT=EOF

Něco podobného umí i ffprobe/avprobe:

avprobe -show_streams -show_format WebM-demo.webm
avprobe version 0.8, Copyright (c) 2007-2011 the Libav developer
  built on Jan 27 2012 23:33:18 with gcc 4.4.
[matroska,webm @ 0x12e2740] Estimating duration from bitrate, this
Input #0, matroska,webm, from 'WebM-demo.webm':
  Duration: 00:00:36.45, start: 0.000000, bitrate:
    Stream #0.0: Video: vp8, yuv420p, 854x480, PAR 1:1 DAR 427:240, 24 fps, 24 tbr, 1
    Stream #0.1: Audio: vorbis, 44100 Hz, stereo, s16 (
[STREAM]
index=0
codec_name=vp8
codec_long_name=On2 VP8
codec_type=video
codec_time_base=1/1000
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
width=854
height=480
has_b_frames=0
pix_fmt=yuv420p
level=-99
r_frame_rate=24/1
avg_frame_rate=1312499997/54687499
time_base=1/1000
start_time=0.000000 
duration=N/A
[/STREAM]
[STREAM]
index=1
codec_name=vorbis
codec_long_name=Vorbis
codec_type=audio
codec_time_base=0/1
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
sample_rate=44100.000000 
channels=2
bits_per_sample=0
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/1000
start_time=0.000000 
duration=N/A
[/STREAM]
[FORMAT]
filename=Webm-demo.webm
nb_streams=2
format_name=matroska,webm
format_long_name=Matroska/WebM file format
start_time=0.000000 
duration=36.459000 
size=1169840.000000 
bit_rate=0.000000 
[/FORMAT

Závěr

link

Kdo má ještě GNU/Debian Lenny, tak zde jsou moje poznámky z dob minulých, jak jsem bojoval s nasazením na jeden server (holt požadavek zákazníka): lenny-ffmpeg-git-howto.txt

Dnes to bylo přecijen takové hodně informativní a moc jsme si s ničím nepohráli, ale aspoň jsme připraveni. Příště by to mělo být mnohem lepší. Ukážeme si nějaké vzorové příklady pro převod videa, nějaké tipy, na co si dát pozor, zmíníme se o nějakých přehrávačích, povíme si něco o youtube a mnoho dalšího.

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.