Kod çözme, sıkıştırılmış bir medya akışının ekran ve hoparlörlerde çıktı için uygun, sıkıştırılmamış bir formata dönüştürülmesi işlemidir. Mobil cihazlarda kod çözme, yazılım yoluyla CPU üzerinde veya donanım yoluyla özel GPU ve DSP blokları aracılığıyla gerçekleştirilir. MDN Web Docs (2026)'ya göre, modern codec'ler akışı 100–500 kat sıkıştırır ve kod çözme, doğru sıkıştırma profili seçildiğinde kayıpsız olarak orijinal kaliteyi geri yükler.
Önemli Noktalar
Kod çözme, sıkıştırılmış dijital verilerin orijinal sıkıştırılmamış formatına geri dönüştürülmesi işlemidir. Medya bağlamında, kod çözme, bir kodlayıcı tarafından oluşturulan sıkıştırılmış bit akışından video karelerini geri yükler. Kod çözme olmadan, kullanıcılar video göremez veya ses duyamaz çünkü tüm modern medya formatları bant genişliğinden ve disk alanından tasarruf etmek için sıkıştırma kullanır.
5 Mbps bit hızında H.264 formatındaki tipik bir video akışı, aynı çözünürlükteki sıkıştırılmamış bir RGB akışından 100 kat daha az yer kaplar. Kod çözme algoritması, kodlamaya göre ters sırada codec spesifikasyonunu izleyerek her kareyi orijinal çözünürlüğüne ve renk uzayına geri döndürmelidir. Bunu yapmak için, kod çözücü çerçeve içi (I-kare) ve çerçeveler arası (P-kare, B-kare) verilerini işler.
Mobil cihazlarda kod çözme, CPU üzerinde veya özel donanım bloklarında gerçekleşebilir. Apple (A serisi), Qualcomm (Snapdragon) ve MediaTek'ten (Dimensity) modern SoC'ler, tüm popüler formatlar için yerleşik kod çözücüler içerir. Video işlemcisi, ters ayrık kosinüs dönüşümü ve hareket telafisinin ağır işini üstlenerek CPU'yu diğer görevler için serbest bırakır.
Kod çözme işlemi, kodlama adımlarını tersine çeviren birkaç ardışık aşamadan oluşur. İlk olarak, bit akışından başlıklar ve sıkıştırma parametreleri (profil, seviye, çözünürlük, renk uzayı) çıkarılır. Ardından kod çözücü, sıkıştırılmış makro blokları sırayla işleyerek bunlara ters dönüşümler uygular.
İlk aşama, entropi kodu çıkarmadır. Entropi kod çözme, ayrık kosinüs dönüşüm katsayılarını geri yüklemek için CABAC veya CAVLC algoritmalarını kullanır. Bu aşama video çözünürlüğüne bağlı değildir — piksel değil, bir bit akışını işler ve karmaşıklığı kare boyutlarıyla değil, bit hızıyla belirlenir.
İkinci aşama, ters nicemleme ve ters DCT'dir. Kod çözücü, nicemlenmiş katsayıları nicemleme adımıyla çarpar, yaklaşık DCT katsayı değerlerini geri yükler ve ardından ters DCT dönüşümünü uygular. Ters DCT, frekans alanından uzamsal verileri geri yükleyerek bir piksel makro bloğu oluşturur. Dönüşüm, kroma ve luma için bağımsız olarak gerçekleştirilir.
Üçüncü aşama, hareket telafisidir. P- ve B-kareleri için kod çözücü, bit akışından çıkarılan hareket vektörlerini kullanır ve önceden çözülmüş referans karelerine başvurur. Hareket telafisi, mevcut makro blok için bir tahmin edici oluşturur ve ters DCT'den sonra kalan sinyal eklenir. Sonuç, çıktı için hazır, tamamen geri yüklenmiş bir karedir.
// Video karesi kod çözmenin temel sözde kodu
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;
}
};
Yukarıdaki örnek, bir H.264 kod çözücünün temel yapısını gösterir. decodeNALUnit işlevi, sıkıştırılmış H.264 akışının temel bloğu olan bir NAL birimini alır. Kod çözücü, başlığı sırayla ayrıştırır, dilim türünü çıkarır, entropi kod çözme, ters nicemleme ve ters DCT uygular. P- ve B-dilimleri için, DPB arabelleğindeki referans kareleri kullanılarak ek olarak hareket telafisi gerçekleştirilir.
Modern video codec'leri, sıkıştırma algoritmaları, verimlilik ve hesaplama kaynağı gereksinimleri açısından farklılık gösterir. Format seçimi, dosya boyutunu, görüntü kalitesini ve mobil cihazda kod çözme sırasında güç tüketimini doğrudan etkiler.
| Codec | Yıl | Sıkıştırma | Donanım Desteği |
|---|---|---|---|
| H.264 | 2003 | 1:100 | Tüm modern SoC'ler |
| 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+ |
H.264, tüm mobil cihazlar tarafından desteklenen en yaygın video codec'idir. Ana avantajı evrenselliğidir: herhangi bir Android akıllı telefon ve iPhone, H.264'ü donanım üzerinde çözebilir. Ancak, aynı bit hızında H.264, H.265 ve AV1 gibi daha modern codec'lere kıyasla kalitede geride kalır ve benzer görsel kalite için %30–50 daha fazla bit hızı gerektirir.
H.265, aynı kalitede H.264'e kıyasla iki kat sıkıştırma sağlar. H.265 kod çözme, daha güçlü bir donanım bloğu gerektirir: iOS'ta VideoToolbox, iPhone 6'dan (A8) itibaren H.265'i destekler ve Android cihazlar Snapdragon 805 ve üzerinden itibaren. Bir mobil uygulama için H.265 seçerken, eski cihazların donanım desteğine sahip olmayabileceği ve bu formatı yazılımla çözebileceği, bunun da güç tüketimini önemli ölçüde artıracağı unutulmamalıdır.
AV1, Alliance for Open Media'dan açık bir codec olup, tüm modern formatlar arasında en iyi sıkıştırmayı sunar. AV1, aynı görsel kalitede H.265'ten %30 ve H.264'ten %50 daha verimlidir. Donanım AV1 kod çözme yalnızca 2023+ SoC'lerde (Apple A17 Pro, Qualcomm Snapdragon 8 Gen 2 ve daha yenileri) ortaya çıkmıştır. Eski cihazlar için AV1 kod çözme, yalnızca dav1d kitaplığı aracılığıyla yazılımla mümkündür ve CPU'da önemli bir yük oluşturur.
Yazılım ve donanım kod çözme arasındaki seçim, bir mobil medya oynatıcı geliştirirken önemli bir mimari karardır. Her yaklaşımın, uygulama tasarlanırken dikkate alınması gereken avantajları ve sınırlamaları vardır.
Donanım kod çözme, aynı görevi gerçekleştirirken CPU'dan önemli ölçüde daha az enerji tüketen özel video işleme bloklarında gerçekleştirilir. Qualcomm'a göre, 4K video oynatırken bir donanım H.265 kod çözücü, Snapdragon 8 Gen 1 CPU'daki yazılım kod çözmeden 5–10 kat daha az enerji tüketir. Bu, her miliwatt'ın pil ömrünü etkilediği mobil cihazlar için kritiktir.
Öte yandan, yazılım kod çözme maksimum esneklik sağlar. FFmpeg, libavcodec kitaplığıyla donanım desteği olmayan nadir ve eski formatlar dahil olmak üzere düzinelerce codec ve konteyneri destekler. Geliştirici, kod çözme hattını değiştirebilir, anında son işleme ve filtreler ekleyebilir; bu, kapalı donanım blokları kullanılırken imkansızdır.
Yazılım kod çözme, birkaç senaryoda haklı çıkar: nadir formatları (ProRes, DNxHD, Motion JPEG) oynatırken, kare işlemenin her aşaması üzerinde hassas kontrol gerektiğinde ve donanım desteği olmayan cihazlarda AV1 çözerken. FFmpeg'den libavcodec, neredeyse bilinen her formatı çözebilir ve bu da onu evrensel medya oynatıcılar için fiili standart haline getirir.
Yazılım kod çözmenin sınırlaması, ısı dağılımıdır. CPU'da sürekli 4K video kod çözme, cihazı 10–15 dakika içinde 45–50 dereceye kadar ısıtabilir, bu da kısıtlamaya ve kare hızında düşüşe yol açar. Aktif soğutması olmayan cihazlarda (tabletler, telefonlar) bu özellikle belirgindir. Yazılım kod çözme sırasında CPU güç tüketimi, aynı akışın donanım kod çözmesi sırasında 0,3–0,5 W'a karşı 3–5 W'a ulaşabilir.
Donanım kod çözme, herhangi bir prodüksiyon medya oynatıcısı için varsayılan seçimdir. Minimum güç tüketimiyle 4K video için sabit 60 fps sağlar. iOS'ta VideoToolbox ve Android'de MediaCodec, codec ve çözünürlüğe bağlı olarak otomatik olarak optimum işleme bloğunu seçen donanım kod çözme için yerel API'ler sağlar.
Platform API'leri, kare arabellek yönetimini (Android'de surface pool, iOS'ta CVPixelBufferPool), ekran senkronizasyonunu ve bellek optimizasyonunu halleder. Geliştiricinin yalnızca gerekli parametrelerle bir kod çözücü açması ve hazır kareleri alması yeterlidir. Donanım kod çözme, minimum gecikmeli uçtan uca bir boru hattını destekler: bit akışının alınmasından ekranda görüntülenmeye kadar 5–15 ms sürerken, yazılım kod çözmede 30–80 ms sürer.
Her iki mobil platformda kod çözmenin pratik bir uygulamasını inceleyelim. iOS'ta, donanım kod çözme VideoToolbox aracılığıyla ve yazılım kod çözme FFmpeg aracılığıyla gerçekleştirilir. Android'de, donanım kod çözme için MediaCodec kullanılır.
@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
Kod, iOS'ta bir H.264 donanım kod çözücünün başlatılmasını gösterir. VTDecompressionSessionCreate bir kod çözme oturumu oluşturur ve VTCreate, hazır bir kare göründüğünde bir geri çağrı yapar. Oturum, belirtilen codec için mevcutsa, otomatik olarak donanım bloğunu kullanır. CVPixelBuffer formatında çözülmüş kareler elde etmek için, her hazır kareyi minimum gecikmeyle ileten bir geri çağrı kullanılır.
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);
}
Android'te MediaCodec, piksel arabelleği yerine çıktı için bir Surface kullanır ve GPU ile CPU arasındaki veri kopyalamayı en aza indirir. Kod çözücü, codec türüne göre otomatik olarak donanım bloğunu (OMX bileşeni) seçer. H.264 için, üreticinin uygulamasına bağlı olarak donanım veya yazılım olabilen OMX.google.h264.decoder kullanılır.
Kod çözme stratejisinin seçimi, uygulamanın hedef kitlesine, desteklenen formatlara ve performans gereksinimlerine bağlıdır. En uygun çözüm genellikle karma bir yaklaşım içerir: ana formatlar (H.264, H.265) için donanım kod çözme ve nadir codec'ler için yazılım yedeklemesi.
Uygulama maksimum uyumluluğu hedefliyorsa, herhangi bir cihazda donanımda çözülmesi garanti edilen H.264'ü kullanın. Video akış hizmetleri için, 2016 sonrası cihazlarda donanım desteği olan H.265 haklı çıkar. AV1, bant genişliği tasarrufunun önemli olduğu hizmetler için seçimdir: YouTube, Netflix ve diğer büyük platformlar, kaliteyi korurken CDN maliyetlerini düşürmek için AV1'i aktif olarak benimsemektedir.
Kritik bir parametre, kod çözücünün arabellek boyutudur. Donanım kod çözücülerin sabit bir arabellek havuzu (genellikle 4–16 kare) vardır. Yüksek bit hızlı bir akışı oynatırken arabellekler taşabilir ve bu da kare düşüşüne yol açar. MediaCodec, belirli bir cihazda gerçek kod çözücü performansını belirlemek için getOutputFrameRate yöntemini sağlarken, VideoToolbox, kVTDecodeFrame_EnableAsynchronousDecompression aracılığıyla gerçek zamanlı önceliği kontrol etmeye olanak tanır.
Termal kısma başka bir faktördür. Uzun süreli 4K HDR video oynatma sırasında donanım kod çözme bile cihazı ısıtabilir. iOS'ta ProcessInfo ve Android'de BatteryManager aracılığıyla sıcaklığın izlenmesi ve aşırı ısınma durumunda kalitenin veya akış çözünürlüğünün düşürülmesi önerilir. Bu, özellikle uzun izleme oturumları olan oyunlar ve akış uygulamaları için kritiktir.
Sıkça Sorulan Sorular
Kodlama, sıkıştırılmamış verileri sıkıştırılmış bir formata dönüştürürken, kod çözme, sıkıştırılmış akıştan orijinal verileri geri yükler. Bu işlemler birbirinin tersidir ve aynı algoritmaları kullanır: DCT, nicemleme, hareket telafisi. Bir kodlayıcı doğrudan dönüşümü gerçekleştirir, bir kod çözücü tersini gerçekleştirir.
Maksimum uyumluluk için H.264 — modern cihazların %100'ünde donanım kod çözme ile çalışır. Daha iyi sıkıştırma için H.265 veya AV1. Seçim kitleye bağlıdır: kullanıcıların %80'i 2021+ cihazlara sahipse, H.265 daha düşük bit hızında daha iyi kalite sağlayacaktır. AV1, 2023+ donanım desteğine sahip amiral gemisi cihazlar için uygundur.
Bir donanım kod çözücü, yalnızca kod çözme için tasarlanmış özel bir mikroçiptir (ASIC). Kod çözmeyi sıralı talimatlarla gerçekleştiren CPU'nun aksine, donanım bloğu makro blokları paralel olarak işler. Bir donanım kod çözücünün güç tüketimi 5–10 kat daha düşüktür çünkü çip daha düşük bir frekansta çalışır ve gereksiz boru hattı aşamaları yoktur.
Profil, kodlayıcı tarafından kullanılan sıkıştırma algoritmaları kümesini tanımlar: Baseline, Main, High. Seviye, maksimum akış parametrelerini ayarlar: çözünürlük, bit hızı, arabellek boyutu. Mobil cihazlar için High profili ve 4.1–5.2 seviyesi önerilir — bu, donanım kod çözmeyle 1080p–4K video için yeterlidir.
Android'te, kullanılabilir codec'lerin listesini almak ve hangisinin donanım olduğunu kontrol etmek için MediaCodecList kullanın. iOS'ta, belirtilen codec ile CMVideoFormatDescription aracılığıyla desteği kontrol edin — VTDecompressionSessionCreate başarılı olursa, codec destekleniyordur. Android'te AV1 için, OMX.google.aomc.decoder codec'inin veya donanım sürümünün varlığını kontrol edin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun