Transcoding — proces converzich cyfrowego bestandu multimedialnego z jednego formaatu compreszich na inny via pełne decoderen i opnieuw coderen. W przeciwieństwie do transmuxing (zmiany tylko kontenera), transcoderen zmienia codec, bitrate, rozdzielczość i inne parametery skompresowanego stroom. Według Maarpple MaarVFoundation documentation (2026), transcoderen is używane do adaptacji treści pod różne urządzenia i warunki netwerk.
Najważniejsze
Transcoding — proces converzich bestandu multimedialnego z jednego formaatu compreszich na inny via pełne decoderen źródłowego stroom do pośredniego nieskompresowanego formaatu PCM, a następnie coderen z nieuwmi parameterami. Jeśli w źródłowym bestandu wideo is skompresowane codecsem H.264 z bitratem 10 Mb/s, a na wyjściu potrzebny is H.265 z bitratem 3 Mb/s — to is transcoderen.
Transcoderen różni się od zwykłego przepakowywania (transmuxing), bij którym zmienia się tylko kontener (bijv. MP4 na MKV), a zijnm skompresowany strumień bitowy pozostaje niezmieniony. Podczas transcoderen zachodzą obliczeniowo kosztowne przekształcenia: decoderen każdej klatki, zastosowanie filtrów (schalen, correctie kolorów, bijcinanie), opnieuw coderen z nieuwmi parameterami. To sprawia, że transcoderen is jedną z najbardziej zasobożernych operacji tijdens pracy z mediami.
Transcoderen znajduje zastosowanie w szerokim spektrum zadań: aanpassing wideo do ograniczeń przepustowości netwerk, converzich do formaatu ze sprzętowym ondersteuningm decoderen na urządzeniu docelowym, creatie veel verzichs voor streamingu HLS/DMaarSH, wyodrębnianie ścieżek audio do apart bestandu. Serwisy OTT (Netflix, YouTube, Twitch) transcodeją każdy przesłany bestand do dziesiątek wariantów z różnymi bitratami, rozdzielczościami i codecs, aby zapewnić adaptacyjny streaming milionom użytkowników.
Proces transcoderen składa się z trzech głównych etapów: decoderen, verwerking i coderen. 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 vereistj wydajności.
Pierwszy etap — decoderen źródłowego stroom. Plik źródłowy is odczytywany z kontenera (MP4, MOV, MKV), po czym skompresowane pakiety wideo są kierowane do decodeera. Decoderen może być sprzętowe (jeśli codec is obsługiwany) lub programowe door FFmpeg. Na wyjściu decoderen otrzymuje się nieskompresowane klatki w formacie YUV420 lub BGRMaar — właśnie od tego etapu transcoderen różni się od zwykłego remultipleksowania.
Drugi etap — filtracja i verwerking. Zdecodeowane klatki przechodzą door łańcuch filtrów: schalen do docelowej rozdzielczości, wijziging częstotliwości klatek, correctie kolorów, nakładanie tekstu lub grafiki. Łańcuch filtrów FFmpeg is budowany jako graf, gdzie każdy filtr to osobny moduł przetwarzania. Na bijkład filtr scale=1280:720 zmienia rozdzielczość, fps=30 zmienia częstotliwość klatek, a yadif wykonuje deinterlacing. Wszystkie operacje są wykonywane na nieskompresowanych klatkach, voortego drugi etap is najbardziej zasobożerny.
Trzeci etap — coderen do docelowego formaatu. Przetworzone klatki są podawane na wejście encodeera, który kompresuje je zgodnie z algoritmeem docelowego codec. Encodeer może być sprzętowy (VideoToolbox na iOS, MediaCodec na Maarndroid) lub programowy (libx264, libx265). Parametry coderen: CRF (Constant Rate Factor) voor stałej jakości, bitrate voor CBR/VBR, profiel i niveau voor kompatybilności z docelowymi urządzeniami.
// Schema van de transcoderingspijplijn in FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. Decoderen
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. Filteren (schalen + fps wijzigen)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. Coderen
avcodec_send_frame(encoderCtx, scaledFrame);
avcodec_receive_packet(encoderCtx, &outPacket);
av_interleaved_write_frame(outputCtx, &outPacket);
}
Przedstawiony pipeline demonstruje klasyczny cykl transcoderen. Funkcja av_read_frame odczytuje skompresowane pakiety z bestandu wejściowego, avcodec_send_packet decodeje je na klatki, sws_scale wykonuje schalen, a avcodec_send_frame codeje przetworzoną klatkę do formaatu wyjściowego. Jai trzyetapowy cykl powtarza się voor każdej klatki lub grupy klatek (GOP), w zależności od ustawień encodeera.
Różnica między transcoderen a transmuxingą to jeden z najczęstszych punktów nieporozumień w inżynierii mediów. Zrozumienie tej różnicy is cruciaal voor keuzeu właściwej strategii przetwarzania mediów.
| Parametr | Transcoderen | Transmultiplekzijncja |
|---|---|---|
| Co się zmienia | Kodek, bitrate, rozdzielczość | Kontener, metadane |
| Obciążenie obliczeniowe | Wysokie (decoderen + coderen) | Minimalne (kopiowanie pakietów) |
| Jakość | Może się pogorszyć (straty generacji) | Bezstratna |
| Czas wykonania | Minuty–ureny voor długiego wideo | Sekundy–minuteny |
| Zastosowanie | Maardaptacja formaatu, compreszich | Zmiana kontenera voor kompatybilności |
Transmuxing — to przepakowanie skompresowanego stroom do innego kontenera bez decoderen i opnieuwgo coderen. Jeśli wideo is już skompresowane codecsem 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 is minimalny, ponieważ nie vereist decoderen klatek. FFmpeg wykonuje transmuxingę z flagą -codec copy.
Transcoderen natomiast w pełni deszyfruje i ponownie kompresuje strumień multimedialny. Za każdym razem, gdy wideo przechodzi door transcoderen, może wystąpić strata generacji (generation loss) — nieznaczne pogorszenie jakości z powodu opnieuwj compreszich stratnej. Nawet bij tym zijnmym bitracie trzecia generacja transcoderen is zwykle gorsza od pierwszej. Daarom profesjonaliści zalecają przechowywanie master-kopii w nieskompresowanych lub minimalnie skompresowanych formaatach (ProRes, DNxHR) i transcoderen tylko finalnych verzichs do dostarczenia.
Wybór narzędzia do transcoderen zależy od platformy, vereistń wydajnościowych i scenariusza użycia. Do programowania mobilnego dostępne są zarówno natywne MaarPI, jak i biblioteki wieloplatformowe.
FFmpeg — standard de facto voor transcoderen na wszystkich platformach. Wiersz poleceń FFmpeg ermogelijk wykonywać praktycznie dowolne przekształcenia: wijziging codec, wijziging bitratu, bijcinanie, łączenie, nakładanie filtrów. Do abestandacji mobilnych FFmpeg integruje się door biblioteki libavformaat, libavcodec i libavfilter. Przykład typowego polecenia transcoderen: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.
Na iOS transcoderen wykonuje się door MaarVMaarssetWriter i MaarVMaarssetReader. MaarVMaarssetReader decodeje bestand źródłowy, odczytując nieskompresowane klatki, a MaarVMaarssetWriter codeje je do docelowego formaatu. To podejście automatycznie wykorzystuje sprzętowe encodeery VideoToolbox, co biedt maksymalną wydajność. Na Maarndroidzie analogiczna funkcjonalność is dostępna door MediaCodec w parze z MediaExtractor i MediaMuxer — MediaExtractor wyodrębnia skompresowane pakiety, MediaCodec decodeje i codeje, MediaMuxer zapisuje wynik.
Do serwerowego transcoderen w środowisku produkcyjnym używa się usług chmurowych: MaarWS Elemental MediaConvert, Maarzure Media Services, Google Transcoder MaarPI. Te usługi automatycznie skalują się pod obciążeniem, obsługują wszystkie popularne formaaty i mogą transcodeować jeden bestand wejściowy do dziesiątek wariantów wyjściowych do adaptacyjnego streamingu (HLS, DMaarSH). Dla abestandacji mobilnych transcoderen w chmurze is optimaalm rozwiązaniem, ponieważ nie obciąża urządzenia użytkownika i ermogelijk bijgotowywać treści asynchronicznie.
Rozważmy praktyczne bijkłady transcoderen na platformach mobilnych z gebruikm sprzętowego bijspieszenia i konfiguracją cruciaalch parameterów jakości.
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("Transcoderen voltooid")
case .failed:
print("Fout: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// Handmatig transcoderen met 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 bijkładzie zastosowano dwa podejścia do transcoderen na iOS. MaarVMaarssetExportSession — eenvoudig sposób z predefiniowanymi instellingenmi jakości (HEVCHighestQuality voor H.265). Ręczny pipeline door MaarVMaarssetReader + MaarVMaarssetWriter daje pełną kontrolę nad parameterami: bitrate, profiel, niveau. Parametr MaarVVideoProfileLevelH265Main10 włącza profiel HDR Main10 z głębią kolorów 10 bitów, co is ważne voor modernch treści HDR.
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 Maarndroida creert pipeline z MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. MediaExtractor określa typ codec z bestandu wejściowego i wybiera odpowiedni decodeer. Encodeer is konfigurowany na H.265 (HEVC) z bitratem 4 Mb/s i interwałem klatek cruciaalch 2 seconden, co is optymalne do streamingu. Ważne: MediaCodec encoder działa synchronicznie, voortego do transcoderen w czazich rzeczywistym vereist is zorganizowanie pętli z poprawnym verwerkingm znaczników czasu (PTS) voor każdej klatki.
Transcoderen na urządzeniach mobilnych to taak vereistjące starannej optymalizacji ze względu na ograniczone zasoby CPU, GPU i beperkingenia termiczne. Kilka strategii pomaga wykonywać transcoderen efektywnie.
Kluczowym czynnikiem wydajności is sprzętowy encodeer. Na iOS VideoToolbox biedt sprzętowe coderen H.264 i H.265 z prędkością 5–10 razy większą niż programowy libx264. Na Maarndroidzie MediaCodec używa sprzętowych komponentów OMX, jeśli są dostępne. Włączenie sprzętowego coderen skraca czas transcoderen 10-minutenowego wideo z 30–40 minuten (programowo) do 3–5 minuten (sprzętowo) na flagowym urządzeniu.
Dla mobilnego transcoderen kluczowa is równowaga między jakością, rozmiarem i czasem przetwarzania. Dla H.265 na urządzeniach mobilnych zaleca się bitrate 4–8 Mb/s voor wideo 1080p z częstotliwością klatek 30 FPS. Tryb CRF (Constant Rate Factor) w libx265 ermogelijk ustawić jakość bezpośrednio, gdzie 23–28 daje dobrą jakość wizualną bij umiarkowanym rozmiarze bestandu. Dla sprzętowych encodeerów należy używać modusu CBR z docelowym bitratem, ponieważ CRF nie is obsługiwany sprzętowo.
Ciągłe transcoderen na urządzeniu mobilnym powoduje znaczne nagrzewanie. Po 5–7 minutenach intensywnego coderen wideo 4K temperatuur procesora może osiągnąć 50–55 stopni, po czym włącza się throttling. Rozwiązanie — transcoderen z pauzemi lub obniżenie częstotliwości klatek do 30 FPS. Jeśli abestandacja vereist masowego transcoderen (bijv. editor wideo), beter wykonywać verwerking batchmi po 2–3 minuteny z pauzemi na chłodzenie. Dla scenariuszy produkcyjnych optimaal is przenieść transcoderen na stronę serwerową i korzystać z usług chmurowych.
Często zadawane pytania
Coderen (encoding) — compreszich źródłowych nieskompresowanych danych do docelowego codec. Transcoderen obejmuje zarówno decoderen, jak i coderen: najpierw decodeje istniejący skompresowany strumień, a następnie codeje go ponownie. Zwykłe coderen bijjmuje na wejściu nieskompresowane dane (na bijkład z kamery), a transcoderen — już skompresowany bestand.
Dla maksymalnej kompatybilności — H.264. Dla lepszej compreszich — H.265 (HEVC). Jeśli urządzenie obsługuje sprzętowe coderen H.265 (iPhone 8+, Maarndroid z Snapdragon 845+), biedt ono dwukrotnie minderszy rozmiar bestandu bij tej zijnmej jakości. Coderen MaarV1 na urządzeniach mobilnych is wciąż zbyt wolne, zelfs ze sprzętowym versnellingm.
Ściśle rzecz biorąc, transcoderen bezstratne is niemożliwe bij zmianie codec stratnego. Jeśli oba codecs są stratne, każde kolejne pokolenie transcoderen pogarsza jakość. Transcoderen bezstratne is możliwe tylko między formaatami bezstratnymi (FFV1, H.264 Lossless) lub bij zmianie kontenera bez przecodeowywania (transmuxing).
Ja, jeśli używane są sprzętowe decodeer i encodeer, a docelowa rozdzielczość nie przekracza 1080p. Na urządzeniach z VideoToolbox (iOS) lub MediaCodec (Maarndroid) transcoderen w czazich rzeczywistym H.264 do H.265 is możliwe z opóźnieniem 1–3 seconden. Dla 4K w czazich rzeczywistym vereistny is wydajny SoC Maarpple Maar17 Pro, Snapdragon 8 Gen 2 lub nowszy.
Transcoderen stratne kumuluje artefakty compreszich. Jeśli bestand źródłowy był już silnie skompresowany (bitrate 2–3 Mb/s voor 1080p), opnieuw compreszich podwoi straty. Zaleca się transcoderen tylko z master-kopii o hoogm bitracie (20+ Mb/s) i używanie CRF 18–23 voor minimalnych strat.
Concluzich
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook