روال‌های مطلوب برای هم‌رسانی ویدیو

بسیاری از افراد بااستفاده از دستگاه Android خود ویدیو هم‌رسانی می‌کنند. کیفیت ویدیو دریافتی اغلب به‌دلیل پردازشی که توسط برنامه هم‌رسانی انجام می‌شود، از نسخه اصلی پایین‌تر است. این سند نحوه بهینه‌سازی کیفیت ویدیوهای هم‌رسانی‌شده و برخی از مشکلات رایج پردازش ویدیو را که باید از آن‌ها اجتناب کرد، شرح می‌دهد. برای بهینه‌سازی جهت هم‌رسانی محتوای ویدیویی HDR، استفاده از ماژول Transformer برای تراتبدیل HDR به SDR را در این صفحه ببینید.

مهم‌ترین کاری که باید انجام دهید این است که وضوح ثابتی را حفظ کنید و کیفیت ویدیو را تا حد امکان بالا نگه دارید تا زمانی که برای هم‌رسانی ویدیو آماده می‌شوید.

خط لوله هم‌رسانی

شکل ۱ جریان معمولی را برای هم‌رسانی ویدیو نشان می‌دهد:

کانال ارتباطی هم‌رسانی ویدیو شکل ۱. خط لوله هم‌رسانی ویدیو.

این خط لوله شامل این مراحل است:

  1. ضبط و کدگذاری ویدیو، احتمالاً با افزودن جلوه درطول ضبط. یا اینکه کاربر می‌تواند این مرحله را رد کند و ویدیویی را از فضای ذخیره‌سازی انتخاب کند که قبلاً از برنامه دیگری ضبط شده است.
  2. ویدیو را ویرایش، فیلتر، رتوش، یا به‌نحوی دیگر پردازش کنید.
  3. مقیاس‌بندی یا تغییر اندازه ویدیو برای آماده‌سازی تراتبدیل.
  4. تراتبدیل ویدیو برای هم‌رسانی. فیلتر کردن در مرحله ۲ اغلب به‌عنوان بخشی از این مرحله اعمال می‌شود.

دو مرحله در خط لوله وجود دارد که در آن‌ها فرصت دارید پارامترهایی را تنظیم کنید که کیفیت ویدیو شما را تعیین می‌کنند: کدگذاری درطول ضبط اولیه، و تراتبدیل قبل‌از هم‌رسانی. علاوه‌براین، ممکن است لازم باشد ویدیو را قبل‌از مرحله نهایی تراتبدیل تغییر مقیاس دهید که این نیز می‌تواند بر کیفیت تأثیر بگذارد.

توصیه‌ها

جدول ۱ پنج پارامتر اصلی کیفیت ویدیو را نشان می‌دهد و مشخص می‌کند کدام مراحل می‌توانند از آن‌ها استفاده کنند.

پارامتر ضبط هم‌رسانی
نمایه س س
برطرف کردن مشکل س س
نرخ بیت س س
پارامتر کوانتیزاسیون (QP) (به‌ندرت) س
فریم‌های B از شمال س

جدول ۱. پارامترهای اصلی تعیین‌کننده کیفیت ویدیو

نمایه

برای نتایج بهتر، از نمایه‌های پیشرفته‌تر ارائه‌شده توسط کدک خاص استفاده کنید. برای کدگذاری AVC، نمایه High و سطح ۴ را انتخاب کنید.

وضوح، برش، و مقیاس‌بندی

می‌توانید وضوح اولیه ویدیو ضبط‌شده را در مرحله مقیاس‌بندی قبل‌از تراتبدیل برای هم‌رسانی تغییر دهید، اما مقیاس‌بندی می‌تواند کیفیت ویدیو را کاهش دهد. توصیه می‌کنیم از مقیاس‌بندی اجتناب کنید و وضوحی را برای کدبندی اولیه انتخاب کنید که بتوانید در سراسر خط لوله استفاده کنید. همچنین به‌خاطر داشته باشید که برش دادن بیش‌ازحد باعث می‌شود کیفیت تصویر پایین بیاید، به‌ویژه اگر تصویر برش‌داده‌شده را بزرگ کنید. این دستورالعمل‌ها را دنبال کنید:

  • وضوحی را انتخاب کنید که حداقل به‌اندازه وضوح هم‌رسانی نهایی باشد.
  • وضوح ضبط نباید خیلی بیشتر از وضوح هم‌رسانی باشد، مگراینکه همه مراحل میانی برای پشتیبانی از وضوح بالاتر طراحی شده باشند (مثلاً نرخ بیت بالاتر درطول ضبط اولیه).

    • اگر کدبندی هم‌رسانی وضوح ۷۲۰x۱۲۸۰ تولید می‌کند، وضوح ضبط ۷۲۰x۱۲۸۰ را توصیه می‌کنیم.
    • اگر مراحل میانی بین ضبط و هم‌رسانی شامل برش دادن است، از وضوح ضبط بالاتری مثل ۱۰۸۰×۱۹۲۰ استفاده کنید و نرخ بیت ضبط را افزایش دهید تا پیکسل‌های اضافی را مدیریت کنید.
  • برش بیش‌ازحد باعث می‌شود کیفیت تصویر پایین بیاید، به‌ویژه اگر تصویر برش‌خورده بزرگ‌نمایی شود.

  • از ارتقای کیفیت از وضوح پایین‌تر به وضوح بالاتر خودداری کنید. فراوضوح‌سازی تلاش می‌کند جزئیاتی را ایجاد کند که وجود ندارد. وضوح بالاتر موردنظر را از ابتدا همراه داشته باشید.

  • اگر باید مقیاس را افزایش دهید، پارامترهای کدبندی را تنظیم کنید. برای مثال، اگر وضوح ارتقایافته دو برابر پیکسل داشته باشد، نرخ بیت را دو برابر کنید.

وضوح و نرخ بیت با یکدیگر مرتبط هستند. برای مثال، انتقال ویدیو با وضوح بالا ازطریق خط لوله هم‌رسانی که درنهایت به نرخ بیت پایین تراتبدیل می‌شود، تصویری با کیفیت پایین‌تر نسبت‌به شروع با وضوح پایین‌تر تولید می‌کند. با کاهش نرخ بیت، نقاط تلاقی وجود دارد که در آن‌ها وضوح‌های کوچک‌تر نتایج بهتری ارائه می‌دهند:

نرخ بیت برطرف کردن مشکل
بیشتر از ۵ مگابیت در ثانیه ‫۱۰۸۰×۱۹۲۰
‫۱٫۵ تا ۵+ مگابیت در ثانیه ۷۲۰×۱۲۸۰
‫۱٫۵ مگابیت در ثانیه یا کمتر معادل SD. همین تعداد پیکسل در نسبت ابعادی ۹:۱۶ حدود ۴۱۶x۷۳۶ است

جدول ۲. نرخ بیت درمقابل وضوح

بسیاری از برنامه‌های پرطرفدار ویدیو را با وضوح 720p یا کمتر هم‌رسانی می‌کنند. داده‌ها نشان می‌دهند که وضوح 720p انتخاب مناسبی برای نرخ بیت هدف بین ۱٫۵ تا ۵ مگابیت در ثانیه است.

نرخ بیت

درحال ضبط است

استفاده از نرخ بیت کدبندی بالاتر بیشترین بهبود را در کیفیت ویدیو ایجاد می‌کند. توصیه می‌کنیم نرخ بیتی را انتخاب کنید که با برنامه‌های دوربین بومی مطابقت داشته باشد. برای وضوح ۷۲۰×۱۲۸۰، نرخ بیت ضبط ۱۰ مگابیت در ثانیه را توصیه می‌کنیم.

ازآنجایی‌که کدبندی ضبط در دستگاه انجام می‌شود، می‌توانید از نرخ بیت بالاتری استفاده کنید تا بیشتر تبدیل‌های مرحله هم‌رسانی را با تأثیر منفی کمی جبران کنید. فایل‌های بزرگ‌تر حاصل فقط برای دستکاری درون‌دستگاهی استفاده می‌شوند.

می‌توانید نرخ بیت را در مرحله نهایی تراتبدیل کاهش دهید، همان‌طور که در جدول ۲ نشان داده شده است.

هم‌رسانی

نرخ بیت بیشترین تأثیر را در زمان هم‌رسانی دارد، زیرا مستقیماً با اندازه ویدیویی که بارگذاری می‌شود مرتبط است. بین کیفیت ویدیو، زمان انتقال فایل، و هزینه‌های فضای ذخیره‌سازی ابری موازنه وجود دارد.

انتخاب نمایه کدبندی، قاب‌های B، و مقادیر مرزی QP نیز در این مرحله مهم‌تر از مرحله ضبط است.

توصیه می‌کنیم نرخ بیت بین ۴ تا ۵ مگابیت در ثانیه (برای وضوح ۷۲۰×۱۲۸۰) باشد تا کیفیت بصری خوبی داشته باشید.

پارامتر کوانتیزاسیون (QP)

در Android نسخه ۱۲ و بالاتر، کلیدهای QP استانداردسازی شده‌اند و در MediaFormat API و در کتابخانه رسانه NDK دردسترس هستند. در نسخه‌های قدیمی‌تر Android، دستکاری QP فقط ازطریق توابع چارچوب بااستفاده از کلیدهای مختص فروشنده در پیکربندی MediaFormat دردسترس است.

درحال ضبط است

درطول ضبط ویدیو، به‌جای تنظیمات QP که همیشه دردسترس نیستند، از کنترل نرخ بیت استفاده کنید.

توصیه نمی‌کنیم تنظیمات QP را برای نرخ بیت ضبط ۱۰ مگابیت بر ثانیه (برای ۱۲۸۰×۷۲۰) تغییر دهید. اگر نرخ بیت ضبط به‌طور قابل‌توجهی پایین‌تر باشد، کمتر از ۵ مگابیت بر ثانیه برای ۷۲۰×۱۲۸۰، تنظیم QP روی ۴۰ سازش خوبی بین افزایش کیفیت است بدون اینکه کدک را مجبور کند که اغلب اوقات از نرخ بیت هدف فراتر برود.

هم‌رسانی

توصیه می‌کنیم حداکثر حد QP را ۴۰ قرار دهید، به‌ویژه زمانی که نرخ بیت کمتر از ۴ مگابیت در ثانیه است. اگرچه این کار حداقل کیفیت را برای ویدیوهای کدبندی‌شده تضمین می‌کند، می‌تواند نتیجه‌ای با نرخ بیت بالاتر تولید کند. افزایش نرخ بیت به پیچیدگی ویدیو بستگی دارد. اگرچه ممکن است یک برنامه هم‌رسانی مقداری تفاوت در نرخ بیت ویدیو تولیدشده را تحمل کند، اما ممکن است افزایش بیش‌از حد آستانه خاصی را تحمل نکند.

می‌توانید افزایش نرخ بیت را با بازکدگذاری ویدیو برای هم‌رسانی با حد QP حداکثر کمتر محدودکننده (بالاتر) محدود کنید. این کار به کدک آزادی بیشتری می‌دهد تا کیفیت را فدای حفظ بخش‌های دیگر ویدیو کند. می‌توانید ویدیو را برای هم‌رسانی مجدداً کدبندی کنید زیرا این کار یک عملیات تراتبدیل است؛ شما قبلاً ویدیویی را که قصد هم‌رسانی آن را دارید ضبط کرده‌اید.

نکته منفی این است که تکرار مرحله تراتبدیل با این پارامترهای مختلف، زمان لازم برای هم‌رسانی ویدیو را افزایش می‌دهد. یک راه برای کاهش این تأخیر این است که به ویدیو تراتبدیل‌شده جزئی نگاه کنید تا تصمیم بگیرید که آیا در حد تحمل شما برای اضافه نرخ بیت است یا نه. اگر این‌طور نیست، می‌توانید تراتبدیل را متوقف کنید و دوباره با پارامترهای QP مناسب‌تر امتحان کنید.

قاب‌های B و نمایه‌های کدبندی

فقط در مرحله هم‌رسانی و فقط هنگام اجرای Android 10 یا بالاتر از فریم‌های B استفاده کنید.

برنامه‌ها باید نمایه‌های کدبندی پشتیبانی‌شده را بااستفاده از CodecCapabilities بررسی کنند، زیرا همه دستگاه‌ها از نمایه‌های اصلی یا بالا پشتیبانی نمی‌کنند. از بالاترین نمایه پشتیبانی‌شده توسط کدبند AVC استفاده کنید: High > Main > Baseline. برای ایمن‌ترین نتایج، هنگام استفاده از نمایه پایه، فریم‌های B (KEY_LATENCY یا KEY_MAX_B_FRAMES) را پیکربندی نکنید، زیرا ممکن است برخی کدبندها در پیکربندی ناموفق باشند.

بخش‌های کد زیر فرض می‌کنند که 'MediaFormat format' برای پیکربندی کدبند AVC استفاده خواهد شد

‫Android 10

میانای برنامه‌سازی کاربردی ۲۹ یا بالاتر

از بالاترین نمایه پشتیبانی‌شده استفاده کنید و پارامتر B-frame را روی ۱ تنظیم کنید:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

در این شرایط، KEY_LATENCY را تنظیم نکنید.

‫Android نسخه‌های ۸،‏ ۸.۱، و ۹

میاناهای برنامه‌سازی کاربردی ۲۶، ۲۷، ۲۸

از بالاترین نمایه پشتیبانی‌شده استفاده کنید، اما تولید فریم‌های B را غیرفعال کنید. این کار برخی محدودیت‌ها را در MediaMuxer در این نسخه‌های سیستم برطرف می‌کند

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

مقدار KEY_LATENCY کدک‌ها را از تولید قاب‌های B منع می‌کند، اما همچنان از سایر کارایی‌های کدک بهره می‌برد.

اگر برنامه‌تان از MediaMuxer برای مونتاژ فایل خروجی نهایی استفاده نمی‌کند، می‌توانید با تنظیم مقدار KEY_LATENCY روی ۲ به‌جای ۱، فریم‌های B را فعال کنید. این کار باید به کدک اجازه دهد تا قاب‌های B تولید کند.

Android نسخه ۷.۱ و پایین‌تر

میانای برنامه‌سازی کاربردی ۲۵ و نسخه‌های قدیمی‌تر

برای دریافت ایمن‌ترین نتایج، از نمایه پایه استفاده کنید.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

قبل‌از نسخه ۷، Android AOSP فقط از نمایه پایه پشتیبانی می‌کند. بااین‌حال، احتمالاً سازندگان اصلی محصول نمایه اصلی/بالا را در برخی دستگاه‌ها فعال کرده‌اند، شاید با استفاده از نمایه خاص فروشنده.

اگر برنامه‌تان از MediaMuxer استفاده نمی‌کند، می‌توانید از نمایه اصلی یا بالا استفاده کنید، به‌شرطی که کدک از آن پشتیبانی کند. کلید قالب عمومی برای کنترل تعداد قاب‌های B وجود ندارد.

استفاده از پیمانه Transformer برای تراتبدیل HDR به SDR

از Android 13 (سطح API‏ ۳۳) به بعد، توصیه می‌کنیم از ماژول Transformer Jetpack Media3 برای هم‌رسانی محتوای HDR با برنامه‌ها، سرویس‌ها، و دستگاه‌هایی که از HDR پشتیبانی نمی‌کنند استفاده کنید. ماژول Transformer با نگاشت رنگی جریان ویدیویی HDR ورودی به SDR و ذخیره نتیجه به‌عنوان MP4 کار می‌کند، که امکان پخش موفقیت‌آمیز را بدون ازدست رفتن جزئیات یا روشنایی تصویر فراهم می‌کند.

توجه: در دستگاه‌هایی که نسخه‌های سیستم بین Android 12 (سطح میانای برنامه‌سازی کاربردی ۳۲) تا Android 7.0 (سطح میانای برنامه‌سازی کاربردی ۲۴) را هدف قرار می‌دهند، ماژول Transformer عملکرد متفاوتی دارد. اگر دستگاه از HDR پشتیبانی کند، برنامه‌تان محتوا را بدون نگاشت رنگ پخش می‌کند. اگر دستگاه از HDR پشتیبانی نکند، خطایی نشان می‌دهد که حاکی از عدم پشتیبانی از نگاشت رنگ HDR است.

کد زیر یک Transformer را راه‌اندازی می‌کند که ورودی را به SDR نگاشت رنگ می‌کند و آن را در قالب ورودی (مانند H.264/AVC) دوباره کدبندی می‌کند:

کاتلین

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

جاوا

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

برای امتحان کردن عملکرد نگاشت رنگ، برنامه نمایشی Transformer را ببینید.

همچنین می‌توانید نگاشت رنگ‌مایه را بااستفاده از MediaCodec راه‌اندازی کنید، هرچند پیاده‌سازی آن پیچیده‌تر است. برای اطلاعات بیشتر، به اسناد مرجع MediaCodec مراجعه کنید.