بهبود HDR در اینستاگرام برای iOS با Dolby Vision

  • در این مطلب نحوهٔ فعال‌سازی Dolby Vision و محیط مشاهده اطرافی (amve) در برنامه اینستاگرام برای iOS را به‌منظور بهبود تجربهٔ تماشای ویدیو به اشتراک می‌گذاریم.
  • ویدیوهای HDR تولید شده توسط آیفون، متادیتای منحصر به‌فرد Dolby Vision و amve دارند که ما نیازمند پشتیبانی کامل از آن‌ها از ابتدا تا انتها بودیم.
  • اینستاگرام برای iOS هم‌اکنون اولین برنامهٔ متا است که از ویدیوهای Dolby Vision پشتیبانی می‌کند و در آینده حمایت مشابه در سایر برنامه‌های متا گسترش خواهد یافت.

هر کدگذاری ویدیو HDR تولید شده توسط آیفون دو قطعه متادیتای اضافی دارد که به حفظ سازگاری تصویر بین نمایشگرها و شرایط مشاهده مختلف کمک می‌کند:

  • محیط مشاهده اطرافی (amve) که ویژگی‌های محیط نمایش اسمی را برای نمایش محتوای ویدئویی مرتبط فراهم می‌آورد. این اطلاعات به دستگاه نهایی امکان می‌دهد در صورتی که شرایط واقعی مشاهده متفاوت باشد، رندر ویدیو را تنظیم کند.
  • Dolby Vision که رنگ، روشنایی و کنتراست را بهبود می‌بخشد تا ویدیو بهتر با توانایی‌های نمایشگر هماهنگ شود.

در حالی که برنامه‌های اینستاگرام و فیسبوک برای iOS از سال ۲۰۲۲ از ویدیوهای HDR (پوشش دینامیک بالا) پشتیبانی می‌کردند، انتشار اولیهٔ ما از HDR، پشتیبانی از تحویل و پخش Dolby Vision یا amve را نداشت. کدگذاری‌های ما با استفاده از FFmpeg انجام می‌شد که به‌طور سنتی از Dolby Vision و amve پشتیبانی نمی‌کرد. از آنجا که ابزارهای ما این متادیتاها را حذف می‌کردند، تصویر ارائه‌شده دقیقاً مطابق انتظار نبود – این مسأله به‌ویژه در سطوح پایین روشنایی صفحه مشهود بود.

اکنون، پس از دریافت بازخورد از کاربران برنامه‌های iOS ما، با شرکای خود همکاری کردیم تا متادیتای amve و Dolby Vision تولیدی در iOS را از ابتدا تا انتها حفظ کنیم و تجربهٔ مشاهدهٔ HDR در دستگاه‌های iOS را به‌طور چشمگیری ارتقا دهیم.

نحوهٔ پردازش ویدیو در متا

ابتدا ممکن است مفید باشد که پیش‌زمینه‌ای دربارهٔ چرخه‌حیات یک ویدیو در متا ارائه دهیم.

اکثریت ویدیوهای بارگذاری‌شده از طریق برنامه‌های ما از سه مرحلهٔ اصلی عبور می‌کند:

1. پردازش سمت کلاینت

در مرحلهٔ پردازش سمت کلاینت، دستگاه خالق ترکیب خود را به یک فایل ویدئویی واحد با حجم مناسب برای بارگذاری تبدیل می‌کند. برای ویدیوهای HDR تولید شده توسط دستگاه‌های iOS، این به معنای کدگذاری با HEVC و استفاده از پروفایل Main 10 است. در همین مرحله است که متادیتاهای amve و Dolby Vision تولید، به بیت‌استریم کدگذاری اضافه و سپس به سرورهای متا ارسال می‌شوند.

2. پردازش سمت سرور

در مرحلهٔ پردازش سمت سرور، سیستم ترانسکدینگ ما نسخه‌های مختلفی از ویدیو را برای مخاطبان متفاوت تولید می‌کند. چون پخش بر روی انواع دستگاه‌ها با قابلیت‌های متفاوت صورت می‌گیرد، ما باید ویدیو را در قالبی بهینه برای هر دستگاه ارائه دهیم. در بارگذاری‌های HDR، این به معنای تولید یک نسخهٔ SDR برای دستگاه‌هایی است که HDR را پشتیبانی نمی‌کنند، یک نسخهٔ VP9 برای پوشش اکثر پخش‌کننده‌ها، و (برای ویدیوهای پرطرفدار ما) یک نسخهٔ AV1 با بالاترین کیفیت و کم‌ترین حجم فایل.

هر یک از این نسخه‌ها با نرخ بیت متفاوتی (در واقع حجم فایل) تولید می‌شود تا اطمینان حاصل شود که کاربران با شرایط شبکه مختلف بتوانند بدون انتظار طولانی برای دانلود، ویدیو را پخش کنند (معایب این است که نرخ بیت پایین‌تر کیفیت کمتری دارد). تمام کدگذاری‌های مشتق‌شده توسط FFmpeg ساخته می‌شوند که پیش‌تر از پشتیبانی amve و Dolby Vision برخوردار نبود. در همین مرحله بود که متادیتاها حذف می‌شدند.

3. مصرف (پخش) ویدیو

در مرحلهٔ مصرف، دستگاه کاربر نسخه‌ای را که می‌تواند به‌صورت روان (بدون لگ) پخش کند، انتخاب می‌کند، آن را فریم به فریم رمزگشایی می‌کند و هر فریم را بر روی صفحه نمایش می‌ریزد. در زمینهٔ iOS، تمام پخش HDR با استفاده از AVSampleBufferDisplayLayer (AVSBDL) اپل انجام می‌شود. این کلاس متادیتاهای amve و Dolby Vision را به‌همراه هر فریم رمزگشایی‌شده مصرف می‌کند.

چگونه پشتیبانی از amve را اضافه کردیم

در آغاز تلاش برای پشتیبانی از amve در سال ۲۰۲۲، نکته‌ای جالب مشاهده کردیم. زیرا ما بر روی معماری جداگانهٔ مؤلفه‌های سطح پایین به‌جای تنظیمات معمولی AVPlayer کار می‌کردیم، توانستیم کدگذاری کامل ویدیو را بررسی کنیم و متادیتای amve را بین دی‌کودر و AVSBDL مشاهده کنیم. دریافتیم که هر فریم از تمام ویدیوها دقیقاً همان متادیتا را دارد. این ما را قادر ساخت تا یک راه‌حل سریع اعمال کرده و این مقادیر را مستقیماً در مسیر پلیر کدگذاری کنیم.

این وضعیت ایده‌آل نبود. اگرچه به‌نظر می‌رسید مقدار ثابت است، اما هیچ مکانیزمی برای تضمین این‌چیز وجود نداشت. شاید یک آیفون یا نسخهٔ جدید iOS مقادیر متفاوتی تولید کند و سپس ما مقادیر نادرست به‌کار بگیریم. علاوه بر این، amve مفهومی در اندروید ندارد، بنابراین نمایش یک کدگذاری HDR تولیدشده در اندروید بر روی آیفون می‌توانست تصویری نادرست از نظر فنی به‌وجود آورد.

در سال ۲۰۲۴، با جامعه کاربران همکاری کردیم تا پشتیبانی amve را در FFmpeg پیاده‌سازی کنیم. همچنین لاگ‌گیری‌ای افزودیم که نشان داد ادعای دو سالهٔ ما مبنی بر عدم تغییر مقادیر همچنان درست است. اما اگر در آینده مقادیر تغییر کنند، ما به‌درستی برای آن آماده‌ایم.

فعال‌سازی Dolby Vision

Dolby Vision به‌سادگی amve قابل پذیرش نبود.

چالش ۱: مشخصات موجود برای حمل متادیتا در بیت‌استریم HEVC بود. ما HEVC را ارائه نمی‌دادیم.

ویدیوهای HDR تولید شده توسط آیفون از پروفایل Dolby Vision 8.4 استفاده می‌کنند؛ عدد ۸ نشان‌دهندهٔ استفاده از HEVC (کدک ویدئویی) و .۴ به معنای سازگاری با HLG (استاندارد HDR که پخش‌کننده‌های بدون پشتیبانی Dolby Vision می‌توانند از آن استفاده کنند) است.

برای تحویل متادیتای Dolby Vision، نیاز داشتیم تا آن را در قالبی که تحویل می‌دهیم، حمل کنیم. خوشبختانه Dolby پروفایل ۱۰ را برای حمل Dolby Vision درون AV1 ایجاد کرده است. از آنجا که VP9 امکان حمل متادیتای اضافه را ندارد، فعلاً منطق پشتیبانی Dolby Vision برای VP9 وجود ندارد، اما قصد داریم مکانیزم‌های تحویل جایگزین را بررسی کنیم.

با این حال، پروفایل‌های Dolby Vision ۱۰ و ۸ به‌طور کامل توسط ابزارهای پردازش ویدئوی موجود ما، شامل FFmpeg و Shaka packager، پشتیبانی نمی‌شد. بر پایهٔ مشخصات Dolby، با توسعه‌دهندگان FFmpeg همکاری کردیم تا پشتیبانی کامل از پروفایل Dolby Vision ۸ و پروفایل ۱۰ پیاده‌سازی شود. به‌طور ویژه، قابلیت تبدیل HEVC با پروفایل 8.4 به AV1 با پروفایل 10.4 را در FFmpeg با استفاده از رمزگذارهای libaom و libsvtav1 فعال کردیم و اصلاحاتی در سایر بخش‌های زنجیره، شامل دی‌کودر dav1d و Shaka packager، برای پشتیبانی صحیح از متادیتای Dolby Vision اعمال کردیم.

چالش ۲: ادغام Dolby Vision در AVSampleBufferDisplayLayer

هنگامی که AVSBDL را با یک بیت‌استریم رمزگذاری‌شده در قالب پشتیبانی‌شده (مثلاً HEVC از دوربین آیفون) تغذیه می‌کنید، Dolby Vision به‌صورت خودکار کار می‌کند. اما ما با بافرهایی کار می‌کنیم که به‌صورت مستقل رمزگشایی می‌شوند؛ زیرا باید بتوانیم فرمت‌هایی را که اپل به‌صورت پیش‌فرض ارائه نمی‌دهد (مانند AV1 در دستگاه‌های پیش از iPhone 15 Pro) پردازش کنیم. بنابراین لازم بود Dolby Vision را به‌صورت جداگانه استخراج کنیم.

پس از ارائهٔ مشخصات جدید برای حمل پروفایل ۱۰ درون بیت‌استریم AV1 توسط Dolby، استخراج دستی متادیتای Dolby Vision را پیاده‌سازی کردیم، آن را به قالبی که AVSBDL انتظار دارد بسته‌بندی کردیم و عملیات موفقیت‌آمیز شد.

برای اثبات این‌که تنظیمات ما به‌درستی کار می‌کند، چند پست اینستاگرام یکسان با و بدون متادیتای Dolby Vision راه‌اندازی کردیم. همکاران ما در Dolby روشنایی هر یک از این پست‌ها را با استفاده از یک تجزیه‌گر رنگ نمایشگر، در سطوح مختلف روشنایی صفحه اندازه‌گیری کردند.

نتیجه به‌دست آمده به‌صورت زیر بود:

تنظیمات روشنایی صفحه نسبت به روشنایی تصویر، با و بدون Dolby Vision.

در این نمودار، محور X نشان‌دهندهٔ تنظیمات روشنایی صفحه و محور Y نشان‌دهندهٔ روشنایی مشاهده‌شده تصویر است. نتایج نشان می‌دهد که در حضور متادیتای Dolby Vision، روشنایی محتوا به‌خوبی با تنظیمات روشنایی صفحه هماهنگ می‌شود.

عملکرد! … اما هنوز کار تمام نشده بود.

آزمون پیاده‌سازی Dolby Vision ما

در متا، پیش از عرضه ویژگی‌های جدید، آزمون‌های A/B انجام می‌دهیم تا از عملکرد مورد انتظار اطمینان حاصل کنیم. چگونه می‌توان متادیتای تعبیه‌شده در بیت‌استریم ویدیو را آزمون کرد؟ پاسخ این است که نسخهٔ دیگری از هر ویدیو شامل متادیتای جدید ساختیم. این نسخهٔ جدید را به جمعیتی به‌صورت تصادفی ارائه دادیم، در حالی که جمعیت کنترل به‌صورت تصادفی به تجربهٔ موجود ادامه داد. با مقیاس بزرگ ما می‌توانیم تضمین کنیم که تقریباً جمعیت یکسانی هر دو نسخهٔ ویدیو را مشاهده می‌کنند.

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

ما فرض می‌کردیم اگر متادیتا مطابق انتظار عمل کند، ویدیوهای دارای متادیتای جدید زمان تماشا بیشتری جذب می‌شوند. اما وقتی آزمون اولیهٔ خود را در اینستاگرام Reels در سال ۲۰۲۴ انجام دادیم، متوجه شدیم که به‌طور متوسط، ویدیوهای دارای متادیتای Dolby Vision کمتر از معادل‌های استانداردشان تماشا می‌شوند.

چگونه این امکان‌پذیر است؟ آیا Dolby Vision نباید تصویر را ارتقا دهد؟

آزمون A/B اولیه ما با متادیتای Dolby Vision

داده‌های ما نشان داد که کاربران کمتر ویدیوهای Dolby Vision را تماشا می‌کردند زیرا زمان بارگذاری این ویدیوها طولانی‌تر بود و کاربران سریعاً به Reel بعدی در فیدشان می‌رفتند.

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

پیشنهاد برای رفع این مشکل، استفاده از قالب فشردهٔ متادیتا بود. تیم Dolby مشخصات دیگری ارائه داد که بار متادیتا را به‌طور متوسط به‌حد ۲۵ kbps (حدود چهار برابر کمتر) کاهش می‌دهد.

آیا این کافی است؟ برای پاسخ به این سؤال، نیاز به آزمون دیگری داشتیم. اما پیش از آن کار دیگری لازم بود.

باید پشتیبانی از فشرده‌سازی (و نیز استخراج) متادیتای Dolby Vision را در FFmpeg با استفاده از فیلتر بیت‌استریم پیاده‌سازی می‌کردیم. همچنین، در حالی که قالب بدون فشرده‌سازی به‌راحتی می‌توانست از بیت‌استریم استخراج و به اپل تحویل داده شود، قالب فشرده توسط اپل به‌طور پیش‌فرض پشتیبانی نمی‌شد؛ بنابراین مجبور شدیم خودمان فرآیند استخراج/دیکامپرشن را در سمت کلاینت پیاده‌سازی کنیم.

پس از حدود ۲٬۰۰۰ سطر کد، آماده شدیم.

آزمون A/B موفق ما

این بار، دریافت کردیم که کاربران مشاهده‌کنندهٔ محتوا با متادیتای Dolby Vision زمان بیشتری را در برنامه می‌گذرانند. ما این را به این دلیل می‌پذیریم که کاربران در محیط‌های کم‌نور و با روشنایی صفحه کمتر، ویدیوهای HDR با متادیتای صحیح را کمتر خسته‌کننده برای چشم می‌دانند.

از آنجایی که افزودن متادیتای Dolby Vision نتایج مثبتی به‌دست داد، توانستیم دلیل قوی برای انتشار آن در تمام اینستاگرام برای iOS ارائه دهیم و این برنامه اولین برنامه‌ای شد که از Dolby Vision بهره‌مند شد. از ژوئن ۲۰۲۵، تمام کدگذاری‌های AV1 استخراج‌شده از HDR تولید شده توسط آیفون شامل متادیتای Dolby Vision هستند.

آیندهٔ Dolby Vision در متا

چالش نهایی در زمینهٔ این پست این است که Dolby Vision در اکوسیستم وب و مرورگرها و نمایشگرهای مختلف به‌صورت گسترده پشتیبانی نمی‌شود. به همین دلیل نمی‌توانیم تفاوت آن را به‌صرفه در این صفحه نشان دهیم و امیدواریم شما خودتان این تجربه را در اینستاگرام روی آیفون ببینید. پشتیبانی از Dolby Vision و amve هم‌اکنون در ترکیب‌های کدگذاری ما موجود است و می‌توانیم آن را برای سکوهای دیگر نیز گسترش دهیم؛ در حال حاضر در حال کار بر روی گسترش پشتیبانی به Facebook Reels هستیم.

در همکاری با Dolby، مشکل قابل‌مشاهدهٔ حفظ متادیتای HDR را حل کردیم و با توسعه‌دهندگان FFmpeg برای پیاده‌سازی این پشتیبانی همکاری کردیم تا به‌سرورهای جامعه در دسترس باشد.

این تنها آغاز است. مشتاقانه منتظر گسترش Dolby Vision به سایر برنامه‌های متا و سیستم‌عامل‌های مرتبط با آن هستیم.

تشکر و قدردانی

مایلیم از هائیکسی شی، تیم Dolby، و نیکلاس هاس از FFmpeg برای زحماتشان در حمایت از این پروژه تشکر کنیم.

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پیمایش به بالا