Transcodarea in dezvoltarea mobila — ce este, principiul de functionare si scenarii

Autor: IT Sectr Publicat: 2026-05-25 Timp de citire: 10 min

Transcoding — procesul de conversie a unui fisier media digital dintr-un format de compresie in altul prin decodificare completa si recodificare. Spre deosebire de transmultiplexare (modificarea doar a containerului), transcodarea modifica codecul, bitrate-ul, rezolutia si alti parametri ai fluxului comprimat. Conform Apple AVFoundation documentation (2026), transcodarea este utilizata pentru adaptarea continutului la diferite dispozitive si conditii de retea.

Principalele puncte

  • Transcoding — decodificarea completa a fluxului sursa in PCM necomprimat, urmata de codificarea intr-un nou format
  • Transmuxing modifica doar containerul fara recodificarea fluxului — aceasta nu este transcodare
  • Principalele cauze ale transcodarii: schimbarea codecului, reducerea bitrate-ului, modificarea rezolutiei, adaptarea la DRM
  • Instrumente: FFmpeg, AVFoundation (iOS), MediaCodec (Android), AWS Elemental MediaConvert
  • Transcodarea in timp real pe dispozitive mobile necesita accelerarea hardware a encoderului

Ce este transcodarea?

Transcoding — procesul de conversie a unui fisier media dintr-un format de compresie in altul prin decodificarea completa a fluxului sursa intr-un format intermediar PCM necomprimat si apoi codificarea cu parametri noi. Daca in fisierul sursa video este comprimat cu codecul H.264 cu un bitrate de 10 Mb/s, iar la iesire este necesar H.265 cu un bitrate de 3 Mb/s — aceasta este transcodare.

Transcodarea se deosebeste de reambalarea simpla (transmuxing), cand se modifica doar containerul (de exemplu, MP4 in MKV), iar fluxul de biti comprimat ramane neschimbat. In timpul transcodarii au loc transformari costisitoare din punct de vedere computational: decodificarea fiecarui cadru, aplicarea filtrelor (scalare, corectie cromatica, decupare), recodificarea cu parametri noi. Aceasta face ca transcodarea sa fie una dintre cele mai consumatoare de resurse operatiuni la lucrul cu media.

Transcodarea se aplica intr-o gama larga de sarcini: adaptarea videoului la limitarile latimii de banda a retelei, conversia intr-un format cu suport hardware pentru decodificare pe dispozitivul tinta, crearea mai multor versiuni pentru streaming HLS/DASH, extragerea pistelor audio intr-un fisier separat. Serviciile OTT (Netflix, YouTube, Twitch) transcodeaza fiecare fisier incarcat in zeci de variante cu diferite bitrate-uri, rezolutii si codecuri pentru a asigura streaming adaptiv pentru milioane de utilizatori.

Cum functioneaza transcodarea?

Procesul de transcodare consta din trei etape principale: decodificare, procesare si codificare. Fiecare etapa poate fi executata atat pe CPU, cat si pe GPU/blocuri hardware, in functie de disponibilitate si performanta necesara.

Etapele transcodarii

Prima etapa — decodificarea fluxului sursa. Fisierul sursa este citit din container (MP4, MOV, MKV), dupa care pachetele video comprimate sunt trimise la decodor. Decodificarea poate fi hardware (daca codecul este suportat) sau software prin FFmpeg. La iesirea decodificarii se obtin cadre necomprimate in format YUV420 sau BGRA — tocmai prin aceasta etapa se deosebeste transcodarea de simpla remultiplexare.

A doua etapa — filtrarea si procesarea. Cadrele decodificate trec printr-un lant de filtre: scalare la rezolutia tinta, modificarea frecventei cadrelor, corectia culorilor, suprapunerea textului sau graficii. Lantul de filtre FFmpeg este construit ca un graf, unde fiecare filtru este un modul de procesare separat. De exemplu, filtrul scale=1280:720 modifica rezolutia, fps=30 modifica frecventa cadrelor, iar yadif realizeaza deinterlacingul. Toate operatiunile sunt executate pe cadre necomprimate, de aceea a doua etapa este cea mai consumatoare de resurse.

A treia etapa — codificarea in formatul tinta. Cadrele procesate sunt trimise la intrarea encoderului, care le comprima conform algoritmului codecului tinta. Encoderul poate fi hardware (VideoToolbox pe iOS, MediaCodec pe Android) sau software (libx264, libx265). Parametrii de codificare: CRF (Constant Rate Factor) pentru calitate constanta, bitrate pentru CBR/VBR, profil si nivel pentru compatibilitatea cu dispozitivele tinta.

cpp
// Schema pipeline-ului de transcodare in FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;

while (av_read_frame(inputCtx, &packet) >= 0) {
    // 1. Decodificare
    avcodec_send_packet(decoderCtx, &packet);
    avcodec_receive_frame(decoderCtx, frame);
    
    // 2. Filtrare (scalare + modificare fps)
    sws_scale(swsCtx, frame->data, frame->linesize,
              0, frame->height, scaledFrame->data,
              scaledFrame->linesize);
    
    // 3. Codificare
    avcodec_send_frame(encoderCtx, scaledFrame);
    avcodec_receive_packet(encoderCtx, &outPacket);
    av_interleaved_write_frame(outputCtx, &outPacket);
}

Pipeline-ul prezentat demonstreaza ciclul clasic de transcodare. Functia av_read_frame citeste pachetele comprimate din fisierul de intrare, avcodec_send_packet le decodifica in cadre, sws_scale realizeaza scalarea, iar avcodec_send_frame codifica cadrul procesat in formatul de iesire. Acest ciclu in trei etape se repeta pentru fiecare cadru sau grup de cadre (GOP), in functie de setarile encoderului.

Transcodare vs transmultiplexare

Diferenta dintre transcodare si transmultiplexare este unul dintre cele mai frecvente puncte de confuzie in ingineria media. Intelegerea acestei diferente este cruciala pentru alegerea strategiei corecte de procesare a media.

ParametruTranscodareTransmultiplexare
Ce se modificaCodec, bitrate, rezolutieContainer, metadate
Incarcarea computationalaRidicata (decodificare + codificare)Minima (copierea pachetelor)
CalitateaSe poate degrada (pierderi de generatie)Fara pierderi
Timpul de executieMinute–ore pentru un videoclip lungSecunde–minute
AplicareAdaptarea formatului, compresieModificarea containerului pentru compatibilitate

Transmuxing — reambalarea fluxului comprimat intr-un alt container fara decodificare si recodificare. Daca videoclipul este deja comprimat cu codecul H.265 in containerul MP4 si trebuie plasat in containerul MOV sau MKV — transmultiplexarea copiaza pur si simplu pachetele de biti dintr-un container in altul. Calitatea nu are de suferit, timpul de procesare este minim, deoarece nu necesita decodificarea cadrelor. FFmpeg realizeaza transmultiplexarea cu flag-ul -codec copy.

Transcodarea insa decodifica complet si recompreseaza fluxul media. De fiecare data cand videoclipul trece prin transcodare, poate aparea pierderea de generatie (generation loss) — o deteriorare usoara a calitatii din cauza recompresiei cu pierderi. Chiar si la acelasi bitrate, a treia generatie de transcodare este de obicei mai slaba decat prima. De aceea profesionistii recomanda pastrarea copiilor master in formate necomprimate sau minim comprimate (ProRes, DNxHR) si transcodarea doar a versiunilor finale pentru livrare.

Instrumente pentru transcodare

Alegerea instrumentului de transcodare depinde de platforma, cerintele de performanta si scenariul de utilizare. Pentru dezvoltarea mobila sunt disponibile atat API-uri native, cat si biblioteci cross-platform.

FFmpeg — instrument universal

FFmpeg — standardul de facto pentru transcodare pe toate platformele. Linia de comanda FFmpeg permite efectuarea practic a oricaror transformari: schimbarea codecului, modificarea bitrate-ului, decuparea, imbinarea, aplicarea filtrelor. Pentru aplicatiile mobile, FFmpeg se integreaza prin bibliotecile libavformat, libavcodec si libavfilter. Exemplu de comanda tipica de transcodare: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.

API-uri platforma

Pe iOS transcodarea se realizeaza prin AVAssetWriter si AVAssetReader. AVAssetReader decodifica fisierul sursa, citind cadrele necomprimate, iar AVAssetWriter le codifica in formatul tinta. Aceasta abordare utilizeaza automat encodearele hardware VideoToolbox, asigurand performanta maxima. Pe Android, functionalitatea analoga este disponibila prin MediaCodec impreuna cu MediaExtractor si MediaMuxer — MediaExtractor extrage pachetele comprimate, MediaCodec decodifica si codifica, MediaMuxer scrie rezultatul.

Servicii cloud

Pentru transcodarea pe server in mediu de productie se folosesc servicii cloud: AWS Elemental MediaConvert, Azure Media Services, Google Transcoder API. Aceste servicii se scaleaza automat sub sarcina, suporta toate formatele populare si pot transcoda un singur fisier de intrare in zeci de variante de iesire pentru streaming adaptiv (HLS, DASH). Pentru aplicatiile mobile, transcodarea in cloud este solutia optima, deoarece nu incarca dispozitivul utilizatorului si permite pregatirea asincrona a continutului.

Exemple de cod pentru transcodare

Sa examinam exemple practice de transcodare pe platforme mobile utilizand accelerarea hardware si configurarea parametrilor cheie de calitate.

Transcodarea H.264 in H.265 pe iOS

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("Transcodare finalizata")
            case .failed:
                print("Eroare: " + assetExportSession.error.localizedDescription)
            default:
                break
            }
        }
    
    // Transcodare manuala cu 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)
}

In exemplu sunt utilizate doua abordari de transcodare pe iOS. AVAssetExportSession — o modalitate simpla cu presetari de calitate (HEVCHighestQuality pentru H.265). Pipeline-ul manual prin AVAssetReader + AVAssetWriter ofera control complet asupra parametrilor: bitrate, profil, nivel. Parametrul AVVideoProfileLevelH265Main10 activeaza profilul HDR Main10 cu adancimea de culoare de 10 biti, ceea ce este important pentru continutul HDR modern.

Transcodarea pe Android cu 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()
    }
}

Codul pe Android creeaza un pipeline din MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. MediaExtractor determina tipul codecului din fisierul de intrare si selecteaza decodorul corespunzator. Encoderul este configurat pentru H.265 (HEVC) cu un bitrate de 4 Mb/s si un interval al cadrelor cheie de 2 secunde, ceea ce este optim pentru streaming. Important: MediaCodec encoder functioneaza sincron, de aceea pentru transcodarea in timp real este necesara organizarea unei bucle cu procesarea corecta a timestamp-urilor (PTS) pentru fiecare cadru.

Optimizarea transcodarii pentru dispozitive mobile

Transcodarea pe dispozitive mobile este o sarcina care necesita o optimizare atenta din cauza resurselor limitate de CPU, GPU si a constrangerilor termice. Cateva strategii ajuta la efectuarea eficienta a transcodarii.

Utilizarea codificarii hardware

Factorul cheie de performanta — encoderul hardware. Pe iOS VideoToolbox ofera codificare hardware H.264 si H.265 cu o viteza de 5–10 ori mai mare decat libx264 software. Pe Android, MediaCodec utilizeaza componente hardware OMX, daca sunt disponibile. Activarea codificarii hardware reduce timpul de transcodare a unui videoclip de 10 minute de la 30–40 minute (software) la 3–5 minute (hardware) pe un dispozitiv flagship.

Alegerea parametrilor de calitate

Pentru transcodarea mobila, echilibrul intre calitate, dimensiune si timpul de procesare este crucial. Pentru H.265 pe dispozitive mobile se recomanda un bitrate de 4–8 Mb/s pentru videoclip 1080p cu frecventa cadrelor de 30 FPS. Modul CRF (Constant Rate Factor) in libx265 permite setarea directa a calitatii, unde 23–28 ofera o calitate vizuala buna cu o dimensiune moderata a fisierului. Pentru encodearele hardware, utilizati modul CBR cu bitrate tinta, deoarece CRF nu este suportat hardware.

Gestionarea degajarii de caldura

Transcodarea continua pe un dispozitiv mobil cauzeaza o incalzire semnificativa. Dupa 5–7 minute de codificare intensiva a videoclipului 4K, temperatura procesorului poate atinge 50–55 de grade, dupa care se activeaza throttling-ul. Solutia — transcodarea cu pauze sau reducerea frecventei cadrelor la 30 FPS. Daca aplicatia necesita transcodare in masa (de exemplu, un editor video), este mai bine sa se execute procesarea in loturi de 2–3 minute cu intervale de racire. Pentru scenarii de productie, optim este sa mutati transcodarea pe partea de server si sa utilizati servicii cloud.

Intrebari frecvente

Cu ce se deosebeste transcodarea de codificare?

Codificarea (encoding) — compresia datelor sursa necomprimate in codecul tinta. Transcodarea include atat decodificarea, cat si codificarea: mai intai decodifica fluxul comprimat existent, apoi il codifica din nou. Codificarea simpla primeste la intrare date necomprimate (de exemplu, de la camera), iar transcodarea — un fisier deja comprimat.

Ce codec sa aleg pentru transcodare pe dispozitive mobile?

Pentru compatibilitate maxima — H.264. Pentru o compresie mai buna — H.265 (HEVC). Daca dispozitivul suporta codificarea hardware H.265 (iPhone 8+, Android cu Snapdragon 845+), acesta asigura o dimensiune de doua ori mai mica a fisierului la aceeasi calitate. Codificarea AV1 pe dispozitive mobile este inca prea lenta, chiar si cu accelerare hardware.

Ce este transcodarea fara pierderi?

Strict vorbind, transcodarea fara pierderi este imposibila la schimbarea codecului cu pierderi. Daca ambele codecuri sunt cu pierderi, fiecare generatie de transcodare degradeaza calitatea. Transcodarea fara pierderi este posibila doar intre formate fara pierderi (FFV1, H.264 Lossless) sau la schimbarea containerului fara recodificare (transmuxing).

Se poate transcoda un videoclip in timp real?

Da, daca se utilizeaza decodor si encoder hardware, iar rezolutia tinta nu depaseste 1080p. Pe dispozitivele cu VideoToolbox (iOS) sau MediaCodec (Android), transcodarea in timp real H.264->H.265 este posibila cu o intarziere de 1–3 secunde. Pentru 4K in timp real este necesar un SoC puternic Apple A17 Pro, Snapdragon 8 Gen 2 sau superior.

De ce dupa transcodare videoclipul a devenit de calitate mai slaba?

Transcodarea cu pierderi acumuleaza artefacte de compresie. Daca fisierul sursa era deja puternic comprimat (bitrate 2–3 Mb/s pentru 1080p), recompresia va dubla pierderile. Se recomanda transcodarea doar din copii master cu bitrate ridicat (20+ Mb/s) si utilizarea CRF 18–23 pentru pierderi minime.

Concluzii

  • Transcoding — ciclu complet de decodificare + codificare media pentru schimbarea codecului, bitrate-ului sau rezolutiei
  • Transmuxing modifica doar containerul fara recodificare — aceasta nu este transcodare
  • Transcodarea hardware pe VideoToolbox si MediaCodec este de 5–10 ori mai rapida decat cea software
  • FFmpeg — instrument universal care suporta sute de codecuri si filtre de procesare
  • Fiecare generatie de transcodare cu pierderi degradeaza calitatea — utilizati copii master
  • Parametri optimi pentru H.265 mobil: bitrate 4–8 Mb/s, profil Main10, GOP 2 secunde
  • Pentru productie utilizati servicii cloud de transcodare (AWS Elemental, Azure Media) — nu incarca dispozitivul

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și