Transkodirane v mobilnoto razrabotvane — kakvo e, printsip na rabota i stsenarii

Автор: IT Sectr Публикувано: 2026-05-25 Време за четене: 10 мин

Transcoding — protses konvertirane cyfrowego failu multimedialnego z jednego formatu kompresiya na inny poprzez pełne dekodirane i ponowne kodirane. W przeciwieństwie do transmuxing (zmiany tylko kontenera), transkodirane zmienia kodek, bitrate, rozdzielczość i inne parametary skompresowanego potok. Według Apple AVFoundation documentation (2026), transkodirane e używane do adaptacji treści pod różne urządzenia i warunki sieciowe.

Najważniejsze

  • Transcoding — pełne dekodirane źródłowego potok do nieskompresowanego PCM, a następnie kodirane do nowego formatu
  • Transmuxing zmienia tylko kontener bez przekodowywania potok — to nie e transkodirane
  • 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
  • Transkodirane w czasie rzeczywistym na urządzeniach mobilni iziskva sprzętowego przyspieszenia enkodera

Kakvo e transkodirane?

Transcoding — protses konvertirane failu multimedialnego z jednego formatu kompresiya na inny poprzez pełne dekodirane źródłowego potok do pośredniego nieskompresowanego formatu PCM, a następnie kodirane z novmi parametarami. Jeśli w źródłowym failu video e skompresowane kodekiem H.264 z bitratem 10 Mb/s, a na wyjściu potrzebny e H.265 z bitratem 3 Mb/s — to e transkodirane.

Transkodirane 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: dekodirane każdej klatki, zastosowanie filtrów (skalirane, korekcja kolorów, przycinanie), ponowne kodirane z novmi parametarami. To sprawia, że transkodirane e jedną z najbardziej zasobożernych operacji podczas pracy z mediami.

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

Jak działa transkodirane?

Proces transkodowania składa się z trzech głównych etapów: dekodirane, przetwarzanie i kodirane. 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 iziskvanej wydajności.

Etapy transkodowania

Pierwszy etap — dekodirane źródłowego potok. Plik źródłowy e odczytywany z kontenera (MP4, MOV, MKV), po czym skompresowane pakiety video są kierowane do dekodera. Dekodirane może być sprzętowe (jeśli kodek e 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 transkodirane różni się od zwykłego remultipleksowania.

Drugi etap — filtracja i przetwarzanie. Zdekodowane klatki przechodzą przez łańcuch filtrów: skalirane do docelowej rozdzielczości, zmiana częstotliwości klatek, korekcja kolorów, nakładanie tekstu lub grafiki. Łańcuch filtrów FFmpeg e 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 e najbardziej zasobożerny.

Trzeci etap — kodirane 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
// Shema na pipeline za transkodirane v FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;

while (av_read_frame(inputCtx, &packet) >= 0) {
    // 1. Dekodirane
    avcodec_send_packet(decoderCtx, &packet);
    avcodec_receive_frame(decoderCtx, frame);
    
    // 2. Filtirane (skalirane + promyana na fps)
    sws_scale(swsCtx, frame->data, frame->linesize,
              0, frame->height, scaledFrame->data,
              scaledFrame->linesize);
    
    // 3. Kodirane
    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 failu wejściowego, avcodec_send_packet dekoduje je na klatki, sws_scale wykonuje skalirane, 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.

Transkodirane vs transmuxing

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

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

Transmuxing — to przepakowanie skompresowanego potok do innego kontenera bez dekodowania i ponownego kodowania. Jeśli video e 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 e minimalny, ponieważ nie iziskva dekodowania klatek. FFmpeg wykonuje transmultipleksację z flagą -codec copy.

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

Narzędzia do transkodowania

Wybór narzędzia do transkodowania zależy od platformy, iziskvań 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 pozvolqva wykonywać praktycznie dowolne przekształcenia: zmiana kodeka, zmiana bitratu, przycinanie, łączenie, nakładanie filtrów. Do afailacji mobilni 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 transkodirane wykonuje się przez AVAssetWriter i AVAssetReader. AVAssetReader dekoduje fail ź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ść e 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 fail wejściowy do dziesiątek wariantów wyjściowych do adaptacyjnego streamingu (HLS, DASH). Dla afailacji mobilni transkodirane w chmurze e optymalnym rozwiązaniem, ponieważ nie obciąża urządzenia użytkownika i pozvolqva przygotowywać treści asynchronicznie.

Przykłady kodu transkodowania

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

Transkodirane 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("Transkodiraneto zavarsheno")
            case .failed:
                print("Greshka: " + assetExportSession.error.localizedDescription)
            default:
                break
            }
        }
    
    // Rachno transkodirane s 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 parametarami: bitrate, profil, poziom. Parametr AVVideoProfileLevelH265Main10 włącza profil HDR Main10 z głębią kolorów 10 bitów, co e ważne dla nowoczesnych treści HDR.

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

Optymalizacja transkodowania dla urządzeń mobilni

Transkodirane na urządzeniach mobilni to zadanie iziskvające starannej optymalizacji ze względu na ograniczone zasoby CPU, GPU i ograniczenia termiczne. Kilka strategii pomaga wykonywać transkodirane efektywnie.

Wykorzystanie sprzętowego kodowania

Kluczowym czynnikiem wydajności e sprzętowy enkoder. Na iOS VideoToolbox zapewnia sprzętowe kodirane 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-minutiowego video z 30–40 minuti (programowo) do 3–5 minuti (sprzętowo) na flagowym urządzeniu.

Wybór parametarów jakości

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

Zarządzanie wydzielaniem ciepła

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

Często zadawane pytania

Czym różni się transkodirane od kodowania?

Kodirane (encoding) — kompresiya źródłowych nieskompresowanych danych do docelowego kodeka. Transkodirane obejmuje zarówno dekodirane, jak i kodirane: najpierw dekoduje istniejący skompresowany strumień, a następnie koduje go ponownie. Zwykłe kodirane przyjmuje na wejściu nieskompresowane dane (na przykład z kamery), a transkodirane — już skompresowany fail.

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

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

Czym e transkodirane bezstratne?

Ściśle rzecz biorąc, transkodirane bezstratne e niemożliwe przy zmianie kodeka stratnego. Jeśli oba kodeki są stratne, każde kolejne pokolenie transkodowania pogarsza jakość. Transkodirane bezstratne e 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) transkodirane w czasie rzeczywistym H.264 do H.265 e możliwe z opóźnieniem 1–3 sekundi. Dla 4K w czasie rzeczywistym iziskvany e wydajny SoC Apple A17 Pro, Snapdragon 8 Gen 2 lub nowszy.

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

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

Zaklyuchenie

  • Transcoding — pełny cykl dekodowania + kodowania mediów w celu zmiany kodeka, bitratu lub rozdzielczości
  • Transmuxing zmienia tylko kontener bez przekodowywania — to nie e transkodirane
  • Sprzętowe transkodirane na VideoToolbox i MediaCodec e 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 parametary dla mobilnego H.265: bitrate 4–8 Mb/s, profil Main10, GOP 2 sekundiy
  • Do produkcji używaj chmurowych usług transkodowania (AWS Elemental, Azure Media) — nie obciążają urządzenia

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също