FFmpeg

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
3. sor: 3. sor:
 
Az FFMPEG programokból és programkönyvtárakból tevődik össze. Ezek azt a feladatot hivatottak ellátni, hogy multimédiás tartalmat dolgozzanak fel. Így ugyanúgy felhasználhatóak hang, videó, átkódolására, mint közzétételére (broadcasting) és megtekintésére is.
 
Az FFMPEG programokból és programkönyvtárakból tevődik össze. Ezek azt a feladatot hivatottak ellátni, hogy multimédiás tartalmat dolgozzanak fel. Így ugyanúgy felhasználhatóak hang, videó, átkódolására, mint közzétételére (broadcasting) és megtekintésére is.
   
A fejlesztést Fabrice Bellard kezdte, aki az FFMPEG-en kívül a QEMU projekt alapítója is. 2004-től a projekt karbantartását Michael Niedermayer végzi. A fejlesztők többnyire az MPLAYER lejátszó fejlesztésében is részt vesznek. A programot GNU/Linux alatt írják, de számos operációs rendszerre létezik változata. Fordították x86-64, ARM, PowerPC architekrúrájú számítógépekre is.[[http://en.wikipedia.org/wiki/FFmpeg 2]]
+
A fejlesztést Fabrice Bellard kezdte, aki az FFMPEG-en kívül a QEMU projekt alapítója is. 2004-től a projekt karbantartását Michael Niedermayer végzi. A fejlesztők többnyire az MPLAYER lejátszó fejlesztésében is részt vesznek. A programot GNU/Linux alatt írják, de számos operációs rendszerre létezik változata. Fordították x86-64, ARM, PowerPC architekrúrájú számítógépekre is.[http://en.wikipedia.org/wiki/FFmpeg]
   
 
Alapvetően videó és audió kódolására használják. Képes a feliratok kezelésére is. Szinte minden hang- és mozgóképformátumot kezel és ismeri a hálózati protokollokat is. A fejlesztők igen gyakran integrálják lejátszóikba az FFMPEG programokönyvtárat.
 
Alapvetően videó és audió kódolására használják. Képes a feliratok kezelésére is. Szinte minden hang- és mozgóképformátumot kezel és ismeri a hálózati protokollokat is. A fejlesztők igen gyakran integrálják lejátszóikba az FFMPEG programokönyvtárat.

A lap 2012. december 5., 10:27-kori változata

Tartalomjegyzék

1 Mi is az az FFMPEG?

Az FFMPEG programokból és programkönyvtárakból tevődik össze. Ezek azt a feladatot hivatottak ellátni, hogy multimédiás tartalmat dolgozzanak fel. Így ugyanúgy felhasználhatóak hang, videó, átkódolására, mint közzétételére (broadcasting) és megtekintésére is.

A fejlesztést Fabrice Bellard kezdte, aki az FFMPEG-en kívül a QEMU projekt alapítója is. 2004-től a projekt karbantartását Michael Niedermayer végzi. A fejlesztők többnyire az MPLAYER lejátszó fejlesztésében is részt vesznek. A programot GNU/Linux alatt írják, de számos operációs rendszerre létezik változata. Fordították x86-64, ARM, PowerPC architekrúrájú számítógépekre is.[1]

Alapvetően videó és audió kódolására használják. Képes a feliratok kezelésére is. Szinte minden hang- és mozgóképformátumot kezel és ismeri a hálózati protokollokat is. A fejlesztők igen gyakran integrálják lejátszóikba az FFMPEG programokönyvtárat.

2 Összetevők

Maga az FFMPEG programcsomag az alábbi összetevőkből áll:

  • FFMPEG program, mely képes a különböző fájlok dekódolására. A dekódolt videót/videókat képes újrakódolni és akár több kimenetre egyszerre átkódolni. Ez a kimenet lehet hálózati folyam is és egyszerű avi fájl egyaránt.
  • Az FFSERVER egy kis erőforrásigényű streaming server, mely az FFMPEG programmal működik csak együtt. Az FFMPEG által átkódolt műsort képes szétszórni a kliensek között.
  • Az FFPLAY egy egyszerű videólejátszó, mely az FMPEG által kezelt formátumok megjelenítésére szolgál. Megjelenítéshez a platformfüggetlen SDL könyvtárat használja.

Maga a projekt nyílt forráskódú, szabad projekt, a GNU GPL vonatkozik rá. Amennyiben külső könyvtárakkal együtt fordítják le, pl. a libfaac és h264 könyvtárakkal, akkor a liszensz szigorodik, a mellé fordított könyvtárnak megfelelően GNU LGPL-re.Az FFMPEG fejlesztői komolyan veszik a jogi szabályozásokat, így létrehoztak egy szégyenfalat azok számára, akik nem mellékelik a módosított FFMPEG programkönyvtár forrását alkalmazásaik mellé.

3 Hol használják az FFMPEG-et?

Számtalan program és szolgáltatás használja az FFMPEG-et,az alábbiak a legelterjedtebbek.

  • A főként Linuxra fejlesztett Mplayer lejátszó fejlesztői részt vesznek az FFMPEG fejlesztésében is. A lejátszó így az teljes egészében az FFMPEG-re épül, sőt forrásként is sokan az MPLAYER-hez csatolt programkönyvtárt fordítják le, ha FFMPEG-re van szükségük. Windowsra az Mplayer-nek több változata is van, köztük az egyik legelterjedtebb KMPLAYER is, melyek mind az FFMPEG-re építenek.[3]
  • Az MPLAYER-nek létezik egy átkódoló változata, az MENCODER, ami szintén FFMPEG alapú.
  • A VLC media player is használja az FFMPEG codec könyvtárát[4].
  • A GOM player oldalán is sokáig lehetett találni linket az FFMPEG forrásához, azonban ez már nem elérhető.
  • A Youtube-ot[5] és a Facebook-ot[6] is érte gyanúsítás, hogy átkódolás során az FFMPEG-et futtatja. Ez azért is lehetséges, mert az FFMPEG-hez létezik API php alapú szkriptekhez is ffmpeg-php néven, mely a Vimeo.com oldalon is megtalálható.[7]
  • A HandBrake ingyenes MPEG4 kódoló is az FFMPEG könyvtárat használja.[8]


4 Hogyan szerezhető meg az FFMPEG?

A program forrása letölthető a projekt hivatalos weboldaláról. Az oldal hivatkozik külső, megbízható forrásokra, ahonnan különböző platformokra lefordított binárisokat találunk. A legtöbb Linux disztribúció csomaglistájában is megtalálható a program. Az FFMPEG fejlesztése folyamatos, ezért csomaglistákban lassan látszanak a változások. Ha a legfrissebb verziót kívánja használni a felhasználó, akkor saját magának célszerű lefordítani a programot forrásból. Általában ezek a verziók több hibajavítást és kísérleti kodeket tartalmaznak.

A fordításhoz Windows környezetben MinGW-re van szükségünk pontos leírás a honlapon található[[2]]. A fordítási paraméterek között adható meg, hogy a különböző programkönyvtárakat belefordítsa az exe-be vagy külön dll-ként tárolja. A másik fontos beállítás a licenszek meghatároása. Itt mondható meg, hogy a kapott dll tartalmazzon e LGPL alá tartozó elemeket is a GPL-eseken kívül. A program alapvetően platform független, minden operációs rendszerre található lefordítható változata.

5 Hogyan dolgozik az FFMPEG?

As FFMPEG a mai elterjedt legtöbb szabványt ismeri. Első lépésben azonosítja a fájl kiterjesztése szerint vagy a fejléc szerint a container-t. A Container a legkülső burok ami tartalmazhatja a multiplexált audio,video adatfolyamokat vagy a feliratokat. Mpeg2 szabvány esetén ezt transport streamnek is hívhatják, ami több különböző ún. program streamet tartalmaz. DVB-T esetén - ami a földi digitális műsorszolgáltatás alapja - egy analóg csatorna helyén egy digitális MPEG2 TS talállható,ami tartalmazza az MPEG2 PS-eket. Más Containerek is léteznek: ilyen pl. az AVI, Matroska(mkv), Ogg. A Container megállapítása után megkeresi a különböző adatfolyamokat.Ezek a kdekekkel tömörített video és audio streamek. Ezeket fogja sorrendhlyesen dekódolni lejátszásnál, átkódolásnál. A DVB-T-s példa esetén ez a video kodek a H.264, míg audio esetén az AAC kodek. A különböző nyelvek, külön stream-ként vannak elküldve.Minden kodeknek megvan a maga előnye és kora. A Wav és a Flac tömörítések képesek veszteségmentesen tömöríteni a hangot, míg a Canopus DV avi kb. JPEG fájlonként tömöríti a videót, míg az MPEG 2 kódolásnál már csak a képkockák közötti különbségeket és jóslási hibákat viszi át a rendszer. Természesen ezt már veszteséggel teszi arra alapozva, h. az emberi szem nem tökéletes (hang esetén a fül, pl. MP3). A veszteségesség határát, a tömörítés mértékét a rendelkezésre álló sávszélesség és a számítási kapacitás határozza meg. Ugyanabból a kodekből is léteznek különböző profilok, pl. H264 baseline iPadre vagy H264 High Quality pc-re. Az FFMPEG avcodec könyvtára ismeri a leggyakoribb kodekeket és hasonló egyéb esetén megpróbálja kitalálni.

6 Mi is az FFPROBE?

Maga a programcsomag rendelkezik egy segédeszközzel, mely csupán arra hivatott, hogy megállípítsa a videofájl felépítését. A Container típusát, a benne található streameket kiírja a standard kimenetre. Már az analízis során is több paraméter változtatható, pl. az analízis hossza, a titkosítás kulcsa(ha van). A parancs -h kapcsolóval az összes beállítható paraméterét kilistázza. Egyszerű AVI fájl tulajdonságainak kilistázása:

C:\ffmpeg-20121120-git-8b6aeb1-win32-static\bin>ffprobe.exe k:\mwt-hugo.avi
ffprobe version N-46936-g8b6aeb1 Copyright (c) 2007-2012 the FFmpeg developers
 built on Nov 20 2012 19:34:37 with gcc 4.7.2 (GCC)
 configuration: --enable-gpl --enable-version3 --disable-pthreads --enable-runt
ime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libass -
-enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enab
le-libgsm --enable-libmp3lame --enable-libnut --enable-libopenjpeg --enable-libo
pus --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheo
ra --enable-libutvideo --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-li
bvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --ena
ble-zlib
 libavutil      52.  8.100 / 52.  8.100
 libavcodec     54. 74.100 / 54. 74.100
 libavformat    54. 37.100 / 54. 37.100
 libavdevice    54.  3.100 / 54.  3.100
 libavfilter     3. 23.101 /  3. 23.101
 libswscale      2.  1.102 /  2.  1.102
 libswresample   0. 17.101 /  0. 17.101
 libpostproc    52.  2.100 / 52.  2.100
Input #0, avi, from 'k:\mwt-hugo.avi':
 Metadata:
    encoder         : VirtualDubMod 1.5.10.3 | www.virtualdub-fr.org || (build 2
550/release)
 Duration: 02:06:20.99, start: 0.000000, bitrate: 1982 kb/s
    Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv
420p, 720x400 [SAR 1:1 DAR 9:5], 23.98 tbr, 23.98 tbn, 23.98 tbc
    Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), s16, 448
kb/s

Látható, hogy a #0-s Container AVI-ként van multiplexálva és benne két stream található: egy mpeg4(XVID) videó és egy ac3 5.1-es hang. A parancs elején a fordítási kapcsolók is megjelenítésre kerülnek. Ez haszontalan információnak látszik, azonban ha a program nem ismer fel bizonyos formátumokat, érdemes ellenőrizni, hogy a dekódoláshoz szükséges modulokkal lett e lefordítva a program. Olyan fájloknál, amik metainformációként a fejezeteket is jelölik, ezek az adatok is kiolvashatóak a programból:

Input #0, matroska,webm, from 'k:\rep-sup.mkv':
 Metadata:
    creation_time   : 2012-11-09 01:30:59
 Duration: 01:38:38.97, start: 0.000000, bitrate: 6348 kb/s
    Chapter #0.0: start 0.000000, end 336.836000
    Metadata:
     title           : 00:00:00.000
    Chapter #0.1: start 336.836000, end 445.236000
    Metadata:
     title           : 00:05:36.836
    Chapter #0.2: start 445.236000, end 706.915000
    Metadata:
     title           : 00:07:25.236
    Chapter #0.3: start 706.915000, end 840.465000
    Metadata:
     title           : 00:11:46.915
    ...
    Metadata:
     title           : 01:17:22.847
    Chapter #0.22: start 5161.865000, end 5492.195000
    Metadata:
     title           : 01:26:01.865
    Chapter #0.23: start 5492.195000, end 5918.966000
    Metadata:
     title           : 01:31:32.195
    Stream #0:0(eng): Video: h264 (High), yuv420p, 1280x528, SAR 1:1 DAR 80:33,
23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Stream #0:1(eng): Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 1536 kb/s (de
fault)

Érdekesség, hogy a program ezeket az információkat standard error kimenetre írja,így nem irányíthatóak szövegfájlba a tulajdonságok. (Ellenben a súgó igen).

7 Mi is az az FFMPEG?

Az FFMPEG program végzi a videófájlok átkódolását. Elős lépésben ugynúgy kiolvassa a beadott bemeneti fájl/fájlok paramétereit, mint az ffprobe. Ezután azonban dekódolja a videót és a paraméterként megadott formátumban újra összerakja. Képes több bemenetet is összerakni, valamint videófolyamból képsorozatot előállítani. A kódolás közben nem a teljesítés százalékát mutatja, hanem információkat a kódolásról. Pl. a végső bitrátát(mekkora helyet foglal el az 1 mp anyag) és az időbélyeget. Egy tetszőleges film átkódolása sok jpg fájlba az alábbi paranccsal lehetséges:

D:\ffmpeg\bin>ffmpeg -i video.mpg image%d.jpg

A -i kapcsolóval adható meg a bemeneti fájl, míg a parancsot a kimeneti állomány zárja le. Bonyolultabb átkódolásoknál meg kell adni az átkódolás paramétereit. Pl. átkódolás OGG-be az alábbi módon tehető meg.

D:\ffmpeg\bin>ffmpeg -i d:\ffmpeg\test.m4v -vcodec theora -b:v 1000k -s 640x480
-r 25 -acodec libvorbis -ac 2 -b:a 128k -f ogg out.ogv

A fenti paranccsal kiválasztottuk, hogy theora codec-kel tömörítse újra a videófolyamot, adatsebessége 1000kbps legyen, méretezze át a videót 640x480 méretűre és 25 kép adjon egy másodpercet. A hang tömörítésére a vorbis könyvtárat használja, a hang 2 csatornát tartalmaz, egy másodperc hang mérete átlagosan 128kbit, a container formátum ogg és a kimenetet out.ogv néven menti.

Hibás vagy hiányzó adatok megadásakor a program egy beazonosíthatatlan hibaüzenettel lép ki, de az ezt megelőző sorok mi dig utalnak a hibás paraméterre. Egyes kodekek pl. h264 saját egyéb paramétereket igényelhetnek.

A használható kodekeket az ffmpeg -codecs, a containereket az ffmpeg -format parancs listázza ki. A fent megadot paraméterek a legtöbb kodek esetén elegendőek. A programmal különböző hangú anyagok is multiplexálhatóak, pl. több nyelvű filmek esetén. Ilyenkor a különböző streameket a map parancs segítségével kell átcsoportosítani.

d:\ffmpeg\bin>ffmpeg -i video.mpg -i audio_hun.aac -i audio_eng.aac \
-map 0:0 -map 0:1 -map 0:2 \
-vcodec copy -acodec copy -acodec copy -f mpegts newmovie.mpg

A fenti parancs a hang nélküli video.mpg fájlból és az angol és magyar hangokból készít egy olyan mpeg fájlt, ahol már választhatóak a hangok. Átkódolást nem végez, csupán átmásolja a streameket. Érdemes megfigyelni, hogy a bemenetek sorrendje adja a többi paraméter sorrendjét is. Az fffmpeg képes rögtön hálózati műsorszórásra is.

d:\ffmpeg\bin>ffmpeg -re -i out.ogv -c copy -f ogg rtmp://localhost/musor

A fenti parancs hatására rtmp protokollon keresztül kezdi el élő adatfolyamként sugározni a bemenetként megadott műsort. Ellenőrzéskor a kiválasztott protokollhoz tartozó port számot meg kell nyitni a tűzfalon.

Azért, hogy az internetes műsorszórás hatékonyabban működhessen, egy külső segédeszköz is létrejött FFSERVER néven.

8 Hogyan használható az FFSERVER?

Az FFSERVER egy speciális program a videók tömeges szórására. Az FFSERVER feladata, hogy az átkódolást és a műsorfolyam továbbítását szétválassza, a program a műsorszórásért felelős és az FFMPEG programmal szorosan összedolgozik. Több soros ffmpeg utasítás helyett még több soros, viszont könnyebben kezelhető és átláthatóbb konfigurációs fájlt kell készíteni. A konfigurációs fájl és az FFSERVER a kiszolgálón található, amely a műsorszórást végzi. Ezután két lehetőségünk van:

  • A műsorforrásra csatlakozunk egy, a szerveren futtatott FFMPEG-gel és ez végzi az átkódolást a kívánt formátumokba.(pull)
  • A műsorforráson futtatunk egy FFMPEG-et, amely elvégzi az átkódolást és az FFSERVER ennek csupán elosztását végzi. (push)

Az első esetben nincs szükségünk a forrásgépen FFMPEG-re, a szerver konfigurációs fájljában nem kell engedélyezni a hozzáférést a forrás IP címéről és az átkódolást is a szerver végzi, ami több kimenet és erős szerver esetén hasznos lehet.

A második esetben nincs szükség dupla átkódolásra, és műsorszórásra (műsorforrás gépen is és a szerveren is), viszont a forrást engedélyezni kell. Ebben az esetben a forrás gépen kell, hogy fusson az FFMPEG, így nem végezhető el bármilyen programmal a stream előállítására.

Az FFSERVER azért ragaszkodik az FFMPEG-hez, mivel a konfigurációs fájlja tulajdonképpen az elkészítendő adatfolyamokat határozza meg és ezt saját protokollon keresztül küldi át az átkódolást végző FFMPEG-nek. A program különlegessége, hogy egy bemenethez, amit FEED-nek neveznek, több kimenet is tartozhat, ezeket STREAM-nek hívják. A konfigurációs fájl viszonylag részletes leírást ad a lehetőségekről. Egy működő konfiguráció így néz ki:

# A port, ahol a szolgáltatás alapból figyel
Port 8090
# A cím, amin hallgasson
BindAddress 0.0.0.0
# Maximális kapcsolatok száma
MaxHTTPConnections 2000
# Maximális kliensek száma
MaxClients 600
# Maximális kiosztható sávszélesség
MaxBandwidth 600000
# Log helye
CustomLog /var/log/ffmpeg.log

# Első feed, mely a ffmpeg http://localhost:8090/feed.ffm
# utasítással érhető el
<Feed feed.ffm>
# Fájlba mentés helye és a maximális fájlméret.
# (opcionális)
File /tmp/feed.ffm
FileMaxSize 500M

# Ha pull módszerrel dolgozunk a következő paraméter hatására
# ffserver indításakor elindul egy ffmpeg is az alábbi bemeneti paraméterekkel
# (kimenetet nem szabad megadni)
#Launch ffmpeg -i http://1.6.2.8:8080/live

# Az engedélyezett források
ACL allow 127.0.0.1
ACL allow 8.9.2.7
</Feed>

# Első Streamünk a localhost:8090/live.webm címen elérhető.
<Stream live.webm>
# Bemenete a feed.ffm feed.
Feed feed.ffm
# FFmpeg format paramétere webm, ez a container.
Format webm
# Hangkódolási bitráta 32kbps
AudioBitRate 32
# Monó
AudioChannels 1
# Hang mintavételi frekvencia (Hz)
AudioSampleRate 22050
# Videó bitráta 900kbps
VideoBitRate 900
# Videó mérete
VideoSize 640x480
# Formátumra jellemző egyéb paraméterek
AVOptionVideo flags +global_header
AVOptionAudio flags +global_header
# Hang kodek megadása
AudioCodec vorbis
# Videó kodek megadása
VideoCodec libvpx
</Stream>

#Státusz oldal a látogatókkal és pár statisztikával
<Stream stat.html>
Format status

#Kik érhetik el a státusz oldalt:
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
ACL allow 8.9.2.7
</Stream>

# Index html helyett átirányít, az itt megadott címre
<Redirect index.html>
URL http://fizipedia.bme.hu/
</Redirect>

A több stream szekció használatával több kimeneti formátum is előállítható. A példa esetén egy HTML5-ben, böngészőbe ágyazható videófolyam jön létre, melyet a mai modern eszközök többsége támogat. A stat.html egy egyszerű HTML oldal, mely fehér alapon fekete betűkkel kiírja a kapcsolódó klienseket és az elhasznált sávszélességet.

Mivel a program C-ben van megírva, nagyon gyorsan reagál, felépítéséből adódóan kevés memóriát fogyaszt.

Hátránya, hogy a biztonsági korlátozások gyengék, csupán IP címre lehet szűrni, és maga a feed titkosítatlan. Az adaható paraméterek kodekfüggőek és a dokumentáció nehezen elérhető. Indítható Daemon módban is futtatható, ekkor háttérfolyamatként indul el. Célszerű indítószkriptet írni az automatikus indításához.

9 Hogyan használható az FFPLAY?

A programcsomag egy videó lejátszó programot is tartalmaz, ez az FFPLAY. A program a külső SDL könyvtár segítségével kezeli a képet és a hangot. A lejátszó felhasználói felülete parancssoros és rejtett. A lehetséges parancsok műsor közben nem lekérzdezhetőek és egérkattintásra is csak beletekerni tudunk a lejátszott videóba (feltéve, hogy nem hálózati műsorfolyam). Billentyűparancsok:

  • q,ESC : kilépés
  • f : teljes képernyős mód/normál mód
  • p, SPACE : pillanatállj
  • a : audio folyam váltás
  • v : video folyam váltás
  • t : felirat folyam váltás
  • w : hanghullámok mutatása
  • s : képkockánkénti léptetés aktiválása
  • Bal nyíl/jobb nyíl: 10 mp ugrás hátra,előre
  • Fel nyíl/le nyíl: 1 perc ugrás előre, hátra
  • PG UP/PG DN : 10 perc ugrás előre, hátra

Indítása egyszerű, paraméterknént szükséges átadni a megnyitandó fájlt.

D:\ffmpeg\bin>ffplay video.mp4

További beállítások is adhatóak, ezeket a -h kapcsolóval hívhatjuk elő.


10 Hol található további információ?

--Velinszky László

Személyes eszközök