Transcoding, dijital bir medya dosyasını bir sıkıştırma formatından diğerine tam kod çözme ve yeniden kodlama ile dönüştürme işlemidir. Transmuxingden (yalnızca kapsayıcıyı değiştirme) farklı olarak, transcoding codec’i, bit hızını, çözünürlüğü ve sıkıştırılmış akışın diğer parametrelerini değiştirir. Apple AVFoundation documentation (2026)’a göre, transcoding içeriği farklı cihazlara ve ağ koşullarına uyarlamak için kullanılır.
Önemli Noktalar
Transcoding, bir medya dosyasını bir sıkıştırma formatından diğerine dönüştürme işlemidir; kaynak akışı tamamen bir ara sıkıştırılmamış PCM formatına çözülür ve ardından yeni parametrelerle kodlanır. Kaynak dosya 10 Mbps bit hızında H.264 codec’i kullanıyorsa ve çıktının 3 Mbps bit hızında H.265 gerektiriyorsa — bu transcodingdir.
Transcoding, basit yeniden paketlemeden (transmuxing) farklıdır; burada yalnızca kapsayıcı değişir (örneğin MP4’ten MKV’ye) ve sıkıştırılmış bit akışı değişmeden kalır. Transcoding, hesaplama açısından pahalı işlemler içerir: her karenin kodunu çözme, filtreler uygulama (ölçekleme, renk düzeltme, kırpma) ve yeni parametrelerle yeniden kodlama. Bu, transcodingi medya ile çalışırken en kaynak yoğun işlemlerden biri yapar.
Transcoding çok çeşitli görevlerde kullanılır: videoyu bant genişliği sınırlamalarına uyarlama, hedef cihazda donanım kod çözme desteği olan bir formata dönüştürme, HLS/DASH akışı için birden çok sürüm oluşturma, ses parçalarını ayrı bir dosyaya çıkarma. OTT hizmetleri (Netflix, YouTube, Twitch), yüklenen her dosyayı milyonlarca kullanıcıya uyarlanabilir akış sağlamak için farklı bit hızları, çözünürlükler ve codec’lerle düzinelerce varyanta dönüştürür.
Transcoding süreci üç ana aşamadan oluşur: kod çözme, işleme ve kodlama. Her aşama, kullanılabilirlik ve gerekli performansa bağlı olarak CPU veya GPU/donanım bloklarında gerçekleştirilebilir.
İlk aşama, kaynak akışının kodunun çözülmesidir. Kaynak dosya kapsayıcıdan (MP4, MOV, MKV) okunur ve ardından sıkıştırılmış video paketleri kod çözücüye gönderilir. Kod çözme donanım tabanlı (codec destekleniyorsa) veya FFmpeg aracılığıyla yazılım tabanlı olabilir. Kod çözmenin çıktısı, YUV420 veya BGRA formatında sıkıştırılmamış karelerdir — transcodingin basit yeniden çoğullamadan farklılaştığı aşama budur.
İkinci aşama, filtreleme ve işlemedir. Kodu çözülmüş kareler bir filtre zincirinden geçer: hedef çözünürlüğe ölçekleme, kare hızını değiştirme, renk düzeltme, metin veya grafik yerleştirme. FFmpeg filtre zinciri, her filtrenin ayrı bir işleme modülü olduğu bir grafik olarak oluşturulur. Örneğin, scale=1280:720 filtresi çözünürlüğü değiştirir, fps=30 kare hızını değiştirir ve yadif alan geçişimini giderir. Tüm işlemler sıkıştırılmamış kareler üzerinde gerçekleştirilir ve bu da ikinci aşamayı en kaynak yoğun hale getirir.
Üçüncü aşama, hedef formatta kodlamadır. İşlenmiş kareler kodlayıcıya beslenir ve kodlayıcı bunları hedef codec algoritmasına göre sıkıştırır. Kodlayıcı donanım tabanlı (iOS’ta VideoToolbox, Android’de MediaCodec) veya yazılım tabanlı (libx264, libx265) olabilir. Kodlama parametreleri: sabit kalite için CRF (Constant Rate Factor), CBR/VBR için bit hızı, hedef cihazlarla uyumluluk için profil ve seviye.
// FFmpeg ile transcoding işlem hattı şeması
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. Kodu çöz
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. Filtrele (ölçek + fps değişimi)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. Kodla
avcodec_send_frame(encoderCtx, scaledFrame);
avcodec_receive_packet(encoderCtx, &outPacket);
av_interleaved_write_frame(outputCtx, &outPacket);
}
Yukarıdaki işlem hattı, klasik transcoding döngüsünü gösterir. av_read_frame işlevi, giriş dosyasından sıkıştırılmış paketleri okur, avcodec_send_packet bunları karelere çözer, sws_scale ölçekleme yapar ve avcodec_send_frame işlenmiş kareyi çıkış formatında kodlar. Bu üç aşamalı döngü, kodlayıcı ayarlarına bağlı olarak her kare veya kare grubu (GOP) için tekrarlanır.
Transcoding ve transmuxing arasındaki fark, medya mühendisliğindeki en yaygın karışıklık noktalarından biridir. Bu farkı anlamak, doğru medya işleme stratejisini seçmek için kritik öneme sahiptir.
| Parametre | Transcoding | Transmuxing |
|---|---|---|
| Ne değişir | Codec, bit hızı, çözünürlük | Kapsayıcı, meta veriler |
| Hesaplama yükü | Yüksek (kod çözme + kodlama) | Minimum (paket kopyalama) |
| Kalite | Düşebilir (nesil kaybı) | Kayıpsız |
| Yürütme süresi | Uzun video için dakika–saat | Saniye–dakika |
| Uygulama | Biçim uyarlama, sıkıştırma | Uyumluluk için kapsayıcı değişimi |
Transmuxing, kod çözme ve yeniden kodlama olmadan sıkıştırılmış bir akışı farklı bir kapsayıcıda yeniden paketlemektir. Video zaten bir MP4 kapsayıcısında H.265 codec’i ile sıkıştırılmışsa ve bir MOV veya MKV kapsayıcısına yerleştirilmesi gerekiyorsa — transmuxing, bit akışı paketlerini bir kapsayıcıdan diğerine kopyalar. Kalite etkilenmez, kare kodu çözme gerekmediğinden işlem süresi minimumdur. FFmpeg, -codec copy bayrağıyla transmuxing gerçekleştirir.
Transcoding ise medya akışını tamamen çözer ve yeniden sıkıştırır. Video her transcodingden geçtiğinde, nesil kaybı (generation loss) meydana gelebilir — tekrarlanan kayıplı sıkıştırma nedeniyle kalitede hafif bir bozulma. Aynı bit hızında bile, transcodingin üçüncü nesli genellikle birincisinden daha kötüdür. Profesyonellerin ana kopyaları sıkıştırılmamış veya minimum düzeyde sıkıştırılmış formatlarda (ProRes, DNxHR) saklamasının ve yalnızca dağıtım için son sürümleri dönüştürmesinin nedeni budur.
Transcoding aracının seçimi platforma, performans gereksinimlerine ve kullanım durumuna bağlıdır. Mobil geliştirme için hem yerel API’ler hem de platformlar arası kitaplıklar mevcuttur.
FFmpeg, tüm platformlarda transcoding için fiili standarttır. FFmpeg komut satırı, neredeyse her türlü dönüşümü gerçekleştirmeye olanak tanır: codec değişimi, bit hızı ayarlama, kırpma, birleştirme, filtre uygulama. Mobil uygulamalar için FFmpeg, libavformat, libavcodec ve libavfilter kitaplıkları aracılığıyla entegre edilir. Tipik bir transcoding komutunun örneği: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.
iOS’ta transcoding, AVAssetWriter ve AVAssetReader aracılığıyla gerçekleştirilir. AVAssetReader, sıkıştırılmamış kareleri okuyarak kaynak dosyanın kodunu çözer ve AVAssetWriter bunları hedef formatta kodlar. Bu yaklaşım, otomatik olarak VideoToolbox donanım kodlayıcılarını kullanarak maksimum performans sağlar. Android’de benzer işlevsellik, MediaCodec ile MediaExtractor ve MediaMuxer birlikte kullanılarak mevcuttur — MediaExtractor sıkıştırılmış paketleri çıkarır, MediaCodec kod çözer ve kodlar, MediaMuxer sonucu yazar.
Üretim ortamlarında sunucu tarafı transcoding için bulut hizmetleri kullanılır: AWS Elemental MediaConvert, Azure Media Services, Google Transcoder API. Bu hizmetler yük altında otomatik olarak ölçeklenir, tüm popüler formatları destekler ve uyarlanabilir akış (HLS, DASH) için tek bir giriş dosyasını düzinelerce çıkış varyantına dönüştürebilir. Mobil uygulamalar için bulut transcoding en uygun çözümdür çünkü kullanıcının cihazını yormaz ve eşzamansız içerik hazırlığına olanak tanır.
Donanım hızlandırma ve anahtar kalite parametrelerinin yapılandırılmasını kullanarak mobil platformlardaki pratik transcoding örneklerini inceleyelim.
import AVFoundation
func transcodeVideo(sourceURL: URL, destURL: URL) {
let asset = AVAsset(url: sourceURL)
let preset = AVAssetExportPresetHEVCHighestQuality
AVAssetExportSession(asset: asset, presetName: preset)?
.exportAsynchronously {
switch assetExportSession?.status {
case .completed:
print("Transcoding tamamlandı")
case .failed:
print("Hata: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// AVAssetReader + AVAssetWriter ile manuel transcoding
let reader = try AVAssetReader(asset: asset)
let writer = try AVAssetWriter(url: destURL,
fileType: .mp4)
let outputSettings: [String: Any] = [
AVVideoCodecKey: AVVideoCodecType.hevc,
AVVideoWidthKey: 1920,
AVVideoHeightKey: 1080,
AVVideoCompressionPropertiesKey: [
AVVideoAverageBitRateKey: 4_000_000,
AVVideoProfileLevelKey: AVVideoProfileLevelH265Main10
]
]
let adaptor = AVAssetWriterInput(
mediaType: .video,
outputSettings: outputSettings
)
writer.add(adaptor)
}
Örnek, iOS’ta transcodinge iki yaklaşımı göstermektedir. AVAssetExportSession, kalite ön ayarlarıyla (H.265 için HEVCHighestQuality) basit bir yöntemdir. AVAssetReader + AVAssetWriter aracılığıyla manuel işlem hattı, parametreler (bit hızı, profil, seviye) üzerinde tam kontrol sağlar. AVVideoProfileLevelH265Main10 parametresi, modern HDR içeriği için önemli olan 10 bit renk derinliğine sahip HDR profili Main10’u etkinleştirir.
class Transcoder(private val context: Context) {
fun transcodeToHevc(inputUri: Uri, outputFile: File) {
val extractor = MediaExtractor()
extractor.setDataSource(context, inputUri, null)
val trackFormat = extractor.getTrackFormat(videoTrackIndex)
val mime = trackFormat.getString(MediaFormat.KEY_MIME)
val decoder = MediaCodec.createDecoderByType(mime!!)
val encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_HEVC)
val outputFormat = MediaFormat.createVideoFormat(
MediaFormat.MIMETYPE_VIDEO_HEVC, 1920, 1080
).apply {
setInteger(MediaFormat.KEY_BIT_RATE, 4_000_000)
setInteger(MediaFormat.KEY_FRAME_RATE, 30)
setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2)
}
encoder.configure(outputFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
encoder.start()
}
}
Android kodu, MediaExtractor — MediaCodec kod çözücü — MediaCodec kodlayıcı — MediaMuxer’dan oluşan bir işlem hattı oluşturur. MediaExtractor, giriş dosyasından codec türünü belirler ve ilgili kod çözücüyü seçer. Kodlayıcı, akış için en uygun olan 4 Mbps bit hızı ve 2 saniye ana kare aralığıyla H.265 (HEVC) için yapılandırılmıştır. Önemli: MediaCodec kodlayıcı eşzamanlı çalışır, bu nedenle gerçek zamanlı transcoding için her karenin doğru PTS zaman damgası işlemesiyle bir döngü uygulanmalıdır.
Mobil cihazlarda transcoding, sınırlı CPU, GPU kaynakları ve termal kısıtlamalar nedeniyle dikkatli optimizasyon gerektiren bir görevdir. Birkaç strateji, transcodingi verimli bir şekilde gerçekleştirmeye yardımcı olur.
Anahtar performans faktörü donanım kodlayıcısıdır. iOS’ta VideoToolbox, yazılım libx264’ten 5–10 kat daha hızlı donanım H.264 ve H.265 kodlaması sağlar. Android’de MediaCodec, varsa donanım OMX bileşenlerini kullanır. Donanım kodlamasını etkinleştirmek, amiral gemisi bir cihazda 10 dakikalık bir videonun transcoding süresini 30–40 dakikadan (yazılım) 3–5 dakikaya (donanım) düşürür.
Mobil transcoding için kalite, boyut ve işlem süresi arasındaki denge kritiktir. Mobil cihazlarda H.265 için, 30 FPS’de 1080p video için 4–8 Mbps bit hızı önerilir. libx265’te CRF modu (Constant Rate Factor), kaliteyi doğrudan ayarlamaya olanak tanır; 23–28, orta dosya boyutunda iyi görsel kalite sağlar. Donanım kodlayıcıları için, CRF donanımda desteklenmediğinden hedef bit hızıyla CBR modunu kullanın.
Mobil cihazda sürekli transcoding, önemli ölçüde ısınmaya neden olur. 4K videonun 5–7 dakikalık yoğun kodlamasından sonra işlemci sıcaklığı 50–55 dereceye ulaşabilir ve ardından hız düşürme devreye girer. Çözüm, duraklamalarla transcoding yapmak veya kare hızını 30 FPS’ye düşürmektir. Uygulama toplu transcoding gerektiriyorsa (örneğin bir video düzenleyici), soğutma aralıklarıyla 2–3 dakikalık gruplar halinde işlemek daha iyidir. Üretim senaryoları için, transcodingi sunucu tarafına taşımak ve bulut hizmetlerini kullanmak en uygunudur.
Sıkça Sorulan Sorular
Encoding, ham sıkıştırılmamış verileri hedef codec’e sıkıştırmaktır. Transcoding, hem kod çözmeyi hem de kodlamayı içerir: önce mevcut sıkıştırılmış bir akışın kodunu çözer, ardından tekrar kodlar. Basit encoding, girdi olarak sıkıştırılmamış verileri alırken (örneğin kameradan), transcoding zaten sıkıştırılmış bir dosyayı alır.
Maksimum uyumluluk için — H.264. Daha iyi sıkıştırma için — H.265 (HEVC). Cihaz donanım H.265 kodlamasını destekliyorsa (iPhone 8+, Snapdragon 845+ ile Android), aynı kalitede dosya boyutunun yarısını sağlar. AV1 kodlaması mobil cihazlarda donanım hızlandırmasıyla bile hâlâ çok yavaştır.
Kesin olarak söylemek gerekirse, kayıplı codec’ler arasında geçiş yaparken kayıpsız transcoding imkansızdır. Her iki codec de kayıplıysa, her transcoding nesli kaliteyi düşürür. Kayıpsız transcoding yalnızca kayıpsız formatlar (FFV1, H.264 Lossless) arasında veya yeniden kodlama olmadan kapsayıcı değiştirirken (transmuxing) mümkündür.
Evet, donanım kod çözücü ve kodlayıcı kullanılırsa ve hedef çözünürlük 1080p’yi aşmazsa mümkündür. VideoToolbox (iOS) veya MediaCodec (Android) bulunan cihazlarda, gerçek zamanlı H.264→H.265 transcoding 1–3 saniye gecikmeyle mümkündür. 4K gerçek zamanlı için Apple A17 Pro, Snapdragon 8 Gen 2 veya üzeri gibi güçlü bir SoC gerekir.
Kayıplı transcoding, sıkıştırma artefaktlarını biriktirir. Kaynak dosya zaten yoğun şekilde sıkıştırılmışsa (1080p için 2–3 Mbps bit hızı), yeniden sıkıştırma kayıpları ikiye katlar. Önerilen, yalnızca yüksek bit hızlı (20+ Mbps) ana kopyalardan transcoding yapmak ve minimum kayıp için CRF 18–23 kullanmaktır.
Ö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