فك الترميز هو عملية تحويل تدفق الوسائط المضغوط إلى تنسيق غير مضغوط مناسب للإخراج إلى الشاشة ومكبرات الصوت. في الأجهزة المحمولة، يتم فك الترميز إما برمجياً عبر وحدة المعالجة المركزية أو عبر الأجهزة من خلال كتل متخصصة من وحدة معالجة الرسومات ومعالج الإشارات الرقمية. وفقاً لـ MDN Web Docs (2026)، تقوم الترميزات الحديثة بضغط التدفق بمقدار 100–500 مرة، ويقوم فك الترميز باستعادة الجودة الأصلية دون فقدان عند اختيار ملف الضغط الصحيح.
النقاط الرئيسية
فك الترميز هو عملية تحويل البيانات الرقمية المضغوطة مرة أخرى إلى تنسيقها الأصلي غير المضغوط. في سياق الوسائط، يستعيد فك الترميز إطارات الفيديو من تدفق البتات المضغوط الذي تم إنشاؤه بواسطة المشفر. بدون فك الترميز، لا يمكن للمستخدمين رؤية الفيديو أو سماع الصوت، حيث تستخدم جميع تنسيقات الوسائط الحديثة الضغط لتوفير عرض النطاق الترددي ومساحة القرص.
تدفق فيديو نموذجي بتنسيق H.264 بمعدل بت 5 ميجابت/ثانية يشغل مساحة أقل بمقدار 100 مرة من تدفق RGB غير المضغوط بنفس الدقة. خوارزمية فك الترميز يجب أن تستعيد كل إطار إلى دقته وفضائه اللوني الأصليين، متبعةً مواصفات الترميز بترتيب عكسي بالنسبة للتشفير. للقيام بذلك، يعالج مفكك الترميز بيانات داخل الإطار (I-frame) وبيانات بين الإطارات (P-frame وB-frame).
على الأجهزة المحمولة، يمكن أن يتم فك الترميز إما على وحدة المعالجة المركزية أو على كتل أجهزة مخصصة. تحتوي أنظمة SoC الحديثة من Apple (سلسلة A) وQualcomm (Snapdragon) وMediaTek (Dimensity) على مفككات ترميز مدمجة لجميع التنسيقات الشائعة. معالج الفيديو يتولى العمل الثقيل لتحويل جيب التمام التجميعي العكسي وتعويض الحركة، مما يحرر وحدة المعالجة المركزية للمهام الأخرى.
تتكون عملية فك الترميز من عدة مراحل متتالية تعكس خطوات التشفير. أولاً، يتم استخراج الرؤوس ومعلمات الضغط من تدفق البتات — الملف الشخصي، المستوى، الدقة، الفضاء اللوني. ثم يقوم مفكك الترميز بمعالجة الكتل الكبيرة المضغوطة بشكل متسلسل، مطبقاً عليها التحويلات العكسية.
المرحلة الأولى — استخراج كود الإنتروبيا. فك ترميز الإنتروبيا يستخدم خوارزميات CABAC أو CAVLC لاستعادة معاملات تحويل جيب التمام التجميعي. لا تعتمد هذه المرحلة على دقة الفيديو — فهي تعالج تدفقاً من البتات، وليس البكسلات، ويتم تحديد تعقيدها بواسطة معدل البت، وليس أبعاد الإطار.
المرحلة الثانية — القياس الكمي العكسي وتحويل جيب التمام التجميعي العكسي. يقوم مفكك الترميز بضرب المعاملات المكممة في خطوة القياس الكمي، مستعيداً قيم معاملات DCT التقريبية، ثم يطبق تحويل DCT العكسي. DCT العكسي يستعيد البيانات المكانية من مجال التردد، مشكلاً كتلة كبيرة من البكسلات. يتم إجراء التحويل بشكل مستقل للكروميني واللوميني.
المرحلة الثالثة — تعويض الحركة. بالنسبة لإطارات P وB، يستخدم مفكك الترميز متجهات حركة مستخرجة من تدفق البتات ويشير إلى إطارات مرجعية تم فك ترميزها سابقاً. تعويض الحركة ينشئ متنبئاً للكتلة الكبيرة الحالية، يُضاف إليها الإشارة المتبقية بعد DCT العكسي. النتيجة هي إطار مستعاد بالكامل وجاهز للإخراج.
// الكود الزائف الأساسي لفك ترميز إطار الفيديو
struct DecodedFrame {
uint8_t* y_plane;
uint8_t* u_plane;
uint8_t* v_plane;
int width, height;
};
class Decoder {
public:
bool decodeNALUnit(const uint8_t* nalUnit, size_t size) {
if (!parseNALUHeader(nalUnit, size))
return false;
int sliceType = parseSliceType(nalUnit);
entropyDecode(nalUnit);
inverseQuantize();
inverseDCT();
if (sliceType != I_SLICE)
motionCompensation();
return true;
}
};
في المثال أعلاه، يظهر الهيكل الأساسي لمفكك ترميز H.264. تستقبل الدالة decodeNALUnit وحدة NAL — الكتلة الأساسية لتدفق H.264 المضغوط. يقوم مفكك الترميز بتحليل الرأس بشكل متسلسل، ويستخرج نوع الشريحة، ويطبق فك ترميز الإنتروبيا، والقياس الكمي العكسي، وDCT العكسي. بالنسبة للشرائح P وB، يتم إجراء تعويض الحركة بشكل إضافي باستخدام إطارات مرجعية من مخزن DPB.
تختلف ترميزات الفيديو الحديثة في خوارزميات الضغط والكفاءة ومتطلبات الموارد الحسابية. اختيار التنسيق يؤثر مباشرة على حجم الملف وجودة الصورة واستهلاك الطاقة أثناء فك الترميز على الجهاز المحمول.
| الترميز | السنة | الضغط | دعم الأجهزة |
|---|---|---|---|
| H.264 | 2003 | 1:100 | جميع أنظمة SoC الحديثة |
| H.265 | 2013 | 1:200 | Apple A8+، Snapdragon 805+ |
| VP9 | 2013 | 1:180 | Snapdragon 820+، Exynos |
| AV1 | 2018 | 1:300 | Apple A17+، Snapdragon 8 Gen 2+ |
H.264 — ترميز الفيديو الأكثر انتشاراً، مدعوم من جميع الأجهزة المحمولة. مزاياه الرئيسية هي العالمية: أي هاتف ذكي Android وiPhone يمكنه فك ترميز H.264 عبر الأجهزة. ومع ذلك، عند نفس معدل البت، يخسر H.264 في الجودة أمام الترميزات الأحدث مثل H.265 وAV1، مما يتطلب زيادة في معدل البت بنسبة 30–50% للحصول على جودة بصرية مماثلة.
H.265 يوفر ضعف الضغط مقارنة بـ H.264 بنفس الجودة. فك ترميز H.265 يتطلب كتلة أجهزة أكثر قوة: VideoToolbox على iOS يدعم H.265 بدءاً من iPhone 6 (A8)، وأجهزة Android بدءاً من Snapdragon 805 فما فوق. عند اختيار H.265 للتطبيق المحمول، يجب مراعاة أن الأجهزة القديمة قد لا تحتوي على دعم أجهزة وستقوم بفك ترميز هذا التنسيق برمجياً، مما يزيد استهلاك الطاقة بشكل حاد.
AV1 — ترميز مفتوح من Alliance for Open Media، يوفر أفضل ضغط بين جميع التنسيقات الحديثة. AV1 أكثر كفاءة بنسبة 30% من H.265 وبنسبة 50% من H.264 بنفس الجودة البصرية. فك ترميز AV1 عبر الأجهزة ظهر فقط في أنظمة SoC من عام 2023+: Apple A17 Pro وQualcomm Snapdragon 8 Gen 2 والأحدث. للأجهزة القديمة، فك ترميز AV1 ممكن فقط برمجياً عبر مكتبة dav1d، مما يخلق حملاً كبيراً على وحدة المعالجة المركزية.
الاختيار بين فك الترميز البرمجي وعبر الأجهزة هو قرار معماري رئيسي عند تطوير مشغل وسائط محمول. لكل نهج مزاياه وقيوده التي يجب مراعاتها عند تصميم التطبيق.
يتم فك الترميز عبر الأجهزة على كتل معالجة فيديو متخصصة تستهلك طاقة أقل بكثير من وحدة المعالجة المركزية عند أداء نفس المهمة. وفقاً لـ Qualcomm، يستهلك مفكك ترميز H.265 عبر الأجهزة طاقة أقل بمقدار 5–10 مرات من فك الترميز البرمجي على وحدة معالجة مركزية Snapdragon 8 Gen 1 عند تشغيل فيديو 4K. هذا أمر بالغ الأهمية للأجهزة المحمولة حيث يؤثر كل ملي واط على عمر البطارية.
فك الترميز البرمجي، من ناحية أخرى، يوفر أقصى مرونة. FFmpeg مع مكتبة libavcodec يدعم العشرات من الترميزات والحاويات، بما في ذلك التنسيقات النادرة والقديمة التي لا تحتوي على دعم أجهزة. يمكن للمطور تعديل خط أنابيب فك الترميز، وإضافة معالجة لاحقة ومرشحات أثناء التشغيل، وهو أمر مستحيل عند استخدام كتل أجهزة مغلقة.
فك الترميز البرمجي مبرر في عدة سيناريوهات: عند تشغيل تنسيقات نادرة (ProRes، DNxHD، Motion JPEG)، عند الحاجة إلى تحكم دقيق في كل مرحلة من مراحل معالجة الإطار، وعند فك ترميز AV1 على أجهزة بدون دعم أجهزة. libavcodec من FFmpeg يمكنه فك ترميز أي تنسيق معروف تقريباً، مما يجعله المعيار الفعلي لمشغلات الوسائط العالمية.
القيود المفروضة على فك الترميز البرمجي هي تبديد الحرارة. يمكن أن يؤدي فك ترميز فيديو 4K المستمر على وحدة المعالجة المركزية إلى تسخين الجهاز إلى 45–50 درجة خلال 10–15 دقيقة، مما يؤدي إلى الخنق الحراري وانخفاض معدل الإطارات. على الأجهزة بدون تبريد نشط (الأجهزة اللوحية، الهواتف)، هذا ملحوظ بشكل خاص. استهلاك طاقة وحدة المعالجة المركزية أثناء فك الترميز البرمجي يمكن أن يصل إلى 3–5 واط مقابل 0,3–0,5 واط أثناء فك الترميز عبر الأجهزة لنفس التدفق.
فك الترميز عبر الأجهزة هو الخيار الافتراضي لأي مشغل وسائط إنتاجي. يوفر 60 إطاراً في الثانية ثابتة لفيديو 4K مع استهلاك طاقة ضئيل. VideoToolbox على iOS وMediaCodec على Android يوفران واجهات برمجة تطبيقات أصلية لفك الترميز عبر الأجهزة التي تختار تلقائياً كتلة المعالجة المثلى اعتماداً على الترميز والدقة.
واجهات برمجة تطبيقات المنصة تدير مخازن الإطارات المؤقتة (تجمع السطح على Android، CVPixelBufferPool على iOS)، والمزامنة مع الشاشة، وتحسين الذاكرة. يحتاج المطور فقط إلى فتح مفكك ترميز بالمعلمات المطلوبة واستقبال الإطارات الجاهزة. فك الترميز عبر الأجهزة يدعم خط أنابيب شامل بزمن انتقال ضئيل: من استقبال تدفق البتات إلى العرض على الشاشة يستغرق 5–15 مللي ثانية مقابل 30–80 مللي ثانية في فك الترميز البرمجي.
دعونا نلقي نظرة على تطبيق عملي لفك الترميز على كلتا المنصتين المحمولتين. على iOS، يتم فك الترميز عبر الأجهزة من خلال VideoToolbox، والبرمجي من خلال FFmpeg. على Android، يتم استخدام MediaCodec لفك الترميز عبر الأجهزة.
@interface VideoDecoder ()
@property (nonatomic) VTDecompressionSessionRef session;
@end
@implementation VideoDecoder
- (void)setupDecoder {
CMVideoFormatDescriptionRef formatDesc;
CMVideoCodecType codecType = kCMVideoCodecType_H264;
OSStatus status = CMVideoFormatDescriptionCreate(
NULL, codecType, 1920, 1080, NULL, &formatDesc
);
VTDecompressionOutputCallbackRecord callback;
callback.decompressionOutputCallback = &decodingCallback;
VTDecompressionSessionCreate(NULL, formatDesc, NULL,
NULL, &callback, &_session);
}
- (void)decodeFrame: (uint8_t*)nalData length:(size_t)size {
CMBlockBufferRef blockBuffer;
CMBlockBufferCreateWithMemoryBlock(NULL, nalData,
size, NULL, NULL, 0, size, 0, &blockBuffer);
CMSampleBufferRef sampleBuffer;
CMSampleBufferCreate(NULL, blockBuffer, true, NULL,
NULL, NULL, 1, 0, NULL, 0, NULL, &sampleBuffer);
VTDecompressionSessionDecodeFrame(_session,
sampleBuffer, 0, NULL, 0);
}
@end
يوضح الكود تهيئة مفكك ترميز H.264 عبر الأجهزة على iOS. VTDecompressionSessionCreate ينشئ جلسة فك ترميز، ويستدعي VTCreate رد اتصال عند ظهور إطار جاهز. تستخدم الجلسة تلقائياً كتلة الأجهزة إذا كانت متاحة للترميز المحدد. للحصول على إطارات مفككة بتنسيق CVPixelBuffer، يتم استخدام رد اتصال يمرر كل إطار جاهز مع تأخير ضئيل.
MediaCodec decoder = MediaCodec.createDecoderByType("video/avc");
MediaFormat format = MediaFormat.createVideoFormat(
"video/avc", 1920, 1080
);
format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
decoder.configure(format, surface, null, 0);
decoder.start();
ByteBuffer[] inputBuffers = decoder.getInputBuffers();
int inputIndex = decoder.dequeueInputBuffer(10000);
if (inputIndex >= 0) {
ByteBuffer buffer = inputBuffers[inputIndex];
buffer.clear();
buffer.put(nalData);
decoder.queueInputBuffer(inputIndex, 0, nalData.length, pts, 0);
}
على Android، يستخدم MediaCodec Surface للإخراج بدلاً من مخزن البكسلات المؤقت، مما يقلل من نسخ البيانات بين وحدة معالجة الرسومات ووحدة المعالجة المركزية. يختار مفكك الترميز تلقائياً كتلة الأجهزة (مكون OMX) بناءً على نوع الترميز. بالنسبة لـ H.264، يتم استخدام OMX.google.h264.decoder، والذي يمكن أن يكون إما عبر الأجهزة أو برمجياً اعتماداً على تنفيذ الشركة المصنعة.
اختيار استراتيجية فك الترميز يعتمد على الجمهور المستهدف للتطبيق والتنسيقات المدعومة ومتطلبات الأداء. غالباً ما يتضمن الحل الأمثل نهجاً هجيناً: فك ترميز عبر الأجهزة للتنسيقات الرئيسية (H.264، H.265) مع خيار برمجي احتياطي للترميزات النادرة.
إذا كان التطبيق موجهاً نحو أقصى توافق — استخدم H.264، الذي يتم فك ترميزه عبر الأجهزة بشكل مضمون على أي جهاز. لخدمات بث الفيديو، H.265 مع دعم الأجهزة على الأجهزة بعد عام 2016 مبرر. AV1 — الخيار للخدمات حيث توفير عرض النطاق الترددي مهم: YouTube، Netflix وغيرها من المنصات الكبيرة تتبنى AV1 بنشاط لتقليل تكاليف CDN مع الحفاظ على الجودة.
معلمة حرجة — حجم المخزن المؤقت لمفكك الترميز. مفككات الترميز عبر الأجهزة لديها مجموعة مخازن مؤقتة ثابتة (عادة 4–16 إطاراً). عند تشغيل تدفق عالي معدل البت، يمكن أن تفيض المخازن المؤقتة، مما يؤدي إلى فقدان الإطارات. MediaCodec يوفر طريقة getOutputFrameRate لتحديد أداء مفكك الترميز الفعلي على جهاز معين، بينما VideoToolbox يسمح بالتحكم في أولوية الوقت الفعلي عبر kVTDecodeFrame_EnableAsynchronousDecompression.
الخنق الحراري — عامل آخر. حتى فك الترميز عبر الأجهزة يمكن أن يسخن الجهاز أثناء التشغيل المطول لفيديو 4K HDR. يوصى بمراقبة درجة الحرارة عبر ProcessInfo على iOS وBatteryManager على Android، مع خفض الجودة أو دقة التدفق عند ارتفاع الحرارة. هذا أمر بالغ الأهمية بشكل خاص للألعاب وتطبيقات البث مع جلسات مشاهدة طويلة.
الأسئلة الشائعة
التشفير يحول البيانات غير المضغوطة إلى تنسيق مضغوط، بينما فك الترميز يستعيد البيانات الأصلية من التدفق المضغوط. هاتان العمليتان عكسيتان وتستخدمان نفس الخوارزميات: DCT، القياس الكمي، تعويض الحركة. المشفر يقوم بالتحويل المباشر، ومفكك الترميز يقوم بالعكسي.
للحصول على أقصى توافق — H.264، حيث يتم فك ترميزه عبر الأجهزة على 100% من الأجهزة الحديثة. للحصول على أفضل ضغط — H.265 أو AV1. يعتمد الاختيار على الجمهور: إذا كان 80% من المستخدمين لديهم أجهزة من 2021+، سيوفر H.265 جودة أفضل بمعدل بت أقل. AV1 مبرر للأجهزة الرائدة مع دعم أجهزة من 2023+.
مفكك الترميز عبر الأجهزة هو شريحة متخصصة (ASIC) مصممة حصرياً لفك الترميز. على عكس وحدة المعالجة المركزية التي تنفذ فك الترميز بتعليمات متسلسلة، تقوم كتلة الأجهزة بمعالجة الكتل الكبيرة بالتوازي. استهلاك الطاقة لمفكك الترميز عبر الأجهزة أقل بمقدار 5–10 مرات لأن الشريحة تعمل بتردد أقل وليس لديها مراحل خط أنابيب غير ضرورية.
الملف الشخصي يحدد مجموعة خوارزميات الضغط التي يستخدمها المشفر: Baseline، Main، High. المستوى يحدد المعلمات القصوى للتدفق: الدقة، معدل البت، حجم المخزن المؤقت. للأجهزة المحمولة، يوصى بالملف الشخصي High والمستوى 4.1–5.2 — هذا كافٍ لفيديو 1080p–4K مع فك ترميز عبر الأجهزة.
على Android، استخدم MediaCodecList للحصول على قائمة بالترميزات المتاحة والتحقق من أيها عبر الأجهزة. على iOS، تحقق من الدعم عبر CMVideoFormatDescription مع الترميز المحدد — إذا نجح VTDecompressionSessionCreate، فإن الترميز مدعوم. بالنسبة لـ AV1 على Android، تحقق من وجود الترميز OMX.google.aomc.decoder أو نسخته عبر الأجهزة.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا