Transkodovanje u mobilnom razvoju — sta je to, princip rada i scenariji

Аутор: IT Sectr Објављено: 2026-05-25 Време читања: 10 мин

Transcoding — proces konverzije digitalnog medijskog fajla iz jednog formata kompresije u drugi sa potpunim dekodiranjem i ponovnim kodiranjem. Za razliku od transmuxinga (promene samo kontejnera), transkodovanje menja kodek, bitrate, rezoluciju i druge parametre komprimovanog toka. Prema Apple AVFoundation documentation (2026), transkodovanje se koristi za prilagodjavanje sadrzaja razlicitim uredjajima i mreznim uslovima.

Glavno

  • Transcoding — potpuno dekodiranje izvornog toka u nekomprimovani PCM sa naknadnim kodiranjem u novi format
  • Transmuxing menja samo kontejner bez prekodiranja toka — to nije transkodovanje
  • Osnovni razlozi transkodovanja: promena kodeka, smanjenje bitratea, promena rezolucije, prilagodjavanje DRMu
  • Alati: FFmpeg, AVFoundation (iOS), MediaCodec (Android), AWS Elemental MediaConvert
  • Transkodovanje u realnom vremenu na mobilnim uredjajima zahteva hardversko ubrzanje enkodera

Sta je transkodovanje?

Transcoding — proces konverzije medijskog fajla iz jednog formata kompresije u drugi potpunim dekodiranjem izvornog toka u medjusobni nekomprimovani PCM format i naknadnim kodiranjem sa novim parametrima. Ako je u izvornom fajlu video komprimovan kodekom H.264 sa bitrateom od 10 Mb/s, a na izlazu je potreban H.265 sa bitrateom od 3 Mb/s — to je transkodovanje.

Transkodovanje se razlikuje od obicnog prepakivanja (transmuxing), pri kome se menja samo kontejner (npr. MP4 u MKV), a sam komprimovani bitovni tok ostaje nepromenjen. Tokom transkodovanja odvijaju se racunarski zahtevne transformacije: dekodiranje svakog kadra, primena filtera (skaliranje, korekcija boja, secenje), ponovno kodiranje sa novim parametrima. To cini transkodovanje jednom od najzahtevnijih operacija pri radu sa medijima.

Transkodovanje se primenjuje u sirokom spektru zadataka: prilagodjavanje videa ogranicenjima propusnog opsega mreze, konverzija u format sa hardverskom podrskom dekodiranja na ciljnom uredjaju, kreiranje vise verzija za HLS/DASH striming, izdvajanje audio traka u poseban fajl. OTT servisi (Netflix, YouTube, Twitch) transkoduju svaki otpremljeni fajl u desetine varijanti sa razlicitim bitrateovima, rezolucijama i kodecima kako bi omogucili adaptivni striming milionima korisnika.

Kako radi transkodovanje?

Proces transkodovanja se sastoji od tri glavne faze: dekodiranje, obrada i kodiranje. Svaka faza moze biti izvrsena i na CPUu i na GPUu/hardverskim blokovima u zavisnosti od dostupnosti i potrebnih performansi.

Faze transkodovanja

Prva faza — dekodiranje izvornog toka. Izvorni fajl se cita iz kontejnera (MP4, MOV, MKV), nakon cega se komprimovani video paketi upucuju dekoderu. Dekodiranje moze biti hardversko (ako kodek podrzava) ili softversko putem FFmpega. Na izlazu dekodiranja dobijaju se nekomprimovani kadrovi u formatu YUV420 ili BGRA — upravo po ovoj fazi se transkodovanje razlikuje od obicnog remultipleksiranja.

Druga faza — filtracija i obrada. Dekodirani kadrovi prolaze kroz lanac filtera: skaliranje na ciljnu rezoluciju, promena frekvencije kadrova, korekcija boja, nanosenje teksta ili grafike. Lanac filtera FFmpeg se gradi kao graf, gde je svaki filter poseban modul obrade. Na primer, filter scale=1280:720 menja rezoluciju, fps=30 menja frekvenciju kadrova, a yadif vrsi deinterlacing. Sve operacije se izvrsavaju nad nekomprimovanim kadrovima, zbog cega je druga faza najzahtevnija.

