Transcoding — proces ozgartirish cyfrowego faylning multimedialnego z jednego formatu siqish na inny poprzez pełne dekodlash i qayta kodlash. W przeciwieństwie do transmulyasiyadan (zmiany tylko kontenera), transkodlash zmienia kodek, bitrate, rozdzielczość i inne parametry skompresowanego oqimini. Według Apple AVFoundation documentation (2026), transkodlash jest używane do adaptacji treści pod różne urządzenia i warunki tarmoq.
Najważniejsze
Transcoding — proces ozgartirish faylning multimedialnego z jednego formatu siqish na inny poprzez pełne dekodlash źródłowego oqimini do pośredniego nieskompresowanego formatu PCM, a następnie kodlash z nowymi parametrami. Jeśli w źródłowym faylning video jest skompresowane kodekiem H.264 z bitrate 10 Mb/s, a na wyjściu potrzebny jest H.265 z bitrate 3 Mb/s — to jest transkodlash.
Transkodlash 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 transkodlashning zachodzą obliczeniowo kosztowne przekształcenia: dekodlash każdej kadr, zastosowanie filtrów (masshtablash, korekcja kolorów, przycinanie), qayta kodlash z nowymi parametrami. To sprawia, że transkodlash jest jedną z najbardziej zasobożernych operacji podczas pracy z mediami.
Transkodlash znajduje zastosowanie w szerokim spektrum zadań: adaptacja video do ograniczeń przepustowości tarmoq, ozgartirish do formatu ze sprzętowym wsparciem dekodlashning na urządzeniu docelowym, tworzenie wielu wersji dla striming HLS/DASH, wyodrębnianie ścieżek audio do osobnego faylning. Serwisy OTT (Netflix, YouTube, Twitch) transkodują każdy przesłany fayl do dziesiątek wariantów z różnymi bitratami, rozdzielczościami i kodeknimi, aby zapewnić adaptacyjny streaming milionom użytkowników.
Proces transkodlashning składa się z trzech głównych etapów: dekodlash, przetwarzanie i kodlash. 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 talab qiladinej wydajności.
Pierwszy etap — dekodlash źródłowego oqimini. Plik źródłowy jest odczytywany z kontenera (MP4, MOV, MKV), po czym skompresowane pakiety video są kierowane do dekodera. Dekodlash może być sprzętowe (jeśli kodek jest obsługiwany) lub programowe przez FFmpeg. Na wyjściu dekodlashning otrzymuje się nieskompresowane kadr w formacie YUV420 lub BGRA — właśnie od tego etapu transkodlash różni się od zwykłego remultipleksowania.
Drugi etap — filtracja i przetwarzanie. Zdekodowane kadr przechodzą przez łańcuch filtrów: masshtablash do docelowej rozdzielczości, zmiana częstotliwości kadrlar, korekcja kolorów, nakładanie tekstu lub grafiki. Łańcuch filtrów FFmpeg jest 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ść kadrlar, a yadif wykonuje deinterlacing. Wszystkie operacje są wykonywane na nieskompresowanych kadrch, dlatego drugi etap jest najbardziej zasobożerny.
Trzeci etap — kodlash do docelowego formatu. Przetworzone kadr są podawane na wejście enkodera, który kompresuje je zgodnie z algorytmem docelowego kodekni. Enkoder może być sprzętowy (VideoToolbox na iOS, MediaCodec na Android) lub programowy (libx264, libx265). Parametry kodlashning: CRF (Constant Rate Factor) dla stałej jakości, bitrate dla CBR/VBR, profil i poziom dla kompatybilności z docelowymi urządzeniami.
// FFmpegda transkodlash pipeline sxemasi
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. Dekodlash
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. Filtr (masshtablash + fps ozgarishi)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. Kodlash
avcodec_send_frame(encoderCtx, scaledFrame);
avcodec_receive_packet(encoderCtx, &outPacket);
av_interleaved_write_frame(outputCtx, &outPacket);
}
Przedstawiony pipeline demonstruje klasyczny cykl transkodlashning. Funkcja av_read_frame odczytuje skompresowane pakiety z faylning wejściowego, avcodec_send_packet dekoduje je na kadr, sws_scale wykonuje masshtablash, a avcodec_send_frame koduje przetworzoną klatkę do formatu wyjściowego. Taki trzyetapowy cykl powtarza się dla każdej kadr lub grupy kadrlar (GOP), w zależności od ustawień enkodera.
Różnica między transkodlash a transmulyasiyą to jeden z najczęstszych punktów nieporozumień w inżynierii mediów. Zrozumienie tej różnicy jest kluczowe dla wyboru właściwej strategii przetwarzania mediów.
| Parametr | Transkodlash | Transmultipleksacja |
|---|---|---|
| Co się zmienia | Kodek, bitrate, rozdzielczość | Kontener, metadane |
| Obciążenie obliczeniowe | Wysokie (dekodlash + kodlash) | Minimalne (kopiowanie pakietów) |
| Jakość | Może się pogorszyć (straty generacji) | Bezstratna |
| Czas wykonania | Minuty–soaty dla długiego video | Sekundy–daqiqay |
| Zastosowanie | Adaptacja formatu, siqisha | Zmiana kontenera dla kompatybilności |
Transmuxing — to przepakowanie skompresowanego oqimini do innego kontenera bez dekodlashning i qaytago kodlashning. Jeśli video jest już skompresowane kodekiem H.265 w kontenerze MP4 i trzeba je umieścić w kontenerze MOV lub MKV — transmulyasiya po prostu kopiuje pakiety bitowe z jednego kontenera do drugiego. Jakość nie ulega pogorszeniu, czas przetwarzania jest minimalny, ponieważ nie talab qiladi dekodlashning kadrlar. FFmpeg wykonuje transmulyasiyę z flagą -codec copy.
Transkodlash natomiast w pełni deszyfruje i ponownie kompresuje strumień multimedialny. Za każdym razem, gdy video przechodzi przez transkodlash, może wystąpić strata generacji (generation loss) — nieznaczne pogorszenie jakości z powodu qaytaj siqish stratnej. Nawet przy tym samym bitracie trzecia generacja transkodlashning jest zwykle gorsza od pierwszej. Dlatego profesjonaliści zalecają przechowywanie master-kopii w nieskompresowanych lub minimalnie skompresowanych formatach (ProRes, DNxHR) i transkodlash tylko finalnych wersji do dostarczenia.
Wybór narzędzia do transkodlashning zależy od platformy, talab qiladiń wydajnościowych i scenariusza użycia. Do programowania mobilnego dostępne są zarówno natywne API, jak i biblioteki wieloplatformowe.
FFmpeg — standard de facto dla transkodlashning na wszystkich platformach. Wiersz poleceń FFmpeg pozwala wykonywać praktycznie dosekin przekształcenia: zmiana kodekni, zmiana bitratu, przycinanie, łączenie, nakładanie filtrów. Do afaylacji mobilnych FFmpeg integruje się przez biblioteki libavformat, libavcodec i libavfilter. Przykład typowego polecenia transkodlashning: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.
Na iOS transkodlash wykonuje się przez AVAssetWriter i AVAssetReader. AVAssetReader dekoduje fayl źródłowy, odczytując nieskompresowane kadr, a AVAssetWriter koduje je do docelowego formatu. To podejście automatycznie wykorzystuje sprzętowe enkodery VideoToolbox, co zapewnia maksymalną wydajność. Na Androidzie analogiczna funkcjonalność jest dostępna przez MediaCodec w parze z MediaExtractor i MediaMuxer — MediaExtractor wyodrębnia skompresowane pakiety, MediaCodec dekoduje i koduje, MediaMuxer zapisuje wynik.
Do serverowego transkodlashning 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 fayl wejściowy do dziesiątek wariantów wyjściowych do adaptacyjnego striming (HLS, DASH). Dla afaylacji mobilnych transkodlash w chmurze jest optymalnym rozwiązaniem, ponieważ nie obciąża urządzenia użytkownika i pozwala przygotowywać treści asynchronicznie.
Rozważmy praktyczne przykłady transkodlashning na platformach mobilnych z wykorzystaniem sprzętowego przyspieszenia i konfiguracją kluczowych parametró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("Transkodlash tugallandi")
case .failed:
print("Xato: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// AVAssetReader + AVAssetWriter bilan qol transkodlash
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 transkodlashning 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 parametrami: bitrate, profil, poziom. Parametr AVVideoProfileLevelH265Main10 włącza profil HDR Main10 z głębią kolorów 10 bitów, co jest ważne dla nowoczesnych 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 Androida tworzy pipeline z MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer. MediaExtractor określa typ kodekni z faylning wejściowego i wybiera odpowiedni dekoder. Enkoder jest konfigurowany na H.265 (HEVC) z bitrate 4 Mb/s i interwałem kadrlar kluczowych 2 sekund, co jest optymalne do striming. Ważne: MediaCodec encoder działa synchronicznie, dlatego do transkodlashning w czasie rzeczywistym talab qiladine jest zorganizowanie pętli z poprawnym przetwarzaniem znaczników czasu (PTS) dla każdej kadr.
Transkodlash na urządzeniach mobilnych to zadanie talab qiladijące starannej optymalizacji ze względu na ograniczone zasoby CPU, GPU i ograniczenia termiczne. Kilka strategii pomaga wykonywać transkodlash efektywnie.
Kluczowym czynnikiem wydajności jest sprzętowy enkoder. Na iOS VideoToolbox zapewnia sprzętowe kodlash 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 kodlashning skraca czas transkodlashning 10-daqiqaowego video z 30–40 daqiqa (programowo) do 3–5 daqiqa (sprzętowo) na flagowym urządzeniu.
Dla mobilnego transkodlashning kluczowa jest równowaga między jakością, rozmiarem i czasem przetwarzania. Dla H.265 na urządzeniach mobilnych zaleca się bitrate 4–8 Mb/s dla video 1080p z częstotliwością kadrlar 30 FPS. Tryb CRF (Constant Rate Factor) w libx265 pozwala ustawić jakość bezpośrednio, gdzie 23–28 daje dobrą jakość wizualną przy umiarkowanym rozmiarze faylning. Dla sprzętowych enkoderów należy używać trybu CBR z docelowym bitrate, ponieważ CRF nie jest obsługiwany sprzętowo.
Ciągłe transkodlash na urządzeniu mobilnym powoduje znaczne nagrzewanie. Po 5–7 daqiqaach intensywnego kodlashning video 4K temperatura procesora może osiągnąć 50–55 stopni, po czym włącza się throttling. Rozwiązanie — transkodlash z przerwami lub obniżenie częstotliwości kadrlar do 30 FPS. Jeśli afaylacja talab qiladi masowego transkodlashning (np. edytor video), lepiej wykonywać przetwarzanie partiami po 2–3 daqiqay z przerwami na chłodzenie. Dla scenariuszy produkcyjnych optymalnie jest przenieść transkodlash na stronę serverową i korzystać z usług chmurowych.
Często zadawane pytania
Kodlash (encoding) — siqisha źródłowych nieskompresowanych danych do docelowego kodekni. Transkodlash obejmuje zarówno dekodlash, jak i kodlash: najpierw dekoduje istniejący skompresowany strumień, a następnie koduje go ponownie. Zwykłe kodlash przyjmuje na wejściu nieskompresowane dane (na przykład z kamery), a transkodlash — już skompresowany fayl.
Dla maksymalnej kompatybilności — H.264. Dla lepszej siqish — H.265 (HEVC). Jeśli urządzenie obsługuje sprzętowe kodlash H.265 (iPhone 8+, Android z Snapdragon 845+), zapewnia ono dwukrotnie mniejszy rozmiar faylning przy tej samej jakości. Kodlash AV1 na urządzeniach mobilnych jest wciąż zbyt sekin, hatto ze sprzętowym tezlashtirish.
Ściśle rzecz biorąc, transkodlash bezstratne jest niemożliwe przy zmianie kodekni stratnego. Jeśli oba kodeki są stratne, każde kolejne pokolenie transkodlashning pogarsza jakość. Transkodlash bezstratne jest możliwe tylko między formatami bezstratnymi (FFV1, H.264 Lossless) lub przy zmianie kontenera bez przekodowywania (transmuxing).
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) transkodlash w czasie rzeczywistym H.264 do H.265 jest możliwe z opóźnieniem 1–3 sekund. Dla 4K w czasie rzeczywistym talab qiladiny jest wydajny SoC Apple A17 Pro, Snapdragon 8 Gen 2 lub nowszy.
Transkodlash stratne kumuluje artefakty siqish. Jeśli fayl źródłowy był już silnie skompresowany (bitrate 2–3 Mb/s dla 1080p), qayta siqisha podwoi straty. Zaleca się transkodlash tylko z master-kopii o wysokim bitracie (20+ Mb/s) i używanie CRF 18–23 dla minimalnych strat.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.