أساسيات تطبيق الوسائط

Derek Herman
Derek Herman
Joe Medley
Joe Medley

غالبًا ما يتطلب التعامل مع الوسائط تغيير خصائص ملفات الوسائط، مثل معدل نقل البيانات أو درجة الدقة. قد يكون العثور على طريقة مباشرة للبدء أمرًا مخيفًا جدًا. في هذه الصفحة، ستتعرف على الأدوات المستخدمة وكيفية تثبيتها بسرعة.

في البداية، سنوضّح الاستخدام الأساسي لأداتين شائعتين لإنشاء الوسائط باستخدام سطر الأوامر، وهما: Shaka Packager وFFmpeg، ثم نساعدك على تثبيت الأدوات بسرعة. ما أهمية تغطية تطبيقين؟ على الرغم من أن كلاهما قوي ومفيد في حد ذاته، فإن كل ما يلزم لإعداد الوسائط للويب. أنشأنا أيضًا صفحتَي تحويل الوسائط وتشفير الوسائط اللذين يعرضان العديد من العمليات الأكثر شيوعًا في هذين التطبيقين.

هذه التطبيقات ليست الخيارات الوحيدة المتاحة لمهام معالجة الملفات، لكنها من أكثر التطبيقات شيوعًا وقوة. وتشمل الخيارات الأخرى تطبيقات واجهة المستخدم الرسومية Miro، وHandBrake، وVLC. هناك أيضًا خدمات ترميز أو تحويل ترميز، مثل Zencoder وAmazon Elastic Encoder وGoogle Transcoder API.

شاكا باجر

Shaka Packager هي حزمة SDK مجانية لتغليف الوسائط. إذا كنت تستخدم مشغل وسائط على موقعك، فإن Shaka Packager هو ما ستستخدمه لإعداد الملفات. وتدعم عملية التحويل بروتوكولات بث الفيديو الأكثر شيوعًا: البث الديناميكي التكيُّفي عبر HTTP (DASH) أو البث المباشر عبر بروتوكول HTTP (HLS). Shaka Packager تتوافق مع ميزات الأمان الرئيسية: التشفير المشترك وإدارة الحقوق الرقمية لـ Widevine ويمكنه أيضًا معالجة أحداث البث المباشر والفيديو عند الطلب.

بالرغم من ما ورد في الحزمة، فإن هذه الأداة مفيدة لأكثر من مطوّرين بلغة C++. ويمكنك استخدامها كمكتبة لإنشاء برامج وسائط وكأداة سطر أوامر لإعداد ملفات الوسائط لتشغيلها على الويب. إنها القدرة الأخيرة المفيدة لنا هنا. في الواقع، بالنسبة إلى منشئي وسائط الويب، تُعد Shaka Packager الطريقة الوحيدة لتنفيذ بعض المهام بدون إنفاق أموال على تطبيقات تجارية باهظة الثمن.

فيما يلي النمط الأساسي لأمر Shaka Packager:

packager stream_descriptor [stream_descriptor-2 [stream_descriptor-n]] [flags]

ليس هذا تمامًا ما يظهر لك عند كتابة packager -help. هذا المثال أسهل في التفسير، وهذا يعكس الأمثلة في مستندات Shaka Packager. يُرجى العِلم أنّ النمط يضمّ عناصر stream_descriptor متعددة. وعلى الرغم من أننا لا نعرض هذا الخيار، يمكنك معالجة عمليات بث الفيديو والصوت لملف بشكل منفصل باستخدام أمر واحد.

قارن هذا النمط الأساسي مع استخدام بسيط يعرض خصائص الملف. في المثال، وضعنا الأجزاء المكافئة في مصفوفة.

packager stream_descriptor [stream_descriptor-n] [flags]

packager input=glocken.mp4                       --dump_stream_info

ينتج عن الأمر ما يلي:

File "glocken.mp4":
Found 2 stream(s).
Stream [0] type: Video
 codec_string: avc1.640028
 time_scale: 30000
 duration: 300300 (10.0 seconds)
 is_encrypted: false
 codec: H264
 width: 1920
 height: 1080
 pixel_aspect_ratio: 1:1
 trick_play_factor: 0
 nalu_length_size: 4

Stream [1] type: Audio
 codec_string: mp4a.40.2
 time_scale: 48000
 duration: 481280 (10.0 seconds)
 is_encrypted: false
 codec: AAC
 sample_bits: 16
 num_channels: 2
 sampling_frequency: 48000
 language: eng
 seek_preroll_ns: 20833

ابحث عن الخصائص التي تمت مناقشتها في أساسيات ملفات الوسائط ولاحظ بعض الأشياء. يتناسب الطول والعرض مع الدقة الكاملة بالكامل، ويُعدّ برنامج ترميز الصوت والفيديو من برامج الترميز المفضّلة لأنواع الحاويات، وهو الترميز المتقدّم للصوت وH264 للفيديو. لاحظ أيضًا أن التدفقات يتم تحديدها بالأرقام. وهي مفيدة للعمليات التي تعالج الصوت والفيديو بشكل منفصل.

يُرجى العلم أنّ النتائج أعلاه لا تعرض معدل نقل البيانات. وبالرغم من ما هو مفقود، فإن هذا الإخراج أسهل في القراءة، لذلك نستخدمه كلما استطعنا. عندما نحتاج إلى معلومات لا يستطيع Shaka Packager الحصول عليها، مثل معدل نقل البيانات، نستخدم FFmpeg.

FFmpeg

إنّ FFmpeg هي أيضًا تطبيق مجاني لتسجيل ملفات الوسائط وتحويلها وبثها. إنّ إمكاناته ليست أفضل أو أسوأ من إمكانات Shaka Packager. إنهما مختلفان تمامًا.

يبدو النمط الأساسي لأمر FFmpeg كما يلي:

ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output

وكما هو الحال مع Shaka Packager، يمكن لهذا التطبيق التعامل مع عمليات بث متعددة. ويتم استخدام بعض خياراتها في مواقع متعددة وتعالج إخراج الملف بشكل مختلف حسب مكان وجودها في الأمر. كن على دراية بذلك وأنت تنظر إلى أسئلة FFmpeg على Stack Overflow ومواقع مماثلة.

سنقوم مرة أخرى بمقارنة النمط الأساسي بالمثال لعرض خصائص الملف.

    ffmpeg [GeneralOptions] [InputFileOptions] -i input        [OutputFileOptions] output

    ffmpeg                                     -i glocken.mp4

بالإضافة إلى المعلومات التي طلبناها، تتم أيضًا طباعة رسالة خطأ كما هو موضّح في المثال أدناه. هذا لأن هذا من الناحية الفنية استخدام غير صحيح لـ FFmpeg. ونحن نستخدم هذه المعلومات لأنه يعرض معلومات تهمّنا.

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'glocken.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.17.100
  Duration: 00:01:47.53, start: 0.000000, bitrate: 10715 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080, 10579 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified

تثبيت التطبيقات باستخدام Docker

إذا كنت تنوي تنفيذ أوامرنا وتجربتها، يمكنك إما تثبيت الأدوات المطلوبة يدويًا أو اتّباع المسار السهل واستخدام Docker. نقترح استخدام Docker، لأن هذا سيوفر لك الكثير من الوقت. علاوة على ذلك، قدمنا التعليمات لإعدادك بسرعة.

  1. ابدأ بإنشاء دليل جديد في مكان ما على جهاز الكمبيوتر باسم media-tools. يمكنك استخدام أي اسم تريده، مع العلم أنّ التعليمات التالية تفترض أنك تستخدم media-tools كاسم الدليل.

  2. أنشِئ الدليل docker وmedia داخل media-tools. سيؤدي ذلك إلى الحفاظ على دليل media خارج سياق الإصدار. وهذا أمر مهم لأنّ media هو المكان الذي يتم فيه تخزين الملفات التي نخطّط لإجراء عمليات عليها، وقد يكون بعضها كبيرًا جدًا. سيؤدي وضع Dockerfile مباشرةً في "media-tools" إلى إبطاء عملية إنشاء الصورة إذا أعدت بنائها في أي وقت مضى، وربما لتغيير الإصدارات التي تم تثبيتها.

  3. أنشئ /media-tools/docker/Dockerfile، وأضِف تعليمات الإصدار التالية:

    FROM google/shaka-packager:release-v2.4.3 as packager
    FROM jrottenberg/ffmpeg:4.3.2-alpine38
    COPY --from=packager /usr/bin /usr/bin
    ENTRYPOINT  ["sh"]
    
  4. إنشاء الصورة:

    docker build -t media-tools ./docker
    
  5. شغِّل الصورة كواجهة تفاعلية. في نظام التشغيل Linux:

    docker run -w /media -v ${PWD}/media:/media -it --rm media-tools
    /media #
    

    في نظام التشغيل Windows:

    docker run -w /media -v %cd%/media:/media -it --rm media-tools
    /media #
    

أثناء عرض الصورة، يمكنك التحقّق من الإصدارات الخاصة بكل من FFmpeg وShka Packager للتحقّق من نجاح كل شيء من خلال تشغيل ffmpeg -version وpackager --version. من المفترض أن تبدو النتيجة على النحو التالي:

/media # ffmpeg -version
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 6.4.0 (Alpine 6.4.0)
configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-fontconfig --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxcb --enable-libx265 --enable-libxvid --enable-libx264 --enable-nonfree --enable-openssl --enable-libfdk_aac --enable-postproc --enable-small --enable-version3 --enable-libbluray --enable-libzmq --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-libopenjpeg --enable-libkvazaar --enable-libaom --extra-libs=-lpthread --enable-libsrt --enable-libaribb24 --extra-cflags=-I/opt/ffmpeg/include --extra-ldflags=-L/opt/ffmpeg/lib
libavutil      56. 51.100 / 56. 51.100
libavcodec     58. 91.100 / 58. 91.100
libavformat    58. 45.100 / 58. 45.100
libavdevice    58. 10.100 / 58. 10.100
libavfilter     7. 85.100 /  7. 85.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  7.100 /  5.  7.100
libswresample   3.  7.100 /  3.  7.100
libpostproc    55.  7.100 / 55.  7.100
/media # packager --version
packager version v2.4.3-dd9870075f-release

الآن بعد أن جرّبت استخدام Shaka Packager وFFmpeg، يمكنك مواصلة تعلُّم المفاهيم الأساسية، من خلال الرابط التالي أساسيات بث الوسائط.