Transcoding — فرآیند تبدیل یک فایل رسانه دیجیتال از یک فرمت فشردهسازی به فرمت دیگر با رمزگشایی کامل و رمزگذاری مجدد است. برخلاف ترنسمالتیپلکسینگ (تغییر فقط کانتینر)، ترنسکدینگ کدک، نرخ بیت، رزولوشن و سایر پارامترهای جریان فشرده را تغییر میدهد. به گفته Apple AVFoundation documentation (2026)، ترنسکدینگ برای تطبیق محتوا با دستگاهها و شرایط شبکه مختلف استفاده میشود.
نکات اصلی
Transcoding — فرآیند تبدیل یک فایل رسانه از یک فرمت فشردهسازی به فرمت دیگر با رمزگشایی کامل جریان مبدأ به فرمت میانی PCM فشردهنشده و سپس رمزگذاری با پارامترهای جدید. اگر در فایل مبدأ ویدیو با کدک H.264 و نرخ بیت 10 مگابیت بر ثانیه فشرده شده باشد و در خروجی به H.265 با نرخ بیت 3 مگابیت بر ثانیه نیاز باشد — این ترنسکدینگ است.
ترنسکدینگ با بستهبندی مجدد ساده (transmuxing) تفاوت دارد که در آن فقط کانتینر تغییر میکند (مثلاً MP4 به MKV) و جریان بیت فشرده بدون تغییر باقی میماند. در ترنسکدینگ تبدیلهای پرهزینه از نظر محاسباتی رخ میدهد: رمزگشایی هر فریم، اعمال فیلترها (مقیاسسازی، تصحیح رنگ، برش)، رمزگذاری مجدد با پارامترهای جدید. این امر ترنسکدینگ را به یکی از پرمصرفترین عملیات هنگام کار با رسانه تبدیل میکند.
ترنسکدینگ در طیف وسیعی از وظایف استفاده میشود: تطبیق ویدیو با محدودیتهای پهنای باند شبکه، تبدیل به فرمت با پشتیبانی سختافزاری رمزگشایی در دستگاه مقصد، ایجاد نسخههای متعدد برای استریمینگ HLS/DASH، استخراج trackهای صوتی به فایل جداگانه. سرویسهای OTT (Netflix، YouTube، Twitch) هر فایل آپلود شده را به دهها نوع با نرخ بیتها، رزولوشنها و کدکهای مختلف برای ارائه استریمینگ تطبیقی به میلیونها کاربر ترنسکد میکنند.
فرآیند ترنسکدینگ از سه مرحله اصلی تشکیل شده است: رمزگشایی، پردازش و رمزگذاری. هر مرحله بسته به در دسترس بودن و عملکرد مورد نیاز میتواند هم روی CPU و هم روی GPU/بلوکهای سختافزاری انجام شود.
مرحله اول — رمزگشایی جریان مبدأ. فایل مبدأ از کانتینر (MP4، MOV، MKV) خوانده میشود و پس از آن بستههای ویدیویی فشرده به دیکودر ارسال میشوند. رمزگشایی میتواند سختافزاری (در صورت پشتیبانی کدک) یا نرمافزاری از طریق FFmpeg باشد. خروجی رمزگشایی فریمهای فشردهنشده در فرمت YUV420 یا BGRA است — از همین مرحله است که ترنسکدینگ با رمالتیپلکس کردن ساده تفاوت دارد.
مرحله دوم — فیلتراسیون و پردازش. فریمهای رمزگشایی شده از زنجیره فیلترها عبور میکنند: مقیاسسازی به رزولوشن مقصد، تغییر نرخ فریم، تصحیح رنگ، اعمال متن یا گرافیک. زنجیره فیلترهای FFmpeg به صورت یک گراف ساخته میشود که هر فیلتر یک ماژول پردازش جداگانه است. به عنوان مثال، فیلتر scale=1280:720 رزولوشن را تغییر میدهد، fps=30 نرخ فریم را تغییر میدهد و yadif دیاینترلیسینگ انجام میدهد. همه عملیات روی فریمهای فشردهنشده انجام میشود، بنابراین مرحله دوم پرمصرفترین است.
مرحله سوم — رمزگذاری به فرمت مقصد. فریمهای پردازش شده به ورودی انکودر داده میشوند که آنها را بر اساس الگوریتم کدک مقصد فشرده میکند. انکودر میتواند سختافزاری (VideoToolbox در iOS، MediaCodec در Android) یا نرمافزاری (libx264، libx265) باشد. پارامترهای رمزگذاری: CRF (Constant Rate Factor) برای کیفیت ثابت، نرخ بیت برای CBR/VBR، پروفایل و سطح برای سازگاری با دستگاههای مقصد.
// نمودار pipeline ترنسکدینگ در FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. رمزگشایی
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. فیلتر (مقیاسسازی + تغییر fps)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. رمزگذاری
avcodec_send_frame(encoderCtx, scaledFrame);
avcodec_receive_packet(encoderCtx, &outPacket);
av_interleaved_write_frame(outputCtx, &outPacket);
}
pipeline ارائه شده چرخه کلاسیک ترنسکدینگ را نشان میدهد. تابع av_read_frame بستههای فشرده را از فایل ورودی میخواند، avcodec_send_packet آنها را به فریم رمزگشایی میکند، sws_scale مقیاسسازی را انجام میدهد و avcodec_send_frame فریم پردازش شده را به فرمت خروجی رمزگذاری میکند. این چرخه سه مرحلهای برای هر فریم یا گروه فریم (GOP) بسته به تنظیمات انکودر تکرار میشود.
تفاوت بین ترنسکدینگ و ترنسمالتیپلکسینگ یکی از رایجترین نقاط سردرگمی در مهندسی رسانه است. درک این تفاوت برای انتخاب استراتژی صحیح پردازش رسانه حیاتی است.
| پارامتر | ترنسکدینگ | ترنسمالتیپلکسینگ |
|---|---|---|
| چه چیزی تغییر میکند | کدک، نرخ بیت، رزولوشن | کانتینر، متادیتا |
| بار محاسباتی | بالا (رمزگشایی + رمزگذاری) | حداقل (کپی بستهها) |
| کیفیت | ممکن است کاهش یابد (افت نسل) | بدون افت |
| زمان اجرا | دقیقه–ساعت برای ویدیوی طولانی | ثانیه–دقیقه |
| کاربرد | تطبیق فرمت، فشردهسازی | تغییر کانتینر برای سازگاری |
Transmuxing — بستهبندی مجدد جریان فشرده به کانتینر دیگر بدون رمزگشایی و رمزگذاری مجدد. اگر ویدیو قبلاً با کدک H.265 در کانتینر MP4 فشرده شده باشد و باید در کانتینر MOV یا MKV قرار گیرد — ترنسمالتیپلکسینگ به سادگی بستههای بیت را از یک کانتینر به کانتینر دیگر کپی میکند. کیفیت آسیب نمیبیند، زمان پردازش حداقل است زیرا نیازی به رمزگشایی فریمها نیست. FFmpeg ترنسمالتیپلکسینگ را با flag -codec copy انجام میدهد.
ترنسکدینگ اما جریان رسانه را کاملاً رمزگشایی و دوباره فشرده میکند. هر بار که ویدیو از ترنسکدینگ عبور میکند، ممکن است افت نسل (generation loss) رخ دهد — کاهش جزئی کیفیت به دلیل فشردهسازی مجدد با اتلاف. حتی با نرخ بیت یکسان، نسل سوم ترنسکدینگ معمولاً از نسل اول بدتر است. به همین دلیل متخصصان توصیه میکنند نسخههای اصلی را در فرمتهای فشردهنشده یا با حداقل فشردهسازی (ProRes، DNxHR) ذخیره کرده و فقط نسخههای نهایی را برای تحویل ترنسکد کنید.
انتخاب ابزار ترنسکدینگ به پلتفرم، نیازهای عملکرد و سناریوی استفاده بستگی دارد. برای توسعه موبایل هم APIهای بومی و هم کتابخانههای کراس پلتفرم در دسترس هستند.
FFmpeg — استاندارد دوفاکتو برای ترنسکدینگ در تمام پلتفرمهاست. خط فرمان FFmpeg امکان انجام تقریباً هر تبدیلی را فراهم میکند: تغییر کدک، تغییر نرخ بیت، برش، اتصال، اعمال فیلترها. برای برنامههای موبایل، FFmpeg از طریق کتابخانههای libavformat، libavcodec و libavfilter یکپارچه میشود. مثال یک دستور معمول ترنسکدینگ: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.
در iOS ترنسکدینگ از طریق AVAssetWriter و AVAssetReader انجام میشود. AVAssetReader فایل مبدأ را رمزگشایی میکند و فریمهای فشردهنشده را میخواند و AVAssetWriter آنها را به فرمت مقصد رمزگذاری میکند. این رویکرد به طور خودکار از انکودرهای سختافزاری VideoToolbox استفاده میکند که حداکثر عملکرد را تضمین میکند. در Android عملکرد مشابه از طریق MediaCodec به همراه MediaExtractor و MediaMuxer در دسترس است — MediaExtractor بستههای فشرده را استخراج میکند، MediaCodec رمزگشایی و رمزگذاری میکند، MediaMuxer نتیجه را مینویسد.
برای ترنسکدینگ سمت سرور در محیط تولید از سرویسهای ابری استفاده میشود: AWS Elemental MediaConvert، Azure Media Services، Google Transcoder API. این سرویسها به طور خودکار تحت بار مقیاس میشوند، از همه فرمتهای محبوب پشتیبانی میکنند و میتوانند یک فایل ورودی را به دهها نوع خروجی برای استریمینگ تطبیقی (HLS، DASH) ترنسکد کنند. برای برنامههای موبایل، ترنسکدینگ ابری راهحل بهینه است زیرا دستگاه کاربر را بارگذاری نمیکند و امکان آمادهسازی ناهمگام محتوا را فراهم میکند.
بیایید نمونههای عملی ترنسکدینگ در پلتفرمهای موبایل با استفاده از شتابدهی سختافزاری و پیکربندی پارامترهای کلیدی کیفیت را بررسی کنیم.
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("ترنسکدینگ تمام شد")
case .failed:
print("خطا: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// ترنسکدینگ دستی با 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)
}
در این مثال از دو رویکرد برای ترنسکدینگ در iOS استفاده شده است. AVAssetExportSession — روش ساده با تنظیمات از پیش تعیین شده کیفیت (HEVCHighestQuality برای H.265). pipeline دستی از طریق AVAssetReader + AVAssetWriter کنترل کامل بر پارامترها را میدهد: نرخ بیت، پروفایل، سطح. پارامتر AVVideoProfileLevelH265Main10 پروفایل HDR Main10 با عمق رنگ 10 بیت را فعال میکند که برای محتوای مدرن 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()
}
}
کد Android یک pipeline از MediaExtractor — MediaCodec decoder — MediaCodec encoder — MediaMuxer ایجاد میکند. MediaExtractor نوع کدک را از فایل ورودی تشخیص میدهد و دیکودر مناسب را انتخاب میکند. انکودر برای H.265 (HEVC) با نرخ بیت 4 مگابیت بر ثانیه و فاصله فریم کلیدی 2 ثانیه پیکربندی میشود که برای استریمینگ بهینه است. مهم: MediaCodec encoder به صورت همزمان کار میکند، بنابراین برای ترنسکدینگ بلادرنگ لازم است یک حلقه با پردازش صحیح timestamps (PTS) برای هر فریم سازماندهی شود.
ترنسکدینگ در دستگاههای موبایل به دلیل منابع محدود CPU، GPU و محدودیتهای حرارتی وظیفهای است که نیاز به بهینهسازی دقیق دارد. چندین استراتژی به انجام کارآمد ترنسکدینگ کمک میکند.
عامل کلیدی عملکرد — انکودر سختافزاری است. در iOS VideoToolbox رمزگذاری سختافزاری H.264 و H.265 را با سرعتی 5–10 برابر بیشتر از libx264 نرمافزاری فراهم میکند. در Android MediaCodec در صورت وجود از کامپوننتهای سختافزاری OMX استفاده میکند. فعالسازی رمزگذاری سختافزاری زمان ترنسکدینگ یک ویدیوی 10 دقیقهای را از 30–40 دقیقه (نرمافزاری) به 3–5 دقیقه (سختافزاری) در یک دستگاه پرچمدار کاهش میدهد.
برای ترنسکدینگ موبایل تعادل بین کیفیت، اندازه و زمان پردازش حیاتی است. برای H.265 در دستگاههای موبایل نرخ بیت 4–8 مگابیت بر ثانیه برای ویدیوی 1080p با نرخ فریم 30 FPS توصیه میشود. حالت CRF (Constant Rate Factor) در libx265 امکان تنظیم مستقیم کیفیت را میدهد که 23–28 کیفیت بصری خوبی با اندازه فایل متوسط ارائه میدهد. برای انکودرهای سختافزاری از حالت CBR با نرخ بیت هدف استفاده کنید زیرا CRF به صورت سختافزاری پشتیبانی نمیشود.
ترنسکدینگ مداوم در دستگاه موبایل باعث گرمایش قابل توجهی میشود. پس از 5–7 دقیقه رمزگذاری فشرده ویدیوی 4K دمای پردازنده میتواند به 50–55 درجه برسد و پس از آن throttling فعال میشود. راهحل — ترنسکدینگ با مکث یا کاهش نرخ فریم به 30 FPS. اگر برنامه نیاز به ترنسکدینگ انبوه دارد (مثلاً ویرایشگر ویدیو)، بهتر است پردازش را به صورت دستههای 2–3 دقیقهای با فواصل خنکشدن انجام دهید. برای سناریوهای تولید، بهینه است که ترنسکدینگ را به سمت سرور منتقل کرده و از سرویسهای ابری استفاده کنید.
سوالات متداول
رمزگذاری (encoding) — فشردهسازی دادههای فشردهنشده مبدأ به کدک مقصد است. ترنسکدینگ هم رمزگشایی و هم رمزگذاری را شامل میشود: ابتدا جریان فشرده موجود را رمزگشایی میکند، سپس دوباره رمزگذاری میکند. رمزگذاری ساده دادههای فشردهنشده را به عنوان ورودی میگیرد (مثلاً از دوربین)، در حالی که ترنسکدینگ یک فایل از پیش فشرده را میگیرد.
برای حداکثر سازگاری — H.264. برای فشردهسازی بهتر — H.265 (HEVC). اگر دستگاه از رمزگذاری سختافزاری H.265 پشتیبانی میکند (iPhone 8+، Android با Snapdragon 845+)، نصف اندازه فایل را با همان کیفیت ارائه میدهد. رمزگذاری AV1 در دستگاههای موبایل هنوز حتی با شتابدهی سختافزاری بسیار کند است.
به طور دقیق، ترنسکدینگ بدون افت هنگام تغییر کدک اتلافی غیرممکن است. اگر هر دو کدک اتلافی باشند، هر نسل ترنسکدینگ کیفیت را کاهش میدهد. ترنسکدینگ بدون افت فقط بین فرمتهای بدون اتلاف (FFV1، H.264 Lossless) یا هنگام تغییر کانتینر بدون رمزگذاری مجدد (transmuxing) امکانپذیر است.
بله، اگر از دیکودر و انکودر سختافزاری استفاده شود و رزولوشن مقصد از 1080p بیشتر نباشد. در دستگاههای دارای VideoToolbox (iOS) یا MediaCodec (Android) ترنسکدینگ بلادرنگ H.264 به H.265 با تأخیر 1–3 ثانیه امکانپذیر است. برای 4K بلادرنگ به SoC قدرتمند Apple A17 Pro، Snapdragon 8 Gen 2 یا بالاتر نیاز است.
ترنسکدینگ اتلافی آرتیفکتهای فشردهسازی را انباشته میکند. اگر فایل مبدأ قبلاً به شدت فشرده شده بود (نرخ بیت 2–3 مگابیت بر ثانیه برای 1080p)، فشردهسازی مجدد تلفات را دو برابر میکند. توصیه میشود فقط از نسخههای اصلی با نرخ بیت بالا (20+ مگابیت بر ثانیه) ترنسکد کنید و از CRF 18–23 برای حداقل تلفات استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید