Transcoding dalam pengembangan mobile — apa itu, prinsip kerja dan skenario

Penulis: IT Sectr Diterbitkan: 2026-05-25 Waktu membaca: 10 mnt

Transcoding — proses konversi cyfrowego fileu multimedialnego z jednego formatu kompresi na inny pomelalui pełne decoding i ponowne encoding. W przeciwieństwie do transmuxing (zmiany tylko kontenera), transcoding zmienia codec, bitrate, rozdzielczość i inne parametery skompresowanego stream. Według Apple AVFoundation documentation (2026), transcoding adalah używane do adaptacji treści pod różne urządzenia i warunki jaringan.

Najważniejsze

  • Transcoding — pełne decoding źródłowego stream do nieskompresowanego PCM, a następnie encoding do nowego formatu
  • Transmuxing zmienia tylko kontener bez przekodowywania stream — to nie adalah transcoding
  • Główne przyczyny transcodingia: perubahan codeca, obniżenie bitrateu, perubahan rozdzielczości, adaptasi pod DRM
  • Narzędzia: FFmpeg, AVFoundation (iOS), MediaCodec (Android), AWS Elemental MediaConvert
  • Transcoding w waktu real-time na urządzeniach mobile memerlukan sprzętowego przyspieszenia enkodera

Apa itu transcoding?

Transcoding — proses konversi fileu multimedialnego z jednego formatu kompresi na inny pomelalui pełne decoding źródłowego stream do pośredniego nieskompresowanego formatu PCM, a następnie encoding z barumi parameterami. Jeśli w źródłowym fileu video adalah skompresowane codeciem H.264 z bitratem 10 Mb/s, a na wyjściu potrzebny adalah H.265 z bitratem 3 Mb/s — to adalah transcoding.

Transcoding różni się od zwykłego przepakowywania (transmuxing), przy którym zmienia się tylko kontener (mis. MP4 na MKV), a adalahm skompresowany strumień bitowy pozostaje niezmieniony. Podczas transcodingia zachodzą obliczeniowo kosztowne przekształcenia: decoding każdej klatki, zastosowanie filtrów (scaling, korekcja kolorów, przycinanie), ponowne encoding z barumi parameterami. To sprawia, że transcoding adalah jedną z najbardziej zasobożernych operacji podczas pracy z mediami.

Transcoding znajduje zastosowanie w szerokim spektrum zadań: adaptasi video do ograniczeń przepustowości ci, konversi do formatu ze sprzętowym dukunganm decoding na urządzeniu docelowym, pembuatan wielu wersji untuk streamingu HLS/DASH, wyodrębnianie ścieżek audio do osobnego fileu. Serwisy OTT (Netflix, YouTube, Twitch) transkodują każdy przesłany file do dziesiątek wariantów z różnymi bitratami, rozdzielczościami i codecami, aby zapewnić adaptacyjny streaming milionom użytkowników.

Jak działa transcoding?

Proces transcodingia składa się z trzech głównych etapów: decoding, pemroseadalahn i encoding. 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 diperlukanj wydajności.

Etapy transcodingia

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

Drugi etap — filtracja i pemroseadalahn. Zdekodowane klatki przechodzą melalui łańcuch filtrów: scaling do docelowej rozdzielczości, perubahan częstotliwości klatek, korekcja kolorów, nakładanie tekstu lub grafiki. Łańcuch filtrów FFmpeg adalah 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 framech, untuktego drugi etap adalah najbardziej zasobożerny.

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

cpp
// Skema pipeline transcoding di FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;

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

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

Transcoding vs transmuxing

Różnica między transcodingm a transmuxingą to jeden z najczęstszych punktów nieporozumień w inżynierii mediów. Zrozumienie tej różnicy adalah penting untuk pilihanu właściwej strategii przetwarzania mediów.

ParametrTranscodingTransmultiplekadalahcja
Co się zmieniaKodek, bitrate, rozdzielczośćKontener, metadane
Obciążenie obliczenioweWysokie (decoding + encoding)Minimalne (kopiowanie pakietów)
JakośćMoże się pogorszyć (straty generacji)Bezstratna
Czas wykonaniaMinuty–jamy untuk długiego videoSekundy–menity
ZastosowanieAdaptacja formatu, kompresiZmiana kontenera untuk kompatybilności

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

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

Narzędzia do transcodingia

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

FFmpeg — uniweradalahlne narzędzie

FFmpeg — standard de facto untuk transcodingia na wszystkich platformach. Wiersz poleceń FFmpeg memungkinkan wykonywać praktycznie dowolne przekształcenia: perubahan codeca, perubahan bitratu, przycinanie, łączenie, nakładanie filtrów. Do afileacji mobile FFmpeg integruje się melalui biblioteki libavformat, libavcodec i libavfilter. Przykład typowego polecenia transcodingia: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.

API platformowe

