A decoding a tömörített médiafolyam nem tömörített formátumba történő átalakításának folyamata, amely alkalmas a képernyőn és hangszórókon történő megjelenítésre. Mobil eszközökön a dekódolás vagy szoftveresen a CPU-n keresztül, vagy hardveresen speciális GPU és DSP blokkokon keresztül történik. A MDN Web Docs (2026) adatai szerint a modern kodekek 100–500-szor tömörítik a folyamot, és a dekódolás a tömörítési profil helyes megválasztásával veszteség nélkül állítja vissza az eredeti minőséget.
Főbb pontok
A decoding a tömörített digitális adatok visszaalakításának folyamata az eredeti nem tömörített formátumba. A média kontextusában a dekódolás visszaállítja a videokockákat az enkódoló által létrehozott tömörített bitfolyamból. Dekódolás nélkül a felhasználó nem láthatja a videót vagy hallhatja a hangot, mivel minden modern médiaformátum tömörítést használ a sávszélesség és a lemezterület megtakarítása érdekében.
Egy tipikus H.264 formátumú videofolyam 5 Mbps bitsebességgel 100-szor kevesebb helyet foglal, mint egy hasonló felbontású nem tömörített RGB folyam. A dekódolási algoritmusnak vissza kell állítania minden egyes kockát az eredeti felbontásra és színtérre, a kodek specifikációját követve a kódoláshoz képest fordított sorrendben. Ehhez a dekódoló feldolgozza a kockán belüli (I-frame) és kockák közötti (P-frame, B-frame) adatokat.
Mobil eszközökön a dekódolás történhet mind a CPU-n, mind dedikált hardverblokkokon. Az Apple (A sorozat), Qualcomm (Snapdragon) és MediaTek (Dimensity) modern SoC-i beépített dekódolókat tartalmaznak az összes népszerű formátumhoz. A videóprocesszor átveszi az inverz diszkrét koszinusz transzformáció és a mozgáskompenzáció nehéz munkáját, felszabadítva a CPU-t más feladatok számára.
A dekódolási folyamat több egymást követő szakaszból áll, amelyek megfordítják a kódolás lépéseit. Először a bitfolyamból kinyerésre kerülnek a fejlécek és a tömörítési paraméterek — profil, szint, felbontás, színtér. Ezután a dekódoló szekvenciálisan feldolgozza a tömörített makroblokkokat, inverz transzformációkat alkalmazva rájuk.
Az első szakasz — az entrópiakód kinyerése. Az entrópiadekódolás CABAC vagy CAVLC algoritmusokat használ a diszkrét koszinusz transzformáció együtthatóinak visszaállításához. Ez a szakasz nem függ a video felbontásától — a bitfolyamot dolgozza fel, nem a pixeleket, és összetettségét a bitsebesség határozza meg, nem a kocka mérete.
A második szakasz — inverz kvantálás és inverz DCT. A dekódoló megszorozza a kvantált együtthatókat a kvantálási lépéssel, visszaállítva a DCT-együtthatók közelítő értékeit, majd alkalmazza az inverz DCT transzformációt. Az inverz DCT visszaállítja a térbeli adatokat a frekvenciatartományból, létrehozva egy pixel makroblokkot. A krominancia és luminancia esetében a transzformáció egymástól függetlenül történik.
A harmadik szakasz — mozgáskompenzáció. A P- és B-kockák esetében a dekódoló a bitfolyamból kinyert mozgásvektorokat használja, és hivatkozik a korábban dekódolt referenciakockákra. A mozgáskompenzáció létrehozza az aktuális makroblokk prediktorát, amelyhez hozzáadódik az inverz DCT utáni maradék jel. Az eredmény — egy teljesen visszaállított kocka, készen a megjelenítésre.
// Videokocka alapdekódolásának pszeudokódja
struct DecodedFrame {
uint8_t* y_plane;
uint8_t* u_plane;
uint8_t* v_plane;
int width, height;
};
class Decoder {
public:
bool decodeNALUnit(const uint8_t* nalUnit, size_t size) {
if (!parseNALUHeader(nalUnit, size))
return false;
int sliceType = parseSliceType(nalUnit);
entropyDecode(nalUnit);
inverseQuantize();
inverseDCT();
if (sliceType != I_SLICE)
motionCompensation();
return true;
}
};
A fenti példa a H.264 dekódoló alapstruktúráját mutatja. A decodeNALUnit függvény egy NAL egységet fogad — a tömörített H.264 folyam alapblokkját. A dekódoló szekvenciálisan elemzi a fejlécet, kinyeri a szelettípust, alkalmazza az entrópiadekódolást, az inverz kvantálást és az inverz DCT-t. A P- és B-szeletek esetében további mozgáskompenzáció történik a DPB pufferből származó referenciakockák felhasználásával.
A modern videokodekek különböznek a tömörítési algoritmusokban, a hatékonyságban és a számítási erőforrásokra vonatkozó követelményekben. A formátum kiválasztása közvetlenül befolyásolja a fájlméretet, a képminőséget és az energiafogyasztást a mobil eszközön történő dekódoláskor.
| Kodek | Év | Tömörítés | Hardveres támogatás |
|---|---|---|---|
| H.264 | 2003 | 1:100 | Minden modern SoC |
| H.265 | 2013 | 1:200 | Apple A8+, Snapdragon 805+ |
| VP9 | 2013 | 1:180 | Snapdragon 820+, Exynos |
| AV1 | 2018 | 1:300 | Apple A17+, Snapdragon 8 Gen 2+ |
A H.264 a legelterjedtebb videokodek, amelyet minden mobil eszköz támogat. Fő előnye az egyetemesség: bármely Android okostelefon és iPhone hardveresen képes dekódolni a H.264-et. Azonos bitsebesség mellett azonban a H.264 minőségben elmarad a modernebb H.265 és AV1 kodekektől, 30–50%-kal több bitsebességet igényelve hasonló vizuális minőséghez.
A H.265 kétszer jobb tömörítést biztosít a H.264-hez képest azonos minőség mellett. A H.265 dekódolása erősebb hardverblokkot igényel: az iOS rendszeren a VideoToolbox a H.265-öt iPhone 6 (A8) készüléktől kezdve támogatja, az Android eszközök pedig Snapdragon 805-től felfelé. A H.265 mobilalkalmazáshoz történő kiválasztásakor figyelembe kell venni, hogy a régebbi eszközök nem rendelkezhetnek hardveres támogatással, és szoftveresen fogják dekódolni ezt a formátumot, ami drasztikusan megnöveli az energiafogyasztást.
Az AV1 egy nyílt kodek az Alliance for Open Mediatól, amely a legjobb tömörítést biztosítja az összes modern formátum közül. Az AV1 30%-kal hatékonyabb, mint a H.265, és 50%-kal hatékonyabb, mint a H.264 azonos vizuális minőség mellett. Az AV1 hardveres dekódolása csak a 2023+ SoC-kben jelent meg: Apple A17 Pro, Qualcomm Snapdragon 8 Gen 2 és újabbak. Régebbi eszközök esetében az AV1 dekódolása csak szoftveresen lehetséges a dav1d könyvtáron keresztül, ami jelentős terhelést ró a CPU-ra.
A szoftveres és hardveres dekódolás közötti választás kulcsfontosságú architekturális döntés a mobil médialejátszó fejlesztése során. Mindkét megközelítésnek megvannak a maga előnyei és korlátai, amelyeket figyelembe kell venni az alkalmazás tervezésekor.
A hardveres dekódolás speciális videófeldolgozó blokkokon történik, amelyek lényegesen kevesebb energiát fogyasztanak, mint a CPU ugyanazon feladat elvégzésekor. A Qualcomm adatai szerint a hardveres H.265 dekódoló 5–10-szer kevesebb energiát fogyaszt, mint a szoftveres dekódolás Snapdragon 8 Gen 1 CPU-n 4K videó lejátszásakor. Ez kritikus fontosságú a mobil eszközök esetében, ahol minden milliwatt befolyásolja az akkumulátor élettartamát.
A szoftveres dekódolás ezzel szemben maximális rugalmasságot biztosít. Az FFmpeg a libavcodec könyvtárral több tucat kodeket és konténert támogat, beleértve a ritka és elavult formátumokat, amelyek nem rendelkeznek hardveres támogatással. A fejlesztő módosíthatja a dekódolási csővezetéket, menet közben hozzáadhat utófeldolgozást és szűrőket, ami zárt hardverblokkok használatakor lehetetlen.
A szoftveres dekódolás több forgatókönyvben indokolt: ritka formátumok (ProRes, DNxHD, Motion JPEG) lejátszásakor, amikor a kockafeldolgozás minden szakasza felett pontos kontroll szükséges, valamint AV1 dekódolásakor hardveres támogatás nélküli eszközökön. Az FFmpeg libavcodec könyvtára lehetővé teszi gyakorlatilag bármely ismert formátum dekódolását, ami az univerzális médialejátszók de facto szabványává teszi.
A szoftveres dekódolás korlátja a hőtermelés. A 4K videó folyamatos dekódolása a CPU-n 10–15 percen belül 45–50 fokra melegítheti az eszközt, ami throttlinghez és a kockasebesség csökkenéséhez vezet. Az aktív hűtés nélküli eszközökön (táblagépek, telefonok) ez különösen észrevehető. A CPU energiafogyasztása szoftveres dekódoláskor elérheti a 3–5 W-ot, szemben a hardveres dekódolás 0,3–0,5 W-ával ugyanazon folyam esetében.
A hardveres dekódolás az alapértelmezett választás bármely éles médialejátszó esetében. Stabil 60 kocka/mp-et biztosít 4K videóhoz minimális energiafogyasztás mellett. Az iOS rendszeren a VideoToolbox és az Androidon a MediaCodec natív API-kat biztosítanak a hardveres dekódoláshoz, amelyek automatikusan kiválasztják az optimális feldolgozó blokkot a kodek és a felbontás függvényében.
A platform API-k kezelik a kockapufferek menedzsmentjét (surface pool Androidon, CVPixelBufferPool iOS rendszeren), a kijelzővel való szinkronizációt és a memóriaoptimalizálást. A fejlesztőnek csak meg kell nyitnia a dekódolót a megfelelő paraméterekkel, és fogadnia kell a kész kockákat. A hardveres dekódolás támogatja a végpontok közötti csővezetéket minimális késleltetéssel: a bitfolyam fogadásától a képernyőn való megjelenésig 5–15 ms telik el, szemben a szoftveres dekódolás 30–80 ms-ával.
Tekintsük át a dekódolás gyakorlati megvalósítását mindkét mobil platformon. iOS rendszeren a hardveres dekódolás a VideoToolbox-on keresztül, a szoftveres pedig az FFmpeg-en keresztül történik. Androidon a MediaCodec szolgál a hardveres dekódolásra.
@interface VideoDecoder ()
@property (nonatomic) VTDecompressionSessionRef session;
@end
@implementation VideoDecoder
- (void)setupDecoder {
CMVideoFormatDescriptionRef formatDesc;
CMVideoCodecType codecType = kCMVideoCodecType_H264;
OSStatus status = CMVideoFormatDescriptionCreate(
NULL, codecType, 1920, 1080, NULL, &formatDesc
);
VTDecompressionOutputCallbackRecord callback;
callback.decompressionOutputCallback = &decodingCallback;
VTDecompressionSessionCreate(NULL, formatDesc, NULL,
NULL, &callback, &_session);
}
- (void)decodeFrame: (uint8_t*)nalData length:(size_t)size {
CMBlockBufferRef blockBuffer;
CMBlockBufferCreateWithMemoryBlock(NULL, nalData,
size, NULL, NULL, 0, size, 0, &blockBuffer);
CMSampleBufferRef sampleBuffer;
CMSampleBufferCreate(NULL, blockBuffer, true, NULL,
NULL, NULL, 1, 0, NULL, 0, NULL, &sampleBuffer);
VTDecompressionSessionDecodeFrame(_session,
sampleBuffer, 0, NULL, 0);
}
@end
A kód a H.264 hardveres dekódoló inicializálását mutatja iOS rendszeren. A VTDecompressionSessionCreate létrehoz egy dekódolási munkamenetet, a VTCreate pedig visszahívást hív, amikor megjelenik egy kész kocka. A munkamenet automatikusan használja a hardverblokkot, ha az elérhető a megadott kodekhez. A CVPixelBuffer formátumú dekódolt kockák fogadásához egy visszahívás szolgál, amely minimális késleltetéssel továbbítja az egyes kész kockákat.
MediaCodec decoder = MediaCodec.createDecoderByType("video/avc");
MediaFormat format = MediaFormat.createVideoFormat(
"video/avc", 1920, 1080
);
format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
decoder.configure(format, surface, null, 0);
decoder.start();
ByteBuffer[] inputBuffers = decoder.getInputBuffers();
int inputIndex = decoder.dequeueInputBuffer(10000);
if (inputIndex >= 0) {
ByteBuffer buffer = inputBuffers[inputIndex];
buffer.clear();
buffer.put(nalData);
decoder.queueInputBuffer(inputIndex, 0, nalData.length, pts, 0);
}
Androidon a MediaCodec a kimenethez Surface-t használ pixelpuffer helyett, ami minimalizálja az adatok másolását a GPU és a CPU között. A dekódoló automatikusan kiválasztja a hardverblokkot (OMX komponenst) a kodek típusa alapján. H.264 esetén az OMX.google.h264.decoder használatos, amely a gyártó implementációjától függően lehet hardveres és szoftveres is.
A dekódolási stratégia kiválasztása az alkalmazás célközönségétől, a támogatott formátumoktól és a teljesítménykövetelményektől függ. Az optimális megoldás gyakran hibrid megközelítést foglal magában: hardveres dekódolás a fő formátumokhoz (H.264, H.265) szoftveres fallbackkel a ritka kodekekhez.
Ha az alkalmazás a maximális kompatibilitásra összpontosít — használjon H.264-et, amely garantáltan hardveresen dekódolódik bármely eszközön. Videóstreaming szolgáltatások esetében a H.265 indokolt hardveres támogatással a 2016 utáni eszközökön. Az AV1 választás azoknak a szolgáltatásoknak, ahol fontos a sávszélesség megtakarítása: a YouTube, Netflix és más nagy platformok aktívan bevezetik az AV1-et a CDN-költségek csökkentése érdekében a minőség megőrzése mellett.
Kritikus paraméter — a dekódoló puffermérete. A hardveres dekódolók fix pufferpoolal rendelkeznek (általában 4–16 kocka). Magas bitsebességű folyam lejátszásakor a pufferek túlcsordulhatnak, ami kockák kihagyásához vezet. A MediaCodec biztosítja a getOutputFrameRate metódust a dekódoló tényleges teljesítményének meghatározásához egy adott eszközön, a VideoToolbox pedig lehetővé teszi a valós idejű prioritásvezérlést a kVTDecodeFrame_EnableAsynchronousDecompression segítségével.
A termikus throttling egy másik tényező. Még a hardveres dekódolás is felmelegítheti az eszközt hosszan tartó 4K HDR videó lejátszásakor. Javasolt a hőmérséklet figyelése az iOS rendszeren a ProcessInfo, Androidon a BatteryManager segítségével, csökkentve a folyam minőségét vagy felbontását túlmelegedés esetén. Ez különösen kritikus a játékok és streaming alkalmazások esetében, hosszú nézési munkamenetekkel.
Gyakran Ismételt Kérdések
A kódolás (encoding) a nem tömörített adatokat tömörített formátumba alakítja, míg a dekódolás (decoding) visszaállítja az eredeti adatokat a tömörített folyamból. Ezek a folyamatok egymás fordítottjai, és ugyanazokat az algoritmusokat használják: DCT, kvantálás, mozgáskompenzáció. Az enkódoló végrehajtja a közvetlen transzformációt, a dekódoló — az inverzet.
Maximális kompatibilitáshoz — H.264, mivel a modern eszközök 100%-án hardveresen dekódolódik. Jobb tömörítéshez — H.265 vagy AV1. A választás a közönségtől függ: ha a felhasználók 80%-ának 2021+ eszköze van, a H.265 jobb minőséget biztosít alacsonyabb bitsebesség mellett. Az AV1 a 2023+ hardveres támogatással rendelkező csúcskészülékek esetén indokolt.
A hardveres dekódoló egy speciális mikrochip (ASIC), amelyet kizárólag dekódolásra terveztek. Ellentétben a CPU-val, amely szekvenciális utasításokkal végzi a dekódolást, a hardverblokk a makroblokkokat párhuzamosan dolgozza fel. A hardveres dekódoló energiafogyasztása 5–10-szer alacsonyabb, mert a chip alacsonyabb frekvencián működik, és nincsenek felesleges csővezeték szakaszai.
A profil (profile) meghatározza az enkódoló által használt tömörítési algoritmusok készletét: Baseline, Main, High. A szint (level) beállítja a folyam maximális paramétereit: felbontás, bitsebesség, pufferméret. Mobil eszközökhöz a High profil és a 4.1–5.2 szint ajánlott — ez elegendő a 1080p–4K videóhoz hardveres dekódolással.
Androidon használja a MediaCodecList-et az elérhető kodekek listájának lekéréséhez és annak ellenőrzéséhez, hogy melyik hardveres. iOS rendszeren ellenőrizze a támogatást a CMVideoFormatDescription segítségével a megadott kodekkel — ha a VTDecompressionSessionCreate sikeres, a kodek támogatott. AV1 esetén Androidon ellenőrizze az OMX.google.aomc.decoder kodek vagy annak hardveres verziójának jelenlétét.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is