بهترین روش ها برای اشتراک گذاری ویدیو

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

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

خط لوله اشتراک گذاری

شکل 1 یک جریان معمولی برای اشتراک گذاری یک ویدیو را نشان می دهد:

به اشتراک گذاری خط لوله ویدیو شکل 1. خط لوله اشتراک ویدئو.

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

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

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

توصیه ها

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

پارامتر گرفتن به اشتراک بگذارید
نمایه Y Y
قطعنامه Y Y
میزان بیت Y Y
پارامتر کوانتیزاسیون (QP) (به ندرت) Y
قاب های B ن Y

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

نمایه

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

وضوح، برش، و پوسته پوسته شدن

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

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

    • اگر کدگذاری اشتراک‌گذاری رزولوشن 720x1280 ایجاد می‌کند، ما رزولوشن عکسبرداری 720x1280 را توصیه می‌کنیم.
    • اگر مراحل میانی بین عکس برداری و اشتراک گذاری شامل برش است، از وضوح تصویر بالاتری مانند 1080x1920 استفاده کنید و برای مدیریت پیکسل های اضافی، میزان بیت ریت ضبط را افزایش دهید.
  • برش شدید منجر به کیفیت پایین تصویر می شود، به خصوص اگر تصویر برش داده شده ارتقا یافته باشد.

  • از ارتقاء مقیاس از وضوح کمتر به وضوح بالاتر اجتناب کنید. ارتقاء مقیاس سعی می کند جزئیاتی را ایجاد کند که وجود ندارد. وضوح بالاتر مورد نظر را از ابتدا همراه داشته باشید.

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

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

میزان بیت قطعنامه
5+ مگابیت بر ثانیه 1080x1920
1.5 - 5+ مگابیت در ثانیه 720x1280
1.5 مگابیت بر ثانیه یا کمتر معادل SD همان تعداد پیکسل در نسبت تصویر 9:16 حدود 416x736 است.

جدول 2. میزان بیت در مقابل وضوح

بسیاری از برنامه‌های محبوب ویدئو را با وضوح ۷۲۰p یا کمتر به اشتراک می‌گذارند. داده ها نشان می دهد که وضوح 720p انتخاب مناسبی برای اهداف نرخ بیت بین 1.5 تا 5 مگابیت بر ثانیه است.

میزان بیت

در حال ضبط

استفاده از نرخ بیت رمزگذاری بالاتر، بیشترین پیشرفت را در کیفیت ویدیو ایجاد می کند. توصیه می‌کنیم نرخ بیتی را انتخاب کنید که با برنامه‌های دوربین اصلی مطابقت داشته باشد. برای رزولوشن 720x1280، ما نرخ بیت 10 مگابیت بر ثانیه را توصیه می کنیم.

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

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

اشتراک گذاری

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

انتخاب پروفایل رمزگذاری، فریم های B و مقادیر محدود کننده QP نیز در این مرحله از اهمیت بیشتری نسبت به هنگام ضبط برخوردار است.

ما نرخ بیت بین 4-5 مگابیت در ثانیه (برای وضوح 720x1280) را برای اطمینان از کیفیت بصری خوب توصیه می کنیم.

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

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

در حال ضبط

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

ما توصیه نمی کنیم تنظیمات QP را برای نرخ بیت 10 مگابیت بر ثانیه (برای 720x1280) تنظیم کنید. اگر نرخ بیت ضبط به طور قابل توجهی کمتر باشد، زیر 5 مگابیت در ثانیه برای 720x1280، تنظیم QP 40 سازش خوبی بین افزایش کیفیت است بدون اینکه کدک مجبور شود به دفعات زیاد از نرخ بیت هدف عکس بگیرد.

اشتراک گذاری

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

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

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

B-فریم ها و پروفایل های رمزگذاری

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

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

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

اندروید 10

API 29 یا بالاتر

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

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

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

اندروید 8، 8.1 و 9

API های 26، 27، 28

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

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

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

اگر برنامه شما از MediaMuxer برای جمع‌آوری فایل خروجی نهایی استفاده نمی‌کند، می‌توانید B-frames را با تنظیم مقدار KEY_LATENCY به جای 1 روی 2 فعال کنید. این به کدک اجازه می‌دهد تا فریم‌های B تولید کند.

اندروید 7.1 و بالاتر

API 25 و قبل از آن

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

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

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

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

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

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

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

کد زیر یک ترانسفورماتور را تنظیم می کند که تون ورودی را به 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 مراجعه کنید.