Mobil geliştirmede Transcoding — nedir, çalışma prensibi ve kullanım senaryoları

Yazar: IT Sectr Yayınlanma: 2026-05-25 Okuma süresi: 10 dk

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, kaynak akışının sıkıştırılmamış PCM’ye tamamen kodunun çözülmesi ve ardından yeni bir formatta kodlanmasıdır
  • Transmuxing, akışı yeniden kodlamadan yalnızca kapsayıcıyı değiştirir — bu transcoding değildir
  • Transcodingin ana nedenleri: codec değişimi, bit hızı düşürme, çözünürlük değişimi, DRM uyarlaması
  • Araçlar: FFmpeg, AVFoundation (iOS), MediaCodec (Android), AWS Elemental MediaConvert
  • Mobil cihazlarda gerçek zamanlı transcoding donanım kodlayıcı hızlandırması gerektirir

Transcoding Nedir?

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 Nasıl Çalışı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.

Transcoding Aşamaları

İ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.

cpp
// 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 vs Transmuxing

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.

ParametreTranscodingTransmuxing
Ne değişirCodec, bit hızı, çözünürlükKapsayıcı, meta veriler
Hesaplama yüküYüksek (kod çözme + kodlama)Minimum (paket kopyalama)
KaliteDüşebilir (nesil kaybı)Kayıpsız
Yürütme süresiUzun video için dakika–saatSaniye–dakika
UygulamaBiçim uyarlama, sıkıştırmaUyumluluk 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 Araçları

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 — Evrensel Araç

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.

Platform API’leri

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.

Bulut Hizmetleri

Ü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.

Transcoding Kod Örnekleri

Donanım hızlandırma ve anahtar kalite parametrelerinin yapılandırılmasını kullanarak mobil platformlardaki pratik transcoding örneklerini inceleyelim.

iOS’ta H.264’ten H.265’e Transcoding

swift
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.

Android’de MediaCodec ile Transcoding

kotlin
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 Cihazlar için Transcoding Optimizasyonu

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.

Donanım Kodlaması Kullanma

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.

Kalite Parametrelerini Seçme

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.

Termal Yönetim

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

Transcoding, encodingden nasıl farklıdır?

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.

Mobilde transcoding için hangi codec seçilmeli?

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.

“Kayıpsız transcoding” nedir?

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.

Video gerçek zamanlı olarak dönüştürülebilir mi?

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.

Transcodingden sonra video kalitesi neden düştü?

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

  • Transcoding, codec’i, bit hızını veya çözünürlüğü değiştirmek için medyanın kod çözme + kodlama tam döngüsüdür
  • Transmuxing yeniden kodlama olmadan yalnızca kapsayıcıyı değiştirir — bu transcoding değildir
  • Donanım transcodingi VideoToolbox ve MediaCodec’te yazılımdan 5–10 kat daha hızlıdır
  • FFmpeg yüzlerce codec’i ve işleme filtresini destekleyen evrensel bir araçtır
  • Kayıplı transcodingin her nesli kaliteyi düşürür — ana kopyaları kullanın
  • Mobil H.265 için optimum parametreler: bit hızı 4–8 Mbps, Main10 profili, GOP 2 saniye
  • Üretim için bulut transcoding hizmetlerini (AWS Elemental, Azure Media) kullanın — cihazı yormazlar

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.

Projeyi tartış

Ayrıca okuyun