الترميز التحويلي (Transcoding) هو عملية تحويل ملف وسائط رقمية من تنسيق ضغط إلى آخر مع فك تشفير كامل وإعادة ترميز. على عكس النقل التبديلي (transmuxing) الذي يغير الحاوية فقط، يغير الترميز التحويلي الترميز (codec)، ومعدل البت، والدقة وغيرها من معلمات التدفق المضغوط. وفقًا لوثائق Apple AVFoundation (2026)، يُستخدم الترميز التحويلي لتكييف المحتوى مع مختلف الأجهزة وظروف الشبكة.
النقاط الرئيسية
الترميز التحويلي هو عملية تحويل ملف وسائط من تنسيق ضغط إلى آخر عن طريق فك تشفير التدفق المصدر بالكامل إلى تنسيق PCM وسيط غير مضغوط ثم الترميز بمعلمات جديدة. إذا كان الملف المصدر يستخدم ترميز H.264 بمعدل بت 10 ميجابت/ثانية والمخرجات تحتاج H.265 بمعدل بت 3 ميجابت/ثانية — فهذا هو الترميز التحويلي.
يختلف الترميز التحويلي عن إعادة التغليف البسيطة (النقل التبديلي)، حيث تتغير الحاوية فقط (مثل MP4 إلى MKV) بينما يظل تدفق البت المضغوط دون تغيير. يتضمن الترميز التحويلي عمليات مكلفة حسابيًا: فك تشفير كل إطار، تطبيق المرشحات (تغيير الحجم، تصحيح الألوان، القص)، وإعادة الترميز بمعلمات جديدة. وهذا يجعله أحد أكثر العمليات استهلاكًا للموارد عند العمل مع الوسائط.
يُستخدم الترميز التحويلي في مجموعة واسعة من المهام: تكييف الفيديو مع قيود عرض النطاق الترددي، التحويل إلى تنسيق يدعم فك التشفير بالأجهزة على الجهاز المستهدف، إنشاء إصدارات متعددة لبث HLS/DASH، استخراج المسارات الصوتية في ملف منفصل. خدمات 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 (عامل المعدل الثابت) للجودة الثابتة، معدل البت لـ CBR/VBR، الملف الشخصي والمستوى للتوافق مع الأجهزة المستهدفة.
// مخطط خط أنابيب الترميز التحويلي على 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. التصفية (تغيير الحجم + تغيير معدل الإطارات)
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);
}
يوضح خط الأنابيب أعلاه دورة الترميز التحويلي الكلاسيكية. تقرأ الدالة av_read_frame الحزم المضغوطة من ملف الإدخال، وavcodec_send_packet يفك تشفيرها إلى إطارات، وsws_scale يقوم بتغيير الحجم، وavcodec_send_frame يرمز الإطار المعالج إلى تنسيق الإخراج. تتكرر هذه الدورة المكونة من ثلاث مراحل لكل إطار أو مجموعة إطارات (GOP)، اعتمادًا على إعدادات المشفر.
الفرق بين الترميز التحويلي والنقل التبديلي هو أحد أكثر نقاط الالتباس شيوعًا في هندسة الوسائط. فهم هذا الفرق أمر بالغ الأهمية لاختيار استراتيجية معالجة الوسائط الصحيحة.
| المعلمة | الترميز التحويلي | النقل التبديلي |
|---|---|---|
| ما يتغير | الترميز، معدل البت، الدقة | الحاوية، البيانات الوصفية |
| الحمل الحاسوبي | عالٍ (فك ترميز + ترميز) | أدنى (نسخ الحزم) |
| الجودة | قد تتدهور (فقدان الجيل) | بدون فقدان |
| وقت التنفيذ | دقائق–ساعات للفيديو الطويل | ثوانٍ–دقائق |
| التطبيق | تكييف التنسيق، الضغط | تغيير الحاوية للتوافق |
النقل التبديلي (Transmuxing) هو إعادة تغليف تدفق مضغوط في حاوية مختلفة دون فك ترميز وإعادة ترميز. إذا كان الفيديو مضغوطًا بالفعل بترميز H.265 في حاوية MP4 ويحتاج إلى وضعه في حاوية MOV أو MKV — فإن النقل التبديلي ينسخ حزم البت ببساطة من حاوية إلى أخرى. الجودة لا تتأثر، وقت المعالجة ضئيل حيث لا يتطلب فك تشفير الإطارات. يقوم FFmpeg بالنقل التبديلي باستخدام العلم -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). خط الأنابيب اليدوي عبر AVAssetReader + AVAssetWriter يوفر تحكمًا كاملاً في المعلمات: معدل البت، الملف الشخصي، المستوى. المعلمة AVVideoProfileLevelH265Main1 تقوم بتفعيل ملف 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 بإنشاء خط أنابيب من MediaExtractor — مفكك ترميز MediaCodec — مشفر MediaCodec — MediaMuxer. يحدد MediaExtractor نوع الترميز من ملف الإدخال ويختار مفكك الترميز المقابل. يتم تكوين المشفر لـ H.265 (HEVC) بمعدل بت 4 ميجابت/ثانية وفاصل زمني للإطارات الرئيسية 2 ثانية، وهو الأمثل للبث. مهم: مشفر MediaCodec يعمل بشكل متزامن، لذا للترميز التحويلي في الزمن الحقيقي يجب تنفيذ حلقة مع معالجة صحيحة للطوابع الزمنية (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 إطارًا في الثانية. وضع CRF (عامل المعدل الثابت) في libx265 يسمح بتعيين الجودة مباشرة، حيث 23–28 يوفر جودة بصرية جيدة بحجم ملف معتدل. للمشفرات بالأجهزة، استخدم وضع CBR مع معدل بت مستهدف لأن CRF غير مدعوم في الأجهزة.
الترميز التحويلي المستمر على جهاز محمول يسبب تسخينًا كبيرًا. بعد 5–7 دقائق من الترميز المكثف لفيديو 4K، قد تصل درجة حرارة المعالج إلى 50–55 درجة، وبعدها يتم تفعيل الاختناق الحراري. الحل هو الترميز التحويلي مع فترات توقف أو تقليل معدل الإطارات إلى 30 إطارًا في الثانية. إذا كان التطبيق يتطلب ترميزًا تحويليًا دفعة واحدة (مثل محرر فيديو)، فمن الأفضل المعالجة بدفعات من 2–3 دقائق مع فترات تبريد. لسيناريوهات الإنتاج، من الأفضل نقل الترميز التحويلي إلى جانب الخادم واستخدام الخدمات السحابية.
الأسئلة الشائعة
الترميز (encoding) هو ضغط البيانات الخام غير المضغوطة إلى ترميز مستهدف. الترميز التحويلي يشمل كلاً من فك الترميز والترميز: أولاً يفك تشفير تدفق مضغوط موجود، ثم يرمزه مرة أخرى. الترميز البسيط يأخذ بيانات خام كمدخلات (مثل من الكاميرا)، بينما الترميز التحويلي يأخذ ملفًا مضغوطًا بالفعل.
لأقصى توافق — H.264. لأفضل ضغط — H.265 (HEVC). إذا كان الجهاز يدعم الترميز بالأجهزة H.265 (iPhone 8+، Android مع Snapdragon 845+)، فإنه يوفر نصف حجم الملف بنفس الجودة. ترميز AV1 على الأجهزة المحمولة لا يزال بطيئًا جدًا حتى مع تسريع الأجهزة.
بالمعنى الدقيق، الترميز التحويلي بدون فقدان مستحيل عند التبديل بين ترميزات ذات فقدان. إذا كان كلا الترميزين مع فقدان، كل جيل من الترميز التحويلي يقلل الجودة. الترميز التحويلي بدون فقدان ممكن فقط بين تنسيقات بدون فقدان (FFV1، H.264 Lossless) أو عند تغيير الحاويات دون إعادة ترميز (النقل التبديلي).
نعم، إذا تم استخدام مفكك ترميز ومشفر بالأجهزة، وكانت الدقة المستهدفة لا تتجاوز 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 تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا