Portál AbcLinuxu, 8. května 2024 11:14
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í?
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
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 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
Ne, na minci mi nepadla hlava, ale dáme šanci oběma projektům. Začneme tedy starou klasikou, projektem FFmpeg.
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
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
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
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.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.