Treca faza — kodiranje u ciljni format. Obradjeni kadrovi se dovode na ulaz enkodera, koji ih komprimuje po algoritmu ciljnog kodeka. Enkoder moze biti hardverski (VideoToolbox na iOSu, MediaCodec na Androidu) ili softverski (libx264, libx265). Parametri kodiranja: CRF (Constant Rate Factor) za konstantan kvalitet, bitrate za CBR/VBR, profil i nivo za kompatibilnost sa ciljnim uredjajima.

cpp
// Shema pipeline transkodovanja u FFmpegu
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;

while (av_read_frame(inputCtx, &packet) >= 0) {
    // 1. Dekodiranje
    avcodec_send_packet(decoderCtx, &packet);
    avcodec_receive_frame(decoderCtx, frame);
    
    // 2. Filter (skaliranje + promjena fps)
    sws_scale(swsCtx, frame->data, frame->linesize,
              0, frame->height, scaledFrame->data,
              scaledFrame->linesize);
    
    // 3. Kodiranje
    avcodec_send_frame(encoderCtx, scaledFrame);
    avcodec_receive_packet(encoderCtx, &outPacket);
    av_interleaved_write_frame(outputCtx, &outPacket);
}

Prikazani pipeline demonstrira klasican ciklus transkodovanja. Funkcija av_read_frame cita komprimovane pakete iz ulaznog fajla, avcodec_send_packet ih dekodira u kadrove, sws_scale vrsi skaliranje, a avcodec_send_frame kodira obradjeni kadar u izlazni format. Ovaj trofazni ciklus se ponavlja za svaki kadar ili grupu kadrova (GOP), u zavisnosti od podesavanja enkodera.

Transkodovanje vs transmuxing

Razlika izmedju transkodovanja i transmuxinga jedna je od najcescih tacaka zabune u medijskom inzenjerstvu. Razumevanje ove razlike je kljucno za izbor prave strategije obrade medija.

ParametarTranskodovanjeTransmuxing
Sta se menjaKodek, bitrate, rezolucijaKontejner, metapodaci
Racunarsko opterecenjeVisoko (dekodiranje + kodiranje)Minimalno (kopiranje paketa)
KvalitetMoze se pogorsati (gubitak generacije)Bez gubitka
Vreme izvrsenjaMinuti–sati za dugi videoSekunde–minuti
PrimenaPrilagodjavanje formata, kompresijaPromena kontejnera radi kompatibilnosti

Transmuxing — prepakivanje komprimovanog toka u drugi kontejner bez dekodiranja i ponovnog kodiranja. Ako je video vec komprimovan kodekom H.265 u kontejneru MP4 i treba ga smestiti u kontejner MOV ili MKV — transmuxing jednostavno kopira bitovne pakete iz jednog kontejnera u drugi. Kvalitet ne trpi, vreme obrade je minimalno jer nije potrebno dekodiranje kadrova. FFmpeg vrsi transmuxing sa flagom -codec copy.

Transkodovanje u potpunosti desifruje i ponovo komprimuje medijski tok. Svaki put kada video prodje kroz transkodovanje, moze doci do gubitka generacije (generation loss) — neznatnog pogorsanja kvaliteta usled ponovne kompresije sa gubicima. Cak i pri istom bitrateu, treca generacija transkodovanja je obicno losija od prve. Zato profesionalci preporucuju cuvanje master kopija u nekomprimovanim ili minimalno komprimovanim formatima (ProRes, DNxHR) i transkodovanje samo finalnih verzija za isporuku.

Alati za transkodovanje

Izbor alata za transkodovanje zavisi od platforme, zahteva performansi i scenarija koriscenja. Za mobilni razvoj dostupni su kako nativni APIji, tako i visplatformske biblioteke.

FFmpeg — univerzalni alat

FFmpeg — de facto standard za transkodovanje na svim platformama. Komandna linija FFmpega omogucava izvrsavanje prakticno bilo kakvih transformacija: promena kodeka, promena bitratea, secenje, spajanje, nanosenje filtera. Za mobilne aplikacije, FFmpeg se integrira putem biblioteka libavformat, libavcodec i libavfilter. Primer tipicne komande za transkodovanje: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.

Platformski APIji

Na iOSu se transkodovanje vrsi putem AVAssetWriter i AVAssetReader. AVAssetReader dekodira izvorni fajl, citajuci nekomprimovane kadrove, a AVAssetWriter ih kodira u ciljni format. Ovaj pristup automatski koristi hardverske enkodere VideoToolbox, sto obezbedjuje maksimalne performanse. Na Androidu je analogna funkcionalnost dostupna putem MediaCodec u paru sa MediaExtractor i MediaMuxer — MediaExtractor izdvaja komprimovane pakete, MediaCodec dekodira i kodira, MediaMuxer upisuje rezultat.

Cloud servisi

Za serversko transkodovanje u produkcijskom okruzenju koriste se cloud servisi: AWS Elemental MediaConvert, Azure Media Services, Google Transcoder API. Ovi servisi se automatski skaliraju pod opterecenjem, podrzavaju sve popularne formate i mogu transkodovati jedan ulazni fajl u desetine izlaznih varijanti za adaptivni striming (HLS, DASH). Za mobilne aplikacije, cloud transkodovanje je optimalno resenje jer ne opterecuje uredjaj korisnika i omogucava asinhronu pripremu sadrzaja.

Primeri koda transkodovanja

Razmotrimo prakticne primere transkodovanja na mobilnim platformama koriscenjem hardverskog ubrzanja i podesavanja kljucnih parametara kvaliteta.

Transkodovanje H.264 u H.265 na iOSu

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("Transkodovanje zavrseno")
            case .failed:
                print("Greska: " + assetExportSession.error.localizedDescription)
            default:
                break
            }
        }
    
    // Rucno transkodovanje sa AVAssetReader + AVAssetWriter
    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)
}

U primeru se koriste dva pristupa transkodovanju na iOSu. AVAssetExportSession — jednostavan nacin sa podesavanjima kvaliteta (HEVCHighestQuality za H.265). Rucni pipeline kroz AVAssetReader + AVAssetWriter daje potpunu kontrolu nad parametrima: bitrate, profil, nivo. Parametar AVVideoProfileLevelH265Main10 ukljucuje HDR profil Main10 sa dubinom boje od 10 bita, sto je vazno za savremeni HDR sadrzaj.

Transkodovanje na Androidu sa MediaCodec

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()
    }
}

Kod na Androidu kreira pipeline od MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. MediaExtractor odredjuje tip kodeka iz ulaznog fajla i bira odgovarajuci dekoder. Enkoder se podesava na H.265 (HEVC) sa bitrateom od 4 Mb/s i intervalom kljucnih kadrova od 2 sekunde, sto je optimalno za striming. Vazno: MediaCodec encoder radi sinhrono, pa je za transkodovanje u realnom vremenu potrebno organizovati petlju sa korektnom obradom vremenskih oznaka (PTS) za svaki kadar.

Optimizacija transkodovanja za mobilne uredjaje

Transkodovanje na mobilnim uredjajima je zadatak koji zahteva pazljivu optimizaciju zbog ogranicenih resursa CPUa, GPUa i termickih ogranicenja. Nekoliko strategija pomaze da se transkodovanje efikasno obavi.

Koriscenje hardverskog kodiranja

Kljucni faktor performansi — hardverski enkoder. Na iOSu VideoToolbox pruza hardversko kodiranje H.264 i H.265 brzinom 5–10 puta vecom od softverskog libx264. Na Androidu MediaCodec koristi hardverske OMX komponente ako su dostupne. Ukljucivanje hardverskog kodiranja skracuje vreme transkodovanja 10minutnog videa sa 30–40 minuta (softverski) na 3–5 minuta (hardverski) na flagship uredjaju.

Izbor parametara kvaliteta

Za mobilno transkodovanje je kljucan balans izmedju kvaliteta, velicine i vremena obrade. Za H.265 na mobilnim uredjajima preporucuje se bitrate od 4–8 Mb/s za 1080p video sa frekvencijom kadrova od 30 FPS. CRF rezim (Constant Rate Factor) u libx265 omogucava direktno zadavanje kvaliteta, gde 23–28 daje dobar vizuelni kvalitet uz umerenu velicinu fajla. Za hardverske enkodere koristite CBR rezim sa ciljnim bitrateom, jer CRF nije hardverski podrzan.

Upravljanje toplotom

Kontinuirano transkodovanje na mobilnom uredjaju izaziva znacajno zagrevanje. Nakon 5–7 minuta intenzivnog kodiranja 4K videa temperatura procesora moze dostic 50–55 stepeni, nakon cega se ukljucuje trottling. Resenje — transkodovanje sa pauzama ili smanjenje frekvencije kadrova na 30 FPS. Ako aplikacija zahteva masovno transkodovanje (npr. video editor), bolje je obradjivati u serijama od 2–3 minuta sa intervalima za hladenje. Za produkcijske scenarije optimalno je prebaciti transkodovanje na serversku stranu i koristiti cloud servise.

Cesto postavljana pitanja

Cime se transkodovanje razlikuje od kodiranja?

Kodiranje (encoding) — kompresija izvornih nekomprimovanih podataka u ciljni kodek. Transkodovanje ukljucuje i dekodiranje i kodiranje: prvo dekodira postojeci komprimovani tok, zatim ga ponovo kodira. ObiCno kodiranje prima na ulaz nekomprimovane podatke (npr. sa kamere), a transkodovanje — vec komprimovani fajl.

Koji kodek izabrati za transkodovanje na mobilnim uredjajima?

Za maksimalnu kompatibilnost — H.264. Za bolju kompresiju — H.265 (HEVC). Ako uredjaj podrzava hardversko kodiranje H.265 (iPhone 8+, Android sa Snapdragon 845+), obezbedjuje upola manju velicinu fajla uz isti kvalitet. AV1 kodiranje na mobilnim uredjajima je jos uvijek presporo cak i sa hardverskim ubrzanjem.

Sta je transkodovanje bez gubitaka?

Strogo govoreci, transkodovanje bez gubitaka je nemoguce prilikom promjene lossy kodeka. Ako su oba kodeka sa gubicima, svaka generacija transkodovanja pogorsava kvalitet. Lossless transkodovanje je moguce samo izmedju lossless formata (FFV1, H.264 Lossless) ili pri promjeni kontejnera bez prekodiranja (transmuxing).

Da li se video moze transkodovati u realnom vremenu?

Da, ako se koriste hardverski dekoder i enkoder, a ciljna rezolucija ne prelazi 1080p. Na uredjajima sa VideoToolbox (iOS) ili MediaCodec (Android) transkodovanje u realnom vremenu H.264 u H.265 je moguce sa kasnjenjem od 1–3 sekunde. Za 4K u realnom vremenu potreban je mocan SoC Apple A17 Pro, Snapdragon 8 Gen 2 ili noviji.

Zasto je nakon transkodovanja video losijeg kvaliteta?

Transkodovanje sa gubicima akumulira artefakte kompresije. Ako je izvorni fajl vec bio jako komprimovan (bitrate 2–3 Mb/s za 1080p), ponovna kompresija ce udvostruciti gubitke. Preporucuje se transkodovanje samo iz master kopija sa visokim bitrateom (20+ Mb/s) i koriscenje CRF 18–23 za minimalne gubitke.

Zakljucak

  • Transcoding — potpuni ciklus dekodiranja + kodiranja medija za promjenu kodeka, bitratea ili rezolucije
  • Transmuxing mijenja samo kontejner bez prekodiranja — to nije transkodovanje
  • Hardversko transkodovanje na VideoToolbox i MediaCodec je 5–10 puta brze od softverskog
  • FFmpeg — univerzalni alat koji podrzava stotine kodeka i filtera obrade
  • Svaka generacija transkodovanja sa gubicima pogorsava kvalitet — koristite master kopije
  • Optimalni parametri za mobilni H.265: bitrate 4–8 Mb/s, profil Main10, GOP 2 sekunde
  • Za produkciju koristite cloud servise transkodovanja (AWS Elemental, Azure Media) — ne opterecuju uredjaj

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође