قسمت اول:
چیست؟ کدک ویدیویی یک قطعه نرمافزار/سختافزار است که ویدیوی دیجیتال را فشرده و/یا از حالت فشرده خارج میکند.
برای چه؟ با وجود محدودیتهای خاص، چه از نظر پهنای باند و چه از نظر ...
و از نظر فضای ذخیرهسازی، بازار خواستار ویدیوهای با کیفیت بالاتر است. به یاد دارید که در پست قبلی چگونه حداقل مورد نیاز برای 30 فریم در ثانیه، 24 بیت در هر پیکسل و وضوح 480x240 را محاسبه کردیم؟ ما بدون فشردهسازی به 82,944 مگابیت در ثانیه رسیدیم. فشردهسازی در حال حاضر تنها راه ارائه HD/FullHD/4K به صفحه نمایش تلویزیون و اینترنت است. این امر چگونه محقق میشود؟ حال بیایید به طور خلاصه روشهای اصلی را بررسی کنیم.
ترجمه با پشتیبانی نرم افزار EDISON انجام شده است.درگیر هستیم و .
کدک در مقابل کانتینر
یک اشتباه رایج که مبتدیان مرتکب میشوند، اشتباه گرفتن یک کدک ویدیوی دیجیتال با یک ظرف ویدیوی دیجیتال است. ظرف یک فرمت خاص است، یک پوشش که شامل ابردادههای ویدیویی (و احتمالاً صدا) است. ویدیوی فشرده شده را میتوان به عنوان بار مفید ظرف در نظر گرفت.
معمولاً، پسوند یک فایل ویدیویی نوع کانتینر آن را نشان میدهد. برای مثال، یک فایل video.mp4 احتمالاً یک کانتینر است. MPEG-4 قسمت 14و فایلی با نام video.mkv به احتمال زیاد برای اطمینان کامل از کدک و قالب کانتینر، میتوانید از یا .
کمی از تاریخ
قبل از اینکه به سراغ چگونه؟بیایید نگاهی به تاریخچه بیندازیم تا برخی از کدکهای قدیمیتر را کمی بهتر درک کنیم.
کدک ویدیویی H.261 این استاندارد در سال ۱۹۹۰ (از نظر فنی، در سال ۱۹۸۸) ظاهر شد و برای کار با نرخ انتقال داده ۶۴ کیلوبیت بر ثانیه طراحی شده بود. این استاندارد از ایدههایی مانند نمونهبرداری کروما، ماکروبلاکها و غیره استفاده میکرد. در سال ۱۹۹۵، استاندارد کدک ویدیویی منتشر شد. H.263، که تا سال ۲۰۰۱ توسعه یافت.
نسخه اول در سال ۲۰۰۳ تکمیل شد. H.264 / AVCدر همان سال، TrueMotion کدک ویدیویی رایگان و با اتلاف خود را با نام VP3در سال ۲۰۰۸، گوگل این شرکت را خریداری کرد و ... VP8 در همان سال. در دسامبر ۲۰۱۲، گوگل منتشر کرد VP9و توسط حدود ¾ بازار مرورگرها (از جمله دستگاههای تلفن همراه) پشتیبانی میشود.
AV1 یک کدک ویدیویی رایگان و متنباز جدید است که توسط ... توسعه داده شده است. اتحاد برای رسانههای آزاد (AOMedia) که شامل شرکتهای مشهوری مانند گوگل، موزیلا، مایکروسافت، آمازون، نتفلیکس، AMD، ARM، NVidia، اینتل و سیسکو میشود. اولین نسخه از این کدک، نسخه ۰.۱.۰، در ۷ آوریل ۲۰۱۶ منتشر شد.
تولد AV1
در اوایل سال ۲۰۱۵، گوگل روی ... کار میکرد. VP10، Xiph (که متعلق به موزیلا است) روی آن کار میکرد داالاو سیسکو کدک ویدیویی رایگان خود را با نام ثور.
سپس MPEG LA اولین محدودیتهای سالانه اعلام شده برای HEVC (H.265) و هزینهای ۸ برابر بیشتر از H.264، اما خیلی زود دوباره قوانین را تغییر دادند:
بدون محدودیت سالانه،
هزینه محتوا (0,5٪ از درآمد) و
هزینه واحد تقریباً 10 برابر بیشتر از H.264 است.
اتحاد برای رسانههای آزاد توسط شرکتهایی از حوزههای مختلف ایجاد شده است: تولیدکنندگان تجهیزات (اینتل، AMD، ARM، انویدیا، سیسکو)، ارائهدهندگان محتوا (گوگل، نتفلیکس، آمازون)، سازندگان مرورگر (گوگل، موزیلا) و دیگران.
این شرکتها یک هدف مشترک داشتند: یک کدک ویدیویی بدون حق امتیاز. سپس نوبت به آن رسید. AV1 با یک مجوز ثبت اختراع بسیار سادهتر. تیموتی بی. تریبری ارائه خیرهکنندهای ارائه داد که منشأ مفهوم فعلی AV1 و مدل صدور مجوز آن شد.
تعجب خواهید کرد اگر بدانید که میتوانید کدک AV1 را از طریق یک مرورگر تجزیه و تحلیل کنید (علاقهمندان میتوانند به آدرس).

کدک جهانی
بیایید مکانیسمهای اساسی زیربنایی یک کدک ویدیویی جهانی را بررسی کنیم. بیشتر این مفاهیم مفید هستند و در کدکهای مدرن، مانند VP9, AV1 и HEVCلطفاً توجه داشته باشید که بسیاری از توضیحات سادهسازی خواهند شد. گاهی اوقات از مثالهای دنیای واقعی (مانند مورد H.264) برای نشان دادن فناوریها استفاده خواهد شد.
مرحله 1 - تقسیم تصویر
اولین قدم تقسیم قاب به چندین بخش، زیربخش و غیره است.

چرا؟ دلایل زیادی وجود دارد. وقتی تصویر را تقسیم میکنیم، میتوانیم با استفاده از بخشهای کوچکتر برای قطعات متحرک کوچک، بردار حرکت را با دقت بیشتری پیشبینی کنیم. در حالی که برای یک پسزمینه ثابت، بخشهای بزرگتر میتوانند کافی باشند.
کدکها معمولاً این بخشها را به بخشها (یا قطعات)، ماکروبلوکها (یا بلوکهای درخت کدگذاری) و چندین زیربخش سازماندهی میکنند. حداکثر اندازه این بخشها متفاوت است: HEVC 64x64 را مشخص میکند، در حالی که AVC از 16x16 استفاده میکند و زیربخشها میتوانند به کوچکی 4x4 باشند.
انواع فریمها را از مقاله قبلی به خاطر دارید؟! همین را میتوان برای بلوکها نیز اعمال کرد، بنابراین میتوانیم یک قطعه I، یک بلوک B، یک ماکروبلاک P و غیره داشته باشیم.
برای کسانی که میخواهند تمرین کنند، ببینید که چگونه تصویر به بخشها و زیربخشها تقسیم شده است. برای این کار، میتوانید از تکنیک ذکر شده در مقاله قبلی استفاده کنید. (نسخهای که پولی است، اما نسخه آزمایشی رایگان دارد که محدودیتی در 10 فریم اول دارد). در اینجا بخشهایی که مورد تجزیه و تحلیل قرار گرفتهاند، آمده است. VP9:

مرحله ۲ - پیشبینی
وقتی بخشهایی داشته باشیم، میتوانیم برای آنها پیشبینیهای نجومی انجام دهیم. پیشبینی بین باید ابلاغ شود بردارهای حرکت و باقیمانده، و برای پیشبینی درونمرزی منتقل میشود جهت پیشبینی و بقیه.
مرحله ۳ - تحول
وقتی بلوک باقیمانده (پارتیشن پیشبینیشده → پارتیشن واقعی) را به دست آوردیم، میتوانیم آن را تبدیل کنیم تا مشخص شود کدام پیکسلها را میتوان با حفظ کیفیت کلی حذف کرد. برخی تبدیلها وجود دارند که رفتار دقیق را تضمین میکنند.
اگرچه روشهای دیگری نیز وجود دارد، اما بیایید آنها را با جزئیات بیشتری بررسی کنیم. تبدیل کسینوسی گسسته (DCT - از تبدیل کسینوسی گسسته). وظایف اصلی DCT:
- بلوکهای پیکسل را به بلوکهای با اندازه مساوی از ضرایب فرکانس تبدیل میکند.
- قدرت را فشرده میکند و به از بین بردن افزونگی مکانی کمک میکند.
- برگشت پذیری را فراهم می کند.
در ۲ فوریه ۲۰۱۷، سینترا، آر.جی، و بایر، اف.ام مقالهای در مورد تبدیل DCT-مانند برای فشردهسازی تصویر که تنها به ۱۴ پدینگ نیاز دارد، منتشر کردند.
اگر مزایای هر نکته را متوجه نمیشوید نگران نباشید. حالا بیایید با چند مثال ملموس، ارزش واقعی آنها را ببینیم.
بیایید چنین بلوکی از پیکسلها را با ابعاد ۸x۸ در نظر بگیریم:

این بلوک به تصویر ۸ در ۸ پیکسلی زیر رندر میشود:

ما DCT را روی این بلوک از پیکسلها اعمال میکنیم و بلوکی از ضرایب با اندازه ۸×۸ به دست میآوریم:

و اگر این بلوک از ضرایب را رندر کنیم، تصویر زیر را دریافت میکنیم:

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

در یک تصویر، بیشتر توان در فرکانسهای پایینتر متمرکز شده است، بنابراین با تبدیل تصویر به مؤلفههای فرکانسی آن و حذف ضرایب فرکانس بالاتر، میتوانید مقدار دادههای مورد نیاز برای توصیف تصویر را بدون کاهش زیاد کیفیت تصویر کاهش دهید.
فرکانس به سرعت تغییر یک سیگنال اشاره دارد.
بیایید سعی کنیم دانش به دست آمده در مثال آزمایشی را با تبدیل تصویر اصلی به فرکانس آن (بلوک ضرایب) با استفاده از DCT و سپس حذف برخی از ضرایب کماهمیتتر، به کار ببریم.
ابتدا آن را به حوزه فرکانس تبدیل میکنیم.

در مرحله بعد، بخشی (67%) از ضرایب، عمدتاً بخش پایین سمت راست، را حذف میکنیم.

در نهایت، تصویر را از این بلوک ضرایب کنار گذاشته شده (به یاد داشته باشید، باید معکوسپذیر باشد) بازسازی میکنیم و آن را با تصویر اصلی مقایسه میکنیم.

میبینیم که شبیه تصویر اصلی است، اما تفاوتهای زیادی با تصویر اصلی دارد. ما ۶۷.۱۸۷۵٪ را حذف کردیم و هنوز چیزی شبیه به تصویر اصلی داریم. میتوانستیم ضرایب را با دقت بیشتری حذف کنیم تا تصویری با کیفیت بالاتر به دست آوریم، اما این موضوع بحث دیگری است.
هر ضریب با استفاده از تمام پیکسلها تشکیل میشود
مهم: هر ضریب مستقیماً به یک پیکسل نگاشت نمیشود، بلکه حاصل جمع وزنی تمام پیکسلها است. این نمودار شگفتانگیز نشان میدهد که چگونه ضرایب اول و دوم با استفاده از وزنهای منحصر به فرد برای هر شاخص محاسبه میشوند.
همچنین میتوانید با نگاه کردن به یک شکلگیری تصویر ساده بر اساس DCT، آن را تجسم کنید. برای مثال، در اینجا نمادی از A را مشاهده میکنید که با استفاده از هر وزن ضریب تشکیل شده است:
مرحله 4 - کوانتیزاسیون
پس از حذف برخی ضرایب در مرحله قبل، در مرحله آخر (تبدیل)، نوع خاصی از کوانتیزاسیون را انجام میدهیم. در این مرحله، از دست دادن اطلاعات قابل قبول است. یا به عبارت سادهتر، ضرایب را کوانتیزه میکنیم تا فشردهسازی انجام شود.
چگونه میتوان یک بلوک از ضرایب را کوانتیزه کرد؟ یکی از سادهترین روشها، کوانتیزه کردن یکنواخت است، که در آن بلوک را برمیدارید، آن را بر یک مقدار (بر 10) تقسیم میکنید و مقدار حاصل را گرد میکنید.

آیا میتوانیم این بلوک از ضرایب را معکوس کنیم؟ بله، میتوانیم، با ضرب کردن در همان مقداری که بر آن تقسیم کردهایم.

این رویکرد ایدهآل نیست زیرا اهمیت هر ضریب را در نظر نمیگیرد. میتوان به جای یک مقدار واحد از یک ماتریس کوانتایزر استفاده کرد و این ماتریس میتواند با کوانتیزه کردن بخش عمدهی قسمت پایین سمت راست و بخش کوچکی از قسمت بالا سمت چپ، از ویژگی DCT بهره ببرد.
مرحله ۵ - کدگذاری آنتروپی
وقتی دادهها (بلوکهای تصویر، قطعات، فریمها) را کوانتیزه کردیم، هنوز میتوانیم آنها را بدون اتلاف فشرده کنیم. روشهای الگوریتمی زیادی برای فشردهسازی دادهها وجود دارد. ما به طور خلاصه برخی از آنها را پوشش خواهیم داد. برای درک عمیقتر، میتوانید کتاب "درک فشردهسازی: فشردهسازی دادهها برای توسعهدهندگان مدرن" (").
رمزگذاری ویدیو با استفاده از VLC
فرض کنید یک رشته کاراکتر داریم: a, e, r и tاحتمال (بین ۰ و ۱) اینکه هر نماد چند بار در جریان تکرار میشود، در این جدول ارائه شده است.
| a | e | r | t | |
|---|---|---|---|---|
| احتمال | 0,3 | 0,3 | 0,2 | 0,2 |
میتوانیم کدهای دودویی منحصر به فرد (ترجیحاً کدهای کوچک) را به محتملترینها و کدهای بزرگتر را به کماحتمالترینها اختصاص دهیم.
| a | e | r | t | |
|---|---|---|---|---|
| احتمال | 0,3 | 0,3 | 0,2 | 0,2 |
| کد دودویی | 0 | 10 | 110 | 1110 |
ما جریان داده را فشرده میکنیم، با این فرض که در نهایت برای هر نماد ۸ بیت مصرف خواهیم کرد. بدون فشردهسازی، برای هر نماد ۲۴ بیت لازم است. جایگزینی هر نماد با کد آن، مقداری فضا برای ما صرفهجویی میکند!
مرحله اول، کدگذاری نماد است eکه برابر با 10 است، و نماد دوم ... است. aکه به صورت ریاضی اضافه نمیشود: [10] [0]، و در نهایت کاراکتر سوم tکه باعث میشود جریان بیتی فشردهشده نهایی ما برابر با [10] [0] [1110] یا 1001110که تنها به ۷ بیت نیاز دارد (۳.۴ برابر فضای کمتر از مقدار اصلی).
لطفا توجه داشته باشید که هر کد باید یک کد منحصر به فرد با پیشوند باشد. به شما در یافتن این اعداد کمک خواهد کرد. اگرچه این روش بدون نقص نیست، اما کدکهای ویدیویی وجود دارند که هنوز این روش فشردهسازی الگوریتمی را ارائه میدهند.
هم رمزگذار و هم رمزگشا باید به جدول نمادها با کدهای دودویی خود دسترسی داشته باشند. بنابراین، این جدول نیز باید در دادههای ورودی گنجانده شود.
کدگذاری حسابی
فرض کنید یک رشته کاراکتر داریم: a, e, r, s и tو احتمال آنها در این جدول ارائه شده است.
| a | e | r | s | t | |
|---|---|---|---|---|---|
| احتمال | 0,3 | 0,3 | 0,15 | 0,05 | 0,2 |
با این جدول، محدودههایی شامل تمام نمادهای ممکن را ایجاد خواهیم کرد که بر اساس بزرگترین عدد مرتب شدهاند.

حالا بیایید یک جریان از سه نماد را رمزگذاری کنیم: خوردن.
ابتدا اولین کاراکتر را انتخاب کنید eکه در زیربازه ۰.۳ تا ۰.۶ قرار دارد (شامل نمیشود). ما این زیربازه را در نظر میگیریم و دوباره آن را با همان نسبتهای قبلی، اما برای این محدوده جدید، تقسیم میکنیم.

بیایید به کدنویسی جریان خود ادامه دهیم خوردنحالا نماد دوم را میگیریم. aکه در زیربازه جدید از ۰.۳ تا ۰.۳۹ قرار دارد، و سپس آخرین نماد خود را در نظر میگیریم t و با تکرار دوباره همین فرآیند، آخرین زیرمحدوده را از ۰.۳۵۴ تا ۰.۳۷۲ بدست میآوریم.

ما فقط باید یک عدد را در آخرین زیرمحدوده بین ۰.۳۵۴ و ۰.۳۷۲ انتخاب کنیم. بیایید ۰.۳۶ را انتخاب کنیم (اما هر عدد دیگری در این زیرمحدوده نیز امکانپذیر است). فقط با این عدد میتوانیم جریان اصلی خود را بازسازی کنیم. انگار که داریم خطی را در محدودهها برای رمزگذاری جریان خود رسم میکنیم.

عملیات معکوس (یعنی رمزگشایی) به همین سادگی است: با عدد ۰.۳۶ و محدوده اولیهمان، میتوانیم همان فرآیند را اجرا کنیم. اما اکنون، با استفاده از این عدد، جریانی را که توسط این عدد کدگذاری شده است، شناسایی میکنیم.
با اولین محدوده، متوجه میشویم که عدد ما با برش مطابقت دارد، بنابراین، این اولین نماد ماست. اکنون این زیرمحدوده را دوباره تقسیم میکنیم و همان فرآیند قبلی را دنبال میکنیم. در اینجا میتوانید ببینید که 0,36 با نماد مطابقت دارد aو پس از تکرار این فرآیند به آخرین نماد رسیدیم t (تشکیل جریان کدگذاری شده اصلی ما) خوردن).
هم رمزگذار و هم رمزگشا باید جدولی از احتمالات نمادها داشته باشند، بنابراین باید در دادههای ورودی ارسال شود.
خیلی شیکه، نه؟ هر کسی که این راه حل رو پیدا کرده خیلی باهوش بوده. بعضی از کدکهای ویدیویی از این تکنیک استفاده میکنن (یا حداقل اون رو به عنوان یه گزینه ارائه میدن).
ایده این است که یک جریان بیتی کوانتیزه شده را بدون اتلاف فشرده کنیم. این مقاله احتمالاً جزئیات، دلایل، بده بستانها و غیره زیادی را از قلم انداخته است. اما اگر شما یک توسعهدهنده هستید، باید اطلاعات بیشتری داشته باشید. کدکهای جدید در تلاشند تا از الگوریتمهای کدگذاری آنتروپی متفاوتی استفاده کنند، مانند سال.
مرحله 6 - قالب جریان بیتی
پس از انجام همه این کارها، تنها کاری که باقی میماند، خارج کردن فریمهای فشردهشده در چارچوب مراحل انجامشده است. رمزگشا باید صریحاً از تصمیمات گرفتهشده توسط رمزگذار مطلع شود. رمزگشا باید تمام اطلاعات لازم را در اختیار داشته باشد: عمق بیت، فضای رنگ، وضوح، اطلاعات پیشبینی (بردارهای حرکت، پیشبینی INTER جهتدار)، نمایه، سطح، نرخ فریم، نوع فریم، شماره فریم و موارد دیگر.
نگاهی سطحی به جریان بیت خواهیم داشت H.264اولین قدم ما ایجاد یک جریان بیتی حداقلی H.264 است (FFmpeg به طور پیشفرض تمام گزینههای کدگذاری مانند ... را اضافه میکند) سی نال — کمی بعد متوجه خواهیم شد که آن چیست. میتوانیم این کار را با استفاده از مخزن خودمان و FFmpeg انجام دهیم.
./s/ffmpeg -i /files/i/minimal.png -pix_fmt yuv420p /files/v/minimal_yuv420.h264
این دستور یک جریان بیتی خام تولید میکند. H.264 با تک فریم، وضوح ۶۴×۶۴، با فضای رنگی YUV420در این حالت، تصویر زیر به عنوان قاب استفاده میشود.

جریان بیتی H.264
استاندارد AVC (H.264) تعیین میکند که اطلاعات در قالب ماکروفریمها (به معنای شبکه) ارسال شوند، که به آنها ماکروفریم گفته میشود. NAL (این یک لایه انتزاعی شبکه است). هدف اصلی NAL ارائه یک نمایش ویدیویی "مناسب برای شبکه" است. این استاندارد باید روی تلویزیونها (مبتنی بر جریان) و در اینترنت (مبتنی بر بسته) کار کند.
![]()
یک نشانگر همگامسازی برای تعریف مرزهای عناصر NAL وجود دارد. هر نشانگر همگامسازی حاوی یک مقدار است 0x00 0x00 0x01, به جز مورد اول که برابر است با 0x00 0x00 0x00 0x01. اگر راه اندازی کنیم هگزدامپ برای یک جریان بیتی H.264 تولید شده، حداقل سه الگوی NAL را در ابتدای فایل شناسایی میکنیم.

همانطور که گفته شد، رمزگشا نه تنها باید دادههای تصویر، بلکه ویدئو، فریم، رنگ، پارامترهای استفاده شده و موارد بسیار دیگری را نیز بداند. اولین بایت هر NAL دسته و نوع آن را تعریف میکند.
| شناسه نوع NAL | شرح |
|---|---|
| 0 | نوع ناشناخته |
| 1 | قطعه تصویر رمزگذاری شده بدون IDR |
| 2 | بخش دادههای برش کدگذاریشده A |
| 3 | بخش دادههای برش کدگذاریشده B |
| 4 | بخش دادههای برش کدگذاریشده C |
| 5 | قطعه IDR کدگذاری شده از تصویر IDR |
| 6 | اطلاعات تکمیلی در مورد افزونه SEI |
| 7 | مجموعه پارامترهای توالی SPS |
| 8 | مجموعه پارامترهای تصویر PPS |
| 9 | جداکننده دسترسی |
| 10 | پایان توالی |
| 11 | پایان جریان |
| ... | ... |
معمولاً اولین NAL یک جریان بیتی است. PLCاین نوع NAL مسئول ارتباط متغیرهای کدگذاری رایج مانند پروفایل، سطح، وضوح و غیره است.
اگر از اولین نشانگر همگامسازی صرف نظر کنیم، میتوانیم اولین بایت را رمزگشایی کنیم تا بفهمیم کدام نوع NAL اول است.
برای مثال، اولین بایت پس از نشانگر همگامسازی عبارت است از 01100111، که در آن بیت اول (0) در میدان f استبیت_ممنوعه_صفر. دو بیت بعدی (11) به ما فیلد را میگوید nal_ref_idc، که نشان میدهد آیا این NAL یک فیلد مرجع است یا خیر. و ۵ بیت باقیمانده (00111) به ما فیلد را میگوید نوع_واحد_نامشخص، در این مورد، بلوک SPS است (7) نال.
بایت دوم (دوتایی=01100100, هگزا=0x64, دسامبر=100) در SPS، NAL یک فیلد است شناسه پروفایل که پروفایل مورد استفاده توسط انکودر را نشان میدهد. در این مورد، از پروفایل High محدود استفاده شده است (یعنی یک پروفایل High بدون پشتیبانی از قطعه B دو جهته).

اگر به مشخصات جریان بیتی نگاه کنید H.264 برای SPS NAL، مقادیر زیادی برای پارامتر نام، دسته و توضیحات پیدا خواهیم کرد. برای مثال، بیایید به فیلدها نگاه کنیم pic_width_in_mbs_minus_1 и pic_height_in_map_units_minus_1.
| نام پارامتر | دسته | شرح |
|---|---|---|
| pic_width_in_mbs_minus_1 | 0 | ue(v) |
| pic_height_in_map_units_minus_1 | 0 | ue(v) |
اگر روی مقادیر این فیلدها عملیات ریاضی انجام دهید، رزولوشن را به دست میآورید. میتوانید با استفاده از فرمول زیر، 1920 در 1080 را نمایش دهید. pic_width_in_mbs_minus_1 با مقدار ۱۱۹ ((۱۱۹ + ۱) * macroblock_size = ۱۲۰ * ۱۶ = ۱۹۲۰). باز هم، برای صرفهجویی در فضا، به جای رمزگذاری ۱۹۲۰، این کار را با ۱۱۹ انجام دادیم.
اگر به بررسی ویدیوی ایجاد شده خود به صورت دودویی ادامه دهیم (برای مثال: xxd -b -c 11 v/minimal_yuv420.h264) ، سپس میتوانیم به آخرین NAL، که خود فریم است، برویم.

در اینجا مقادیر 6 بایتی اول آن را میبینیم: 01100101 10001000 10000100 00000000 00100001 11111111از آنجایی که مشخص است که بایت اول نوع NAL را نشان میدهد، در این مورد (00101) این قطعه IDR (5) است، و سپس بررسی بیشتر آن امکانپذیر خواهد بود:

با استفاده از اطلاعات مشخصات، رمزگشایی نوع قطعه () امکانپذیر خواهد بود.slice_type) و شماره فریم (فریم_تعداد) از جمله دیگر زمینههای مهم.
برای دریافت مقادیر برخی از فیلدها (ue(v), me(v), se(v) و یا te(v))، ما باید قطعه را با استفاده از یک رمزگشای ویژه بر اساس ... رمزگشایی کنیم. این روش برای کدگذاری مقادیر متغیر، به خصوص زمانی که مقادیر پیشفرض زیادی وجود دارد، بسیار کارآمد است.
معانی slice_type и فریم_تعداد از این ویدیو ۷ (قطعه I) و ۰ (فریم اول) هستند.
یک جریان بیت (bitstream) را میتوان به عنوان یک پروتکل در نظر گرفت. اگر میخواهید درباره جریان بیت بیشتر بدانید، باید به مشخصات آن مراجعه کنید. ITU H.264در اینجا یک نمودار ماکرو نشان داده شده است که دادههای تصویر در کجا قرار دارند (YUV به صورت فشرده).

سایر جریانهای بیتی نیز میتوانند بررسی شوند، مانند VP9, H.265 (HEVC) یا حتی بهترین بیتاستریم جدید ما AV1آیا همه آنها مشابه هستند؟ خیر، اما وقتی حداقل یکی را بفهمید، فهمیدن بقیه خیلی آسانتر میشود.
میخواهید تمرین کنید؟ جریان بیتی H.264 را بررسی کنید.
شما میتوانید یک ویدیوی تک فریمی تولید کنید و از MediaInfo برای بررسی جریان بیت آن استفاده کنید. H.264در واقع، هیچ چیز مانع از این نمیشود که حتی به کد منبعی که جریان بیتی را تجزیه و تحلیل میکند، نگاه کنید. H.264 (AVC).
برای تمرین، میتوانید از Intel Video Pro Analyzer استفاده کنید (قبلاً اشاره کردم که این برنامه پولی است، اما آیا نسخه آزمایشی رایگان با محدودیت ۱۰ فریم وجود دارد؟).
مرور
توجه داشته باشید که بسیاری از کدکهای مدرن از همان مدلی که ما بررسی کردیم استفاده میکنند. بیایید نگاهی به نمودار بلوکی یک کدک ویدیویی بیندازیم. ثورشامل تمام مراحلی است که ما انجام دادهایم. تمام هدف این پست این است که حداقل درک بهتری از نوآوریها و مستندات موجود در این زمینه به شما ارائه دهد.

ما قبلاً محاسبه کرده بودیم که برای ذخیره یک فایل ویدیویی یک ساعته با کیفیت 720p و 30 فریم در ثانیه، به 139 گیگابایت فضای دیسک نیاز است. با استفاده از روشهای مورد بحث در این مقاله (پیشبینی بین فریمی و درون فریمی، تبدیل، کوانتیزاسیون، کدگذاری آنتروپی و غیره)، میتوانیم (با فرض چگالی پیکسلی 0,031 بیت) به ویدیویی با کیفیت کاملاً رضایتبخش دست یابیم که تنها 367,82 مگابایت را اشغال میکند، نه 139 گیگابایت.
چگونه H.265 فشردهسازی بهتری نسبت به H.264 ارائه میدهد؟
حالا که اطلاعات بیشتری در مورد نحوهی کار کدکها داریم، راحتتر میتوانیم بفهمیم که چگونه کدکهای جدید میتوانند با بیتهای کمتر، وضوح بالاتری ارائه دهند.
اگر مقایسه کنید AVC и HEVC، لازم به یادآوری است که تقریباً همیشه انتخاب بین بار بیشتر CPU و نسبت فشردهسازی است.
HEVC گزینههای بیشتری برای بخشها (و زیرمجموعهها) نسبت به AVC، دستورالعملهای بیشتر برای پیشبینی داخلی، بهبود کدگذاری آنتروپی و موارد دیگر. همه این پیشرفتها انجام شده است H.265 قادر به فشرده سازی 50٪ بیشتر از H.264.

قسمت اول:
منبع: www.habr.com