Na iOS transcoding wykonuje się melalui AVAssetWriter i AVAssetReader. AVAssetReader dekoduje file źródłowy, odczytując nieskompresowane klatki, a AVAssetWriter koduje je do docelowego formatu. To podejście automatycznie wykorzystuje sprzętowe enkodery VideoToolbox, co menyediakan maksymalną wydajność. Na Androidzie analogiczna funkcjonalność adalah dostępna melalui 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 transcodingia 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 file wejściowy do dziesiątek wariantów wyjściowych do adaptacyjnego streamingu (HLS, DASH). Dla afileacji mobile transcoding w chmurze adalah optymalnym rozwiązaniem, ponieważ nie obciąża urządzenia użytkownika i memungkinkan przygotowywać treści asynchronicznie.

Przykłady kodu transcodingia

Rozważmy praktyczne przykłady transcodingia na platformach mobile z penggunaanm sprzętowego przyspieszenia i konfiguracją kuncich parameterów jakości.

Transcoding 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("Transcoding selesai")
            case .failed:
                print("Kesalahan: " + assetExportSession.error.localizedDescription)
            default:
                break
            }
        }
    
    // Transcoding manual dengan 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 transcodingia na iOS. AVAssetExportSession — sederhana sposób z predefiniowanymi pengaturanmi jakości (HEVCHighestQuality untuk H.265). Ręczny pipeline melalui 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 adalah ważne untuk modernch treści HDR.

Transcoding 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 membuat pipeline z MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. MediaExtractor określa typ codeca z fileu wejściowego i wybiera odpowiedni dekoder. Enkoder adalah konfigurowany na H.265 (HEVC) z bitratem 4 Mb/s i interwałem klatek kuncich 2 detik, co adalah optymalne do streamingu. Ważne: MediaCodec encoder działa synchronicznie, untuktego do transcodingia w waktu real-time diperlukan adalah zorganizowanie pętli z poprawnym pemroseadalahnm znaczników czasu (PTS) untuk każdej klatki.

Optimaliadalahsi transcoding untuk urządzeń mobile

Transcoding na urządzeniach mobile to tugas memerlukanjące starannej optymalizacji ze względu na ograniczone zasoby CPU, GPU i keterbataadalahn termiczne. Kilka strategii pomaga wykonywać transcoding efektywnie.

Wykorzystanie sprzętowego kodowania

Kluczowym czynnikiem wydajności adalah sprzętowy enkoder. Na iOS VideoToolbox menyediakan sprzętowe encoding 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 transcodingia 10-menitowego video z 30–40 menit (programowo) do 3–5 menit (sprzętowo) na flagowym urządzeniu.

Wybór parameterów jakości

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

Zarządzanie wydzielaniem ciepła

Ciągłe transcoding na urządzeniu mobile powoduje znaczne nagrzewanie. Po 5–7 menitach intensywnego kodowania video 4K temperatura prosesora może osiągnąć 50–55 stopni, po czym włącza się throttling. Rozwiązanie — transcoding z jedami lub obniżenie częstotliwości klatek do 30 FPS. Jeśli afileacja memerlukan masowego transcodingia (mis. editor video), lepiej wykonywać pemroseadalahn partiami po 2–3 menity z jedami na chłodzenie. Dla scenariuszy produkcyjnych secara optimal adalah przenieść transcoding na stronę serwerową i korzystać z usług chmurowych.

Często zadawane pytania

Czym różni się transcoding od kodowania?

Encoding (encoding) — kompresi źródłowych nieskompresowanych danych do docelowego codeca. Transcoding obejmuje zarówno decoding, jak i encoding: najpierw dekoduje istniejący skompresowany strumień, a następnie koduje go ponownie. Zwykłe encoding przyjmuje na wejściu nieskompresowane dane (na przykład z kamery), a transcoding — już skompresowany file.

Jaki codec wybrać do transcodingia na urządzeniach mobile?

Dla maksymalnej kompatybilności — H.264. Dla lepszej kompresi — H.265 (HEVC). Jeśli urządzenie obsługuje sprzętowe encoding H.265 (iPhone 8+, Android z Snapdragon 845+), menyediakan ono dwukrotnie kurangszy rozmiar fileu przy tej adalahmej jakości. Encoding AV1 na urządzeniach mobile adalah wciąż zbyt wolne, bahkan ze sprzętowym przyspieszeniem.

Czym adalah transcoding bezstratne?

Ściśle rzecz biorąc, transcoding bezstratne adalah niemożliwe przy zmianie codeca stratnego. Jeśli oba codeci są stratne, każde kolejne pokolenie transcodingia pogarsza jakość. Transcoding bezstratne adalah możliwe tylko między formatami bezstratnymi (FFV1, H.264 Lossless) lub przy zmianie kontenera bez przekodowywania (transmuxing).

Czy można transkodować video w waktu real-time?

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) transcoding w waktu real-time H.264 do H.265 adalah możliwe z opóźnieniem 1–3 detik. Dla 4K w waktu real-time memerlukanny adalah wydajny SoC Apple A17 Pro, Snapdragon 8 Gen 2 lub nowszy.

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

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

Kesimpulan

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

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga