Transcoding nello sviluppo mobile — cos’è, principio di funzionamento e scenari d’uso

Autore: IT Sectr Pubblicato: 2026-05-25 Tempo di lettura: 10 min

Il transcoding è il processo di conversione di un file multimediale digitale da un formato di compressione a un altro con decodifica completa e ricodifica. A differenza del transmuxing (modifica solo del contenitore), il transcoding modifica il codec, il bitrate, la risoluzione e altri parametri del flusso compresso. Secondo Apple AVFoundation documentation (2026), il transcoding viene utilizzato per adattare i contenuti a diversi dispositivi e condizioni di rete.

Punti Chiave

  • Transcoding è la decodifica completa del flusso sorgente in PCM non compresso seguita dalla codifica in un nuovo formato
  • Transmuxing modifica solo il contenitore senza ricodificare il flusso — non è transcoding
  • Motivi principali del transcoding: cambio codec, riduzione bitrate, cambio risoluzione, adattamento DRM
  • Strumenti: FFmpeg, AVFoundation (iOS), MediaCodec (Android), AWS Elemental MediaConvert
  • Transcoding in tempo reale su dispositivi mobili richiede accelerazione hardware dell’encoder

Cos’è il Transcoding?

Transcoding è il processo di conversione di un file multimediale da un formato di compressione a un altro decodificando completamente il flusso sorgente in un formato PCM intermedio non compresso e quindi codificando con nuovi parametri. Se il file sorgente utilizza il codec H.264 con un bitrate di 10 Mbps e l’output richiede H.265 con un bitrate di 3 Mbps — questo è transcoding.

Il transcoding differisce dal semplice re-impacchettamento (transmuxing), dove cambia solo il contenitore (es. da MP4 a MKV) mentre il flusso di bit compresso rimane invariato. Il transcoding comporta operazioni computazionalmente costose: decodifica di ogni fotogramma, applicazione di filtri (ridimensionamento, correzione colore, ritaglio) e ricodifica con nuovi parametri. Questo rende il transcoding una delle operazioni più intensive in termini di risorse quando si lavora con i media.

Il transcoding viene utilizzato in un’ampia gamma di attività: adattamento del video ai limiti di larghezza di banda, conversione in un formato con supporto di decodifica hardware sul dispositivo di destinazione, creazione di più versioni per lo streaming HLS/DASH, estrazione di tracce audio in un file separato. I servizi OTT (Netflix, YouTube, Twitch) transcodificano ogni file caricato in dozzine di varianti con diversi bitrate, risoluzioni e codec per fornire streaming adattivo a milioni di utenti.

Come Funziona il Transcoding?

Il processo di transcoding si compone di tre fasi principali: decodifica, elaborazione e codifica. Ogni fase può essere eseguita su CPU o su blocchi GPU/hardware a seconda della disponibilità e delle prestazioni richieste.

Fasi del Transcoding

La prima fase è la decodifica del flusso sorgente. Il file sorgente viene letto dal contenitore (MP4, MOV, MKV), dopodiché i pacchetti video compressi vengono inviati al decoder. La decodifica può essere hardware (se il codec è supportato) o software tramite FFmpeg. L’output della decodifica sono fotogrammi non compressi in formato YUV420 o BGRA — questa è la fase in cui il transcoding differisce dal semplice rimultiplexing.

La seconda fase è il filtraggio e l’elaborazione. I fotogrammi decodificati attraversano una catena di filtri: ridimensionamento alla risoluzione target, modifica del frame rate, correzione colore, sovrapposizione di testo o grafica. La catena di filtri FFmpeg è costruita come un grafo in cui ogni filtro è un modulo di elaborazione separato. Ad esempio, il filtro scale=1280:720 modifica la risoluzione, fps=30 modifica il frame rate e yadif esegue il deinterlacciamento. Tutte le operazioni vengono eseguite su fotogrammi non compressi, rendendo la seconda fase la più intensiva in termini di risorse.

La terza fase è la codifica nel formato di destinazione. I fotogrammi elaborati vengono inviati all’encoder, che li comprime secondo l’algoritmo del codec target. L’encoder può essere hardware (VideoToolbox su iOS, MediaCodec su Android) o software (libx264, libx265). Parametri di codifica: CRF (Constant Rate Factor) per qualità costante, bitrate per CBR/VBR, profilo e livello per la compatibilità con i dispositivi target.

cpp
// Diagramma della pipeline di transcoding con 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 (ridimensionamento + cambio 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);
}

La pipeline sopra illustra il ciclo classico di transcoding. La funzione av_read_frame legge i pacchetti compressi dal file di input, avcodec_send_packet li decodifica in fotogrammi, sws_scale esegue il ridimensionamento e avcodec_send_frame codifica il fotogramma elaborato nel formato di output. Questo ciclo a tre fasi si ripete per ogni fotogramma o gruppo di fotogrammi (GOP), a seconda delle impostazioni dell’encoder.

Transcoding vs Transmuxing

La differenza tra transcoding e transmuxing è uno dei punti di confusione più comuni nell’ingegneria dei media. Comprendere questa differenza è fondamentale per scegliere la giusta strategia di elaborazione dei media.

ParametroTranscodingTransmuxing
Cosa cambiaCodec, bitrate, risoluzioneContenitore, metadati
Carico computazionaleAlto (decodifica + codifica)Minimo (copia pacchetti)
QualitàPuò degradarsi (perdita di generazione)Senza perdita
Tempo di esecuzioneMinuti–ore per video lungoSecondi–minuti
ApplicazioneAdattamento formato, compressioneCambio contenitore per compatibilità

Transmuxing è il re-impacchettamento di un flusso compresso in un contenitore diverso senza decodifica e ricodifica. Se il video è già compresso con il codec H.265 in un contenitore MP4 e deve essere inserito in un contenitore MOV o MKV — il transmuxing copia semplicemente i pacchetti del flusso di bit da un contenitore all’altro. La qualità non viene compromessa, il tempo di elaborazione è minimo poiché non è richiesta la decodifica dei fotogrammi. FFmpeg esegue il transmuxing con il flag -codec copy.

Transcoding, d’altra parte, decodifica e ricomprime completamente il flusso multimediale. Ogni volta che un video subisce un transcoding, può verificarsi una perdita di generazione (generation loss) — un leggero degrado della qualità dovuto alla compressione con perdita ripetuta. Anche con lo stesso bitrate, la terza generazione di transcoding è solitamente peggiore della prima. Ecco perché i professionisti raccomandano di conservare le copie master in formati non compressi o minimamente compressi (ProRes, DNxHR) e di transcodificare solo le versioni finali per la distribuzione.

Strumenti di Transcoding

La scelta dello strumento di transcoding dipende dalla piattaforma, dai requisiti di prestazione e dal caso d’uso. Per lo sviluppo mobile, sono disponibili sia API native che librerie multipiattaforma.

FFmpeg — Strumento Universale

FFmpeg è lo standard de facto per il transcoding su tutte le piattaforme. La riga di comando di FFmpeg consente di eseguire praticamente qualsiasi conversione: cambio codec, regolazione del bitrate, taglio, concatenamento, applicazione di filtri. Per le applicazioni mobili, FFmpeg viene integrato tramite le librerie libavformat, libavcodec e libavfilter. Esempio di un comando tipico di transcoding: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.

API di Piattaforma

Su iOS, il transcoding viene eseguito tramite AVAssetWriter e AVAssetReader. AVAssetReader decodifica il file sorgente leggendo fotogrammi non compressi e AVAssetWriter li codifica nel formato di destinazione. Questo approccio utilizza automaticamente gli encoder hardware VideoToolbox, garantendo le massime prestazioni. Su Android, funzionalità simili sono disponibili tramite MediaCodec in combinazione con MediaExtractor e MediaMuxer — MediaExtractor estrae i pacchetti compressi, MediaCodec decodifica e codifica, MediaMuxer scrive il risultato.

Servizi Cloud

Per il transcoding lato server in ambienti di produzione, vengono utilizzati servizi cloud: AWS Elemental MediaConvert, Azure Media Services, Google Transcoder API. Questi servizi si adattano automaticamente al carico, supportano tutti i formati più diffusi e possono transcodificare un singolo file di input in dozzine di varianti di output per lo streaming adattivo (HLS, DASH). Per le applicazioni mobili, il transcoding cloud è la soluzione ottimale poiché non appesantisce il dispositivo dell’utente e consente la preparazione asincrona dei contenuti.

Esempi di Codice di Transcoding

Esaminiamo esempi pratici di transcoding su piattaforme mobili utilizzando l’accelerazione hardware e la configurazione dei parametri chiave di qualità.

Transcoding da H.264 a H.265 su 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("Transcoding completato")
            case .failed:
                print("Errore: " + assetExportSession.error.localizedDescription)
            default:
                break
            }
        }
    
    // Transcoding manuale con 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)
}

L’esempio mostra due approcci al transcoding su iOS. AVAssetExportSession è un modo semplice con preimpostazioni di qualità (HEVCHighestQuality per H.265). La pipeline manuale tramite AVAssetReader + AVAssetWriter fornisce il controllo completo sui parametri: bitrate, profilo, livello. Il parametro AVVideoProfileLevelH265Main10 abilita il profilo HDR Main10 con profondità di colore a 10 bit, importante per i contenuti HDR moderni.

Transcoding su Android con 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()
    }
}

Il codice Android crea una pipeline composta da MediaExtractor — decoder MediaCodec — encoder MediaCodec — MediaMuxer. MediaExtractor determina il tipo di codec dal file di input e seleziona il decoder corrispondente. L’encoder è configurato per H.265 (HEVC) con un bitrate di 4 Mbps e un intervallo di keyframe di 2 secondi, ottimale per lo streaming. Importante: l’encoder MediaCodec funziona in modo sincrono, quindi per il transcoding in tempo reale è necessario implementare un ciclo con la corretta gestione dei timestamp PTS per ogni fotogramma.

Ottimizzazione del Transcoding per Dispositivi Mobili

Il transcoding sui dispositivi mobili è un’attività che richiede un’attenta ottimizzazione a causa delle limitate risorse di CPU, GPU e dei vincoli termici. Diverse strategie aiutano a eseguire il transcoding in modo efficiente.

Utilizzo della Codifica Hardware

Il fattore chiave delle prestazioni è l’encoder hardware. Su iOS, VideoToolbox fornisce codifica hardware H.264 e H.265 a velocità 5–10 volte superiori rispetto a libx264 software. Su Android, MediaCodec utilizza componenti OMX hardware se disponibili. L’abilitazione della codifica hardware riduce il tempo di transcoding di un video di 10 minuti da 30–40 minuti (software) a 3–5 minuti (hardware) su un dispositivo flagship.

Scelta dei Parametri di Qualità

Per il transcoding mobile, l’equilibrio tra qualità, dimensione e tempo di elaborazione è fondamentale. Per H.265 su dispositivi mobili, si consiglia un bitrate di 4–8 Mbps per video 1080p a 30 FPS. La modalità CRF (Constant Rate Factor) in libx265 consente di impostare direttamente la qualità, dove 23–28 offre una buona qualità visiva con dimensioni del file moderate. Per gli encoder hardware, utilizzare la modalità CBR con un bitrate target poiché CRF non è supportato dall’hardware.

Gestione Termica

Il transcoding continuo su un dispositivo mobile provoca un riscaldamento significativo. Dopo 5–7 minuti di codifica intensiva di video 4K, la temperatura del processore può raggiungere 50–55 gradi, dopodiché si attiva il throttling. La soluzione è transcodificare con pause o ridurre il frame rate a 30 FPS. Se l’applicazione richiede transcoding batch (es. un editor video), è meglio elaborare in lotti di 2–3 minuti con intervalli di raffreddamento. Per scenari di produzione, l’ideale è spostare il transcoding sul lato server e utilizzare servizi cloud.

Domande Frequenti

In cosa differisce il transcoding dall’encoding?

L’encoding è la compressione di dati grezzi non compressi in un codec target. Il transcoding include sia la decodifica che la codifica: prima decodifica un flusso compresso esistente, poi lo codifica nuovamente. L’encoding semplice prende dati non compressi come input (es. da una fotocamera), mentre il transcoding prende un file già compresso.

Quale codec scegliere per il transcoding su dispositivi mobili?

Per la massima compatibilità — H.264. Per una migliore compressione — H.265 (HEVC). Se il dispositivo supporta la codifica hardware H.265 (iPhone 8+, Android con Snapdragon 845+), offre la metà della dimensione del file alla stessa qualità. La codifica AV1 sui dispositivi mobili è ancora troppo lenta anche con accelerazione hardware.

Cos’è il “transcoding senza perdita”?

In senso stretto, il transcoding senza perdita è impossibile quando si passa tra codec con perdita. Se entrambi i codec hanno perdita, ogni generazione di transcoding degrada la qualità. Il transcoding senza perdita è possibile solo tra formati senza perdita (FFV1, H.264 Lossless) o quando si cambia contenitore senza ricodificare (transmuxing).

È possibile transcodificare video in tempo reale?

Sì, se si utilizzano decoder ed encoder hardware e la risoluzione target non supera 1080p. Su dispositivi con VideoToolbox (iOS) o MediaCodec (Android), il transcoding in tempo reale H.264→H.265 è possibile con un ritardo di 1–3 secondi. Per il 4K in tempo reale, è necessario un SoC potente come Apple A17 Pro, Snapdragon 8 Gen 2 o superiore.

Perché la qualità del video è peggiorata dopo il transcoding?

Il transcoding con perdita accumula artefatti di compressione. Se il file sorgente era già fortemente compresso (bitrate 2–3 Mbps per 1080p), la ricompressione raddoppia le perdite. Si raccomanda di transcodificare solo da copie master con bitrate elevato (20+ Mbps) e utilizzare CRF 18–23 per perdite minime.

Riepilogo

  • Transcoding è il ciclo completo di decodifica + codifica dei media per modificare codec, bitrate o risoluzione
  • Transmuxing modifica solo il contenitore senza ricodificare — non è transcoding
  • Transcoding hardware su VideoToolbox e MediaCodec è 5–10 volte più veloce del software
  • FFmpeg è uno strumento universale che supporta centinaia di codec e filtri di elaborazione
  • Ogni generazione di transcoding con perdita degrada la qualità — utilizzare copie master
  • Parametri ottimali per H.265 mobile: bitrate 4–8 Mbps, profilo Main10, GOP 2 secondi
  • Per la produzione utilizzare servizi di transcoding cloud (AWS Elemental, Azure Media) — non appesantiscono il dispositivo

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche