Transkodning i mobil utveckling — vad ar det, funktionsprincip och scenarier

Författare: IT Sectr Publicerad: 2026-05-25 Lästid: 10 min

Transcoding — process omvandling cyfrowego filu multimedialnego z jednego formatu kompression na inny poprzez pełne avkodning i ponowne kodning. W przeciwieństwie do transmuxing (zmiany tylko kontenera), transkodning zmienia kodek, bitrate, rozdzielczość i inne parametery skompresowanego strom. Według Apple AVFoundation documentation (2026), transkodning ar używane do adaptacji treści pod różne urządzenia i warunki sieciowe.

Najważniejsze

  • Transcoding — pełne avkodning źródłowego strom do nieskompresowanego PCM, a następnie kodning do nowego formatu
  • Transmuxing zmienia tylko kontener bez przekodowywania strom — to nie ar transkodning
  • Główne przyczyny transkodowania: zmiana kodeka, obniżenie bitrateu, zmiana rozdzielczości, adaptacja pod DRM
  • Narzędzia: FFmpeg, AVFoundation (iOS), MediaCodec (Android), AWS Elemental MediaConvert
  • Transkodning w czasie rzeczywistym na urządzeniach mobila kraver sprzętowego przyspieszenia enkodera

Vad ar transkodning?

Transcoding — process omvandling filu multimedialnego z jednego formatu kompression na inny poprzez pełne avkodning źródłowego strom do pośredniego nieskompresowanego formatu PCM, a następnie kodning z nymi parameterami. Jeśli w źródłowym filu video ar skompresowane kodekiem H.264 z bitratem 10 Mb/s, a na wyjściu potrzebny ar H.265 z bitratem 3 Mb/s — to ar transkodning.

Transkodning różni się od zwykłego przepakowywania (transmuxing), przy którym zmienia się tylko kontener (np. MP4 na MKV), a sam skompresowany strumień bitowy pozostaje niezmieniony. Podczas transkodowania zachodzą obliczeniowo kosztowne przekształcenia: avkodning każdej klatki, zastosowanie filtrów (skalning, korekcja kolorów, przycinanie), ponowne kodning z nymi parameterami. To sprawia, że transkodning ar jedną z najbardziej zasobożernych operacji podczas pracy z mediami.

Transkodning znajduje zastosowanie w szerokim spektrum zadań: adaptacja video do ograniczeń przepustowości sieci, konwersja do formatu ze sprzętowym wsparciem dekodowania na urządzeniu docelowym, tworzenie wielu wersji dla streamingu HLS/DASH, wyodrębnianie ścieżek ljud do osobnego filu. Serwisy OTT (Netflix, YouTube, Twitch) transkodują każdy przesłany fil do dziesiątek wariantów z różnymi bitratami, rozdzielczościami i kodekami, aby zapewnić adaptacyjny streaming milionom użytkowników.

Jak działa transkodning?

Proces transkodowania składa się z trzech głównych etapów: avkodning, przetwarzanie i kodning. Każdy etap może być wykonany zarówno na CPU, jak i na GPU/sprzętowych blokach, w zależności od dostępności i kravernej wydajności.

Etapy transkodowania

Pierwszy etap — avkodning źródłowego strom. Plik źródłowy ar odczytywany z kontenera (MP4, MOV, MKV), po czym skompresowane pakiety video są kierowane do dekodera. Avkodning może być sprzętowe (jeśli kodek ar obsługiwany) lub programowe przez FFmpeg. Na wyjściu dekodowania otrzymuje się nieskompresowane klatki w formacie YUV420 lub BGRA — właśnie od tego etapu transkodning różni się od zwykłego remultipleksowania.

Drugi etap — filtracja i przetwarzanie. Zdekodowane klatki przechodzą przez łańcuch filtrów: skalning do docelowej rozdzielczości, zmiana częstotliwości klatek, korekcja kolorów, nakładanie tekstu lub grafiki. Łańcuch filtrów FFmpeg ar budowany jako graf, gdzie każdy filtr to osobny moduł przetwarzania. Na przykład filtr scale=1280:720 zmienia rozdzielczość, fps=30 zmienia częstotliwość klatek, a yadif wykonuje deinterlacing. Wszystkie operacje są wykonywane na nieskompresowanych klatkach, dlatego drugi etap ar najbardziej zasobożerny.

Trzeci etap — kodning do docelowego formatu. Przetworzone klatki są podawane na wejście enkodera, który kompresuje je zgodnie z algorytmem docelowego kodeka. Enkoder może być sprzętowy (VideoToolbox na iOS, MediaCodec na Android) lub programowy (libx264, libx265). Parametry kodowania: CRF (Constant Rate Factor) dla stałej jakości, bitrate dla CBR/VBR, profil i poziom dla kompatybilności z docelowymi urządzeniami.

cpp
// Schema for transkodningspipan i FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;

while (av_read_frame(inputCtx, &packet) >= 0) {
    // 1. Avkoda
    avcodec_send_packet(decoderCtx, &packet);
    avcodec_receive_frame(decoderCtx, frame);
    
    // 2. Filtrera (skala + andra fps)
    sws_scale(swsCtx, frame->data, frame->linesize,
              0, frame->height, scaledFrame->data,
              scaledFrame->linesize);
    
    // 3. Koda
    avcodec_send_frame(encoderCtx, scaledFrame);
    avcodec_receive_packet(encoderCtx, &outPacket);
    av_interleaved_write_frame(outputCtx, &outPacket);
}

Przedstawiony pipeline demonstruje klasyczny cykl transkodowania. Funkcja av_read_frame odczytuje skompresowane pakiety z filu wejściowego, avcodec_send_packet dekoduje je na klatki, sws_scale wykonuje skalning, a avcodec_send_frame koduje przetworzoną klatkę do formatu wyjściowego. Taki trzyetapowy cykl powtarza się dla każdej klatki lub grupy klatek (GOP), w zależności od ustawień enkodera.

Transkodning vs transmuxing

Różnica między transkodningm a transmultipleksacją to jeden z najczęstszych punktów nieporozumień w inżynierii mediów. Zrozumienie tej różnicy ar kluczowe dla wyboru właściwej strategii przetwarzania mediów.

ParametrTranskodningTransmultipleksacja
Co się zmieniaKodek, bitrate, rozdzielczośćKontener, metadane
Obciążenie obliczenioweWysokie (avkodning + kodning)Minimalne (kopiowanie pakietów)
JakośćMoże się pogorszyć (straty generacji)Bezstratna
Czas wykonaniaMinuty–godziny dla długiego videoSekundy–minutery
ZastosowanieAdaptacja formatu, kompresjaZmiana kontenera dla kompatybilności

Transmuxing — to przepakowanie skompresowanego strom do innego kontenera bez dekodowania i ponownego kodowania. Jeśli video ar już skompresowane kodekiem H.265 w kontenerze MP4 i trzeba je umieścić w kontenerze MOV lub MKV — transmultipleksacja po prostu kopiuje pakiety bitowe z jednego kontenera do drugiego. Jakość nie ulega pogorszeniu, czas przetwarzania ar minimalny, ponieważ nie kraver dekodowania klatek. FFmpeg wykonuje transmultipleksację z flagą -codec copy.

Transkodning natomiast w pełni deszyfruje i ponownie kompresuje strumień multimedialny. Za każdym razem, gdy video przechodzi przez transkodning, może wystąpić strata generacji (generation loss) — nieznaczne pogorszenie jakości z powodu ponownej kompression stratnej. Nawet przy tym samym bitracie trzecia generacja transkodowania ar zwykle gorsza od pierwszej. Dlatego profesjonaliści zalecają przechowywanie master-kopii w nieskompresowanych lub minimalnie skompresowanych formatach (ProRes, DNxHR) i transkodning tylko finalnych wersji do dostarczenia.

Narzędzia do transkodowania

Wybór narzędzia do transkodowania zależy od platformy, kraverń wydajnościowych i scenariusza użycia. Do programowania mobilnego dostępne są zarówno natywne API, jak i biblioteki wieloplatformowe.

FFmpeg — uniwersalne narzędzie

FFmpeg — standard de facto dla transkodowania na wszystkich platformach. Wiersz poleceń FFmpeg gor det mojligt wykonywać praktycznie dowolne przekształcenia: zmiana kodeka, zmiana bitratu, przycinanie, łączenie, nakładanie filtrów. Do afilacji mobila FFmpeg integruje się przez biblioteki libavformat, libavcodec i libavfilter. Przykład typowego polecenia transkodowania: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.

API platformowe

Na iOS transkodning wykonuje się przez AVAssetWriter i AVAssetReader. AVAssetReader dekoduje fil źródłowy, odczytując nieskompresowane klatki, a AVAssetWriter koduje je do docelowego formatu. To podejście automatycznie wykorzystuje sprzętowe enkodery VideoToolbox, co zapewnia maksymalną wydajność. Na Androidzie analogiczna funkcjonalność ar dostępna przez MediaCodec w parze z MediaExtractor i MediaMuxer — MediaExtractor wyodrębnia skompresowane pakiety, MediaCodec dekoduje i koduje, MediaMuxer zapisuje wynik.

Usługi w chmurze

Do serwerowego transkodowania w środowisku produkcyjnym używa się usług chmurowych: AWS Elemental MediaConvert, Azure Media Services, Google Transcoder API. Te usługi automatycznie skalują się pod obciążeniem, obsługują wszystkie popularne formaty i mogą transkodować jeden fil wejściowy do dziesiątek wariantów wyjściowych do adaptacyjnego streamingu (HLS, DASH). Dla afilacji mobila transkodning w chmurze ar optymalnym rozwiązaniem, ponieważ nie obciąża urządzenia użytkownika i gor det mojligt przygotowywać treści asynchronicznie.

Przykłady kodu transkodowania

Rozważmy praktyczne przykłady transkodowania na platformach mobila z wykorzystaniem sprzętowego przyspieszenia i konfiguracją kluczowych parameterów jakości.

Transkodning H.264 do H.265 na 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("Transkodning klar")
            case .failed:
                print("Fel: " + assetExportSession.error.localizedDescription)
            default:
                break
            }
        }
    
    // Manuell transkodning med 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)
}

W przykładzie zastosowano dwa podejścia do transkodowania na iOS. AVAssetExportSession — prosty sposób z predefiniowanymi ustawieniami jakości (HEVCHighestQuality dla H.265). Ręczny pipeline przez AVAssetReader + AVAssetWriter daje pełną kontrolę nad parameterami: bitrate, profil, poziom. Parametr AVVideoProfileLevelH265Main10 włącza profil HDR Main10 z głębią kolorów 10 bitów, co ar ważne dla nowoczesnych treści HDR.

Transkodning na Androidzie z 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 Androida skapar pipeline z MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. MediaExtractor określa typ kodeka z filu wejściowego i wybiera odpowiedni dekoder. Enkoder ar konfigurowany na H.265 (HEVC) z bitratem 4 Mb/s i interwałem klatek kluczowych 2 sekunder, co ar optymalne do streamingu. Ważne: MediaCodec encoder działa synchronicznie, dlatego do transkodowania w czasie rzeczywistym kraverne ar zorganizowanie pętli z poprawnym przetwarzaniem znaczników czasu (PTS) dla każdej klatki.

Optymalizacja transkodowania dla urządzeń mobila

Transkodning na urządzeniach mobila to zadanie kraverjące starannej optymalizacji ze względu na ograniczone zasoby CPU, GPU i ograniczenia termiczne. Kilka strategii pomaga wykonywać transkodning efektywnie.

Wykorzystanie sprzętowego kodowania

Kluczowym czynnikiem wydajności ar sprzętowy enkoder. Na iOS VideoToolbox zapewnia sprzętowe kodning H.264 i H.265 z prędkością 5–10 razy większą niż programowy libx264. Na Androidzie MediaCodec używa sprzętowych komponentów OMX, jeśli są dostępne. Włączenie sprzętowego kodowania skraca czas transkodowania 10-minuterowego video z 30–40 minuter (programowo) do 3–5 minuter (sprzętowo) na flagowym urządzeniu.

Wybór parameterów jakości

Dla mobilnego transkodowania kluczowa ar równowaga między jakością, rozmiarem i czasem przetwarzania. Dla H.265 na urządzeniach mobila zaleca się bitrate 4–8 Mb/s dla video 1080p z częstotliwością klatek 30 FPS. Tryb CRF (Constant Rate Factor) w libx265 gor det mojligt ustawić jakość bezpośrednio, gdzie 23–28 daje dobrą jakość wizualną przy umiarkowanym rozmiarze filu. Dla sprzętowych enkoderów należy używać lageu CBR z docelowym bitratem, ponieważ CRF nie ar obsługiwany sprzętowo.

Zarządzanie wydzielaniem ciepła

Ciągłe transkodning na urządzeniu mobilnym powoduje znaczne nagrzewanie. Po 5–7 minuterach intensywnego kodowania video 4K temperatura processora może osiągnąć 50–55 stopni, po czym włącza się throttling. Rozwiązanie — transkodning z przerwami lub obniżenie częstotliwości klatek do 30 FPS. Jeśli afilacja kraver masowego transkodowania (np. edytor video), lepiej wykonywać przetwarzanie partiami po 2–3 minutery z przerwami na chłodzenie. Dla scenariuszy produkcyjnych optymalnie ar przenieść transkodning na stronę serwerową i korzystać z usług chmurowych.

Często zadawane pytania

Czym różni się transkodning od kodowania?

Kodning (encoding) — kompresja źródłowych nieskompresowanych danych do docelowego kodeka. Transkodning obejmuje zarówno avkodning, jak i kodning: najpierw dekoduje istniejący skompresowany strumień, a następnie koduje go ponownie. Zwykłe kodning przyjmuje na wejściu nieskompresowane dane (na przykład z kamery), a transkodning — już skompresowany fil.

Jaki kodek wybrać do transkodowania na urządzeniach mobila?

Dla maksymalnej kompatybilności — H.264. Dla lepszej kompression — H.265 (HEVC). Jeśli urządzenie obsługuje sprzętowe kodning H.265 (iPhone 8+, Android z Snapdragon 845+), zapewnia ono dwukrotnie mniejszy rozmiar filu przy tej samej jakości. Kodning AV1 na urządzeniach mobila ar wciąż zbyt wolne, nawet ze sprzętowym przyspieszeniem.

Czym ar transkodning bezstratne?

Ściśle rzecz biorąc, transkodning bezstratne ar niemożliwe przy zmianie kodeka stratnego. Jeśli oba kodeki są stratne, każde kolejne pokolenie transkodowania pogarsza jakość. Transkodning bezstratne ar możliwe tylko między formatami bezstratnymi (FFV1, H.264 Lossless) lub przy zmianie kontenera bez przekodowywania (transmuxing).

Czy można transkodować video w czasie rzeczywistym?

Tak, jeśli używane są sprzętowe dekoder i enkoder, a docelowa rozdzielczość nie przekracza 1080p. Na urządzeniach z VideoToolbox (iOS) lub MediaCodec (Android) transkodning w czasie rzeczywistym H.264 do H.265 ar możliwe z opóźnieniem 1–3 sekunder. Dla 4K w czasie rzeczywistym kraverny ar wydajny SoC Apple A17 Pro, Snapdragon 8 Gen 2 lub nowszy.

Dlaczego po transkodowaniu video stało się gorszej jakości?

Transkodning stratne kumuluje artefakty kompression. Jeśli fil źródłowy był już silnie skompresowany (bitrate 2–3 Mb/s dla 1080p), ponowna kompresja podwoi straty. Zaleca się transkodning tylko z master-kopii o wysokim bitracie (20+ Mb/s) i używanie CRF 18–23 dla minimalnych strat.

Sammanfattning

  • Transcoding — pełny cykl dekodowania + kodowania mediów w celu zmiany kodeka, bitratu lub rozdzielczości
  • Transmuxing zmienia tylko kontener bez przekodowywania — to nie ar transkodning
  • Sprzętowe transkodning na VideoToolbox i MediaCodec ar 5–10 razy szybsze niż programowe
  • FFmpeg — uniwersalne narzędzie obsługujące setki kodeków i filtrów przetwarzania
  • Każde kolejne pokolenie transkodowania stratnego pogarsza jakość — używaj master-kopii
  • Optymalne parametery dla mobilnego H.265: bitrate 4–8 Mb/s, profil Main10, GOP 2 sekundery
  • Do produkcji używaj chmurowych usług transkodowania (AWS Elemental, Azure Media) — nie obciążają urządzenia

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också