کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

قسمت اول: اصول کار با فیلم و تصاویر

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

چیست؟ کدک ویدیویی قطعه‌ای از نرم‌افزار/سخت‌افزار است که ویدیوهای دیجیتال را فشرده و/یا از حالت فشرده خارج می‌کند.

برای چه؟ علیرغم محدودیت های خاص هم از نظر پهنای باند و هم
و از نظر فضای ذخیره سازی داده ها، بازار به طور فزاینده ای ویدیویی با کیفیت بالاتری را می طلبد. یادتان هست چگونه در پست آخر حداقل مورد نیاز را برای 30 فریم در ثانیه، 24 بیت در پیکسل، با وضوح 480x240 محاسبه کردیم؟ ما 82,944 مگابیت بر ثانیه را بدون فشرده سازی دریافت کردیم. فشرده سازی در حال حاضر تنها راه برای انتقال کلی HD/FullHD/4K به صفحه های تلویزیون و اینترنت است. چگونه این امر محقق می شود؟ اکنون به طور خلاصه به روش های اصلی نگاه می کنیم.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

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

درگیر هستیم یکپارچه سازی سیستم های نظارت تصویریو ما در حال توسعه یک میکروتوموگراف هستیم.

کدک در مقابل کانتینر

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

به طور معمول، پسوند یک فایل ویدیویی نوع ظرف آن را نشان می دهد. به عنوان مثال، فایل video.mp4 احتمالاً یک ظرف است MPEG-4 قسمت 14و فایلی با نام video.mkv به احتمال زیاد ماتریوشکا. برای اطمینان کامل از کدک و فرمت کانتینر می توانید استفاده کنید FFmpeg به یا اطلاعات رسانه ای.

کمی از تاریخ

قبل از اینکه به چگونه؟، بیایید کمی به تاریخ شیرجه بزنیم تا برخی از کدک های قدیمی را کمی بهتر درک کنیم.

کدک ویدیویی H.261 در سال 1990 (از لحاظ فنی - در سال 1988) ظاهر شد و برای کار با سرعت انتقال داده 64 کیلوبیت بر ثانیه ایجاد شد. قبلاً از ایده هایی مانند نمونه برداری رنگی، بلوک های بزرگ و غیره استفاده می کرد. استاندارد کدک ویدیویی در سال 1995 منتشر شد H.263، که تا سال 2001 توسعه یافت.

اولین نسخه در سال 2003 تکمیل شد H.264 / AVC. در همان سال، TrueMotion کدک ویدیویی با اتلاف رایگان خود را به نام منتشر کرد VP3. گوگل این شرکت را در سال 2008 خریداری کرد و آن را منتشر کرد VP8 همان سال. در دسامبر 2012، گوگل منتشر شد VP9، و در حدود ¾ بازار مرورگرها (از جمله دستگاه های تلفن همراه) پشتیبانی می شود.

AV1 یک کدک ویدیویی متن باز و رایگان جدید است که توسط اتحاد برای رسانه های باز (AOMedia) که شامل معروف ترین شرکت ها مانند: گوگل، موزیلا، مایکروسافت، آمازون، نتفلیکس، AMD، ARM، انویدیا، اینتل و سیسکو می باشد. اولین نسخه کدک 0.1.0 در 7 آوریل 2016 منتشر شد.

تولد AV1

در اوایل سال 2015، گوگل در حال کار بر روی آن بود VP10Xiph (که متعلق به موزیلا است) روی آن کار می کرد داالاو سیسکو کدک ویدیویی رایگان خود را به نام ساخت ثور.

سپس MPEG LA اولین محدودیت سالانه برای HEVC (H.265) و هزینه ای 8 برابر بیشتر از H.264، اما به زودی دوباره قوانین را تغییر دادند:

بدون محدودیت سالانه،
هزینه محتوا (0,5٪ از درآمد) و
هزینه واحد حدود 10 برابر بیشتر از H.264 است.

اتحاد برای رسانه های باز توسط شرکت هایی از زمینه های مختلف ایجاد شده است: تولید کنندگان تجهیزات (Intel، AMD، ARM، Nvidia، Cisco)، ارائه دهندگان محتوا (Google، Netflix، Amazon)، سازندگان مرورگر (Google، Mozilla) و دیگران.

این شرکت ها یک هدف مشترک داشتند - یک کدک ویدیویی بدون حق امتیاز. سپس ظاهر می شود AV1 با مجوز ثبت اختراع بسیار ساده تر. Timothy B. Terryberry یک ارائه خیره کننده ارائه کرد که منشاء مفهوم فعلی AV1 و مدل مجوز آن شد.

اگر بدانید که می توانید کدک AV1 را از طریق مرورگر آنالیز کنید شگفت زده خواهید شد (علاقه مندان می توانند به این آدرس مراجعه کنند aomanalyzer.org).

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

کدک جهانی

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

مرحله 1 - تقسیم تصویر

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

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

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

کدک‌ها معمولاً این بخش‌ها را به بخش‌ها (یا تکه‌ها)، بلوک‌های ماکرو (یا بلوک‌های درختی کدنویسی) و زیربخش‌های متعدد سازمان‌دهی می‌کنند. حداکثر اندازه این پارتیشن ها متفاوت است، HEVC آن را روی 64x64 تنظیم می کند در حالی که AVC از 16x16 استفاده می کند، و پارتیشن های فرعی را می توان تا اندازه های 4x4 تقسیم کرد.

آیا انواع قاب های مقاله گذشته را به خاطر دارید؟! همین امر را می توان در مورد بلوک ها نیز اعمال کرد، بنابراین می توانیم یک قطعه I، یک بلوک B، یک ماکروبلاک P و غیره داشته باشیم.

برای کسانی که می خواهند تمرین کنند، تماشا کنند که چگونه تصویر به بخش ها و زیربخش ها تقسیم می شود. برای انجام این کار، می توانید از یکی از موارد ذکر شده در مقاله قبلی استفاده کنید. آنالایزر ویدیو پرو اینتل (یکی که پولی است، اما با نسخه آزمایشی رایگان که به 10 فریم اول محدود شده است). بخش‌ها در اینجا تحلیل می‌شوند VP9:

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

مرحله دوم - پیش بینی

هنگامی که بخش هایی را داریم، می توانیم پیش بینی های نجومی برای آنها انجام دهیم. برای INTER پیش بینی می کند باید منتقل شود بردارهای حرکتی و مابقی، و برای پیش بینی INTRA ارسال می شود جهت پیش بینی و بقیه

مرحله سوم - تحول

هنگامی که یک بلوک باقیمانده (بخش پیش‌بینی‌شده → بخش واقعی) داریم، می‌توانیم آن را به گونه‌ای تبدیل کنیم که بدانیم با حفظ کیفیت کلی، کدام پیکسل‌ها را می‌توان دور انداخت. تغییراتی وجود دارد که رفتار دقیق را ارائه می دهد.

اگرچه روش های دیگری نیز وجود دارد، اجازه دهید آنها را با جزئیات بیشتری بررسی کنیم. تبدیل کسینوس گسسته (DCT - از تبدیل کسینوس گسسته). وظایف اصلی DCT:

  • بلوک های پیکسل را به بلوک های هم اندازه ضرایب فرکانس تبدیل می کند.
  • قدرت را متراکم می کند تا به از بین بردن افزونگی فضایی کمک کند.
  • برگشت پذیری را فراهم می کند.

2 فوریه 2017 سینترا آر.جی. (Cintra, RJ) و Bayer F.M. (Bayer FM) مقاله ای در مورد تبدیل DCT مانند برای فشرده سازی تصویر منتشر کرد که تنها به 14 اضافه نیاز دارد.

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

بیایید این بلوک 8×8 پیکسل را در نظر بگیریم:

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

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

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

DCT را روی این بلوک پیکسل اعمال کنید و یک بلوک 8x8 از ضرایب بدست آورید:

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

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

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

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

این بلوک ضرایب یک ویژگی جالب دارد: اجزای فرکانس بالا را از فرکانس پایین جدا می کند.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

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

فرکانس به سرعت تغییر سیگنال اشاره دارد.

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

ابتدا آن را به حوزه فرکانس تبدیل می کنیم.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

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

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

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

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

می بینیم که شبیه تصویر اصلی است، اما تفاوت های زیادی با تصویر اصلی دارد. ما 67,1875٪ را بیرون انداختیم و همچنان چیزی شبیه به نسخه اصلی دریافت کردیم. می‌توان با دقت بیشتری ضرایب را کنار گذاشت تا تصویری با کیفیت بهتر به دست آورد، اما این موضوع بعدی است.

هر ضریب با استفاده از تمام پیکسل ها تولید می شود

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

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

همچنین می توانید سعی کنید DCT را با نگاه کردن به شکل گیری تصویر ساده بر اساس آن تجسم کنید. به عنوان مثال، در اینجا نماد A تولید شده با استفاده از هر وزن ضریب است:

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

مرحله چهارم - کوانتیزاسیون

بعد از اینکه در مرحله قبل مقداری ضرایب را بیرون انداختیم، در مرحله آخر (تبدیل) شکل خاصی از کوانتیزاسیون را انجام می دهیم. در این مرحله از دست دادن اطلاعات قابل قبول است. یا به عبارت ساده تر، ضرایب را برای رسیدن به فشرده سازی کمی می کنیم.

چگونه می توانید بلوک ضرایب را کمی کنید؟ یکی از ساده ترین روش ها کوانتیزه کردن یکنواخت است، وقتی یک بلوک را می گیریم، آن را بر یک مقدار (بر 10) تقسیم می کنیم و نتیجه را گرد می کنیم.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

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

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

این رویکرد بهترین نیست زیرا اهمیت هر ضریب را در نظر نمی گیرد. می توان به جای یک مقدار واحد از ماتریسی از کوانتیزرها استفاده کرد و این ماتریس می تواند از ویژگی DCT با کمی کردن اکثریت سمت راست پایین و اقلیت سمت چپ بالا استفاده کند.

مرحله 5 - کدگذاری آنتروپی

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

رمزگذاری ویدیو با استفاده از VLC

بیایید بگوییم که ما یک جریان شخصیت داریم: a, e, r и t. احتمال (از 0 تا 1) تعداد دفعات ظاهر شدن هر کاراکتر در یک جریان در این جدول ارائه شده است.

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

ما جریان را فشرده می کنیم، با این فرض که در نهایت برای هر کاراکتر 8 بیت هزینه می کنیم. بدون فشرده سازی، 24 بیت برای هر کاراکتر مورد نیاز است. اگر هر کاراکتری را با کد آن جایگزین کنید، پس انداز خواهید کرد!

اولین قدم کدگذاری کاراکتر است e، که برابر با 10 است و کاراکتر دوم است a، که اضافه می شود (نه به صورت ریاضی): [10][0] و در نهایت کاراکتر سوم t، که جریان بیت فشرده نهایی ما را برابر با [10][0][1110] یا می کند 1001110، که تنها به 7 بیت (3,4 برابر فضای کمتر از نسخه اصلی) نیاز دارد.

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

هم رمزگذار و هم رمزگشا باید به یک جدول نمادها با کدهای باینری خود دسترسی داشته باشند. بنابراین ارسال جدول به عنوان ورودی نیز ضروری است.

کدگذاری حسابی

بیایید بگوییم که ما یک جریان شخصیت داریم: a, e, r, s и t، و احتمال آنها در این جدول ارائه شده است.

a e r s t
احتمال 0,3 0,3 0,15 0,05 0,2

با استفاده از این جدول، محدوده‌هایی را می‌سازیم که شامل تمام کاراکترهای ممکن، مرتب‌شده بر اساس بیشترین تعداد باشد.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

حالا بیایید یک جریان از سه کاراکتر را رمزگذاری کنیم: خوردن.

ابتدا شخصیت اول را انتخاب کنید e، که در زیر محدوده 0,3 تا 0,6 قرار دارد (بدون احتساب). این زیر محدوده را می گیریم و دوباره به همان نسبت های قبلی، اما برای این محدوده جدید تقسیم می کنیم.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

بیایید به کدگذاری جریان خود ادامه دهیم خوردن. حالا کاراکتر دوم را بگیرید a، که در زیر محدوده جدید از 0,3 تا 0,39 قرار دارد و سپس آخرین کاراکتر ما را بگیرید. t و با تکرار دوباره همین روند، زیر محدوده نهایی را از 0,354 تا 0,372 به دست می آوریم.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

فقط باید عددی را در آخرین زیر محدوده از 0,354 تا 0,372 انتخاب کنیم. بیایید 0,36 را انتخاب کنیم (اما شما می توانید هر عدد دیگری را در این زیر محدوده انتخاب کنید). فقط با این شماره می توانیم جریان اصلی خود را بازیابی کنیم. مثل این است که ما یک خط در محدوده ها ترسیم می کنیم تا جریان خود را رمزگذاری کنیم.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

عملیات معکوس (یعنی رمزگشایی) به همین سادگی است: با عدد 0,36 و محدوده اولیه ما، می توانیم همان فرآیند را اجرا کنیم. اما اکنون با استفاده از این شماره، جریان رمزگذاری شده با استفاده از این شماره را شناسایی می کنیم.

با اولین محدوده، متوجه می شویم که عدد ما با برش مطابقت دارد، بنابراین این اولین کاراکتر ما است. حالا با انجام مراحل قبلی دوباره این زیرمحدوده را تقسیم می کنیم. در اینجا می توانید ببینید که 0,36 با نماد مطابقت دارد aو پس از تکرار مراحل به آخرین کاراکتر رسیدیم t (تشکیل جریان رمزگذاری شده اصلی ما خوردن).

هم رمزگذار و هم رمزگشا باید جدولی از احتمالات نماد داشته باشند، بنابراین ارسال آن در داده های ورودی نیز ضروری است.

بسیار شیک، اینطور نیست؟ هر کس این راه حل را پیدا کرد لعنتی باهوش بود. برخی از کدک های ویدیویی از این تکنیک استفاده می کنند (یا حداقل آن را به عنوان یک گزینه ارائه می دهند).

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

مرحله 6 - قالب بیت استریم

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

نگاهی گذرا به جریان بیت خواهیم داشت H.264. اولین قدم ما ایجاد یک جریان بیت حداقل H.264 است (FFmpeg به طور پیش فرض همه گزینه های رمزگذاری مانند SEI NAL - کمی بیشتر متوجه خواهیم شد که چیست). ما می توانیم این کار را با استفاده از مخزن خود و FFmpeg انجام دهیم.

./s/ffmpeg -i /files/i/minimal.png -pix_fmt yuv420p /files/v/minimal_yuv420.h264

این دستور یک بیت استریم خام تولید می کند H.264 با یک فریم، وضوح 64×64، با فضای رنگی YUV420. در این حالت از تصویر زیر به عنوان قاب استفاده می شود.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

H.264 بیت استریم

استاندارد AVC (H.264) تعیین می کند که اطلاعات در ماکرو فریم ها (به مفهوم شبکه) به نام فرستاده می شود NAL (این یک سطح انتزاع شبکه است). هدف اصلی NAL ارائه یک نمایش ویدئویی "وب دوستانه" است. این استاندارد باید روی تلویزیون ها (مبتنی بر جریان)، اینترنت (مبتنی بر بسته) کار کند.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

یک نشانگر همگام سازی برای تعیین مرزهای عناصر NAL وجود دارد. هر نشانه همگام سازی حاوی یک مقدار است 0x00 0x00 0x01, به جز اولین مورد که برابر است با 0x00 0x00 0x00 0x01. اگر راه اندازی کنیم هگزدامپ برای جریان بیت H.264 تولید شده، حداقل سه الگوی NAL را در ابتدای فایل شناسایی می کنیم.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

همانطور که گفته شد، رمزگشا باید نه تنها داده های تصویر، بلکه جزئیات فیلم، فریم، رنگ ها، پارامترهای استفاده شده و موارد دیگر را نیز بداند. اولین بایت هر NAL دسته و نوع آن را مشخص می کند.

شناسه نوع NAL شرح
0 نوع ناشناخته
1 قطعه تصویر رمزگذاری شده بدون IDR
2 بخش داده های برش کد شده A
3 بخش داده های برش کد شده B
4 بخش داده های برش کد شده C
5 قطعه IDR رمزگذاری شده از یک تصویر IDR
6 اطلاعات بیشتر در مورد پسوند SEI
7 مجموعه پارامترهای SPS Sequence
8 مجموعه ای از پارامترهای تصویر PPS
9 جداکننده دسترسی
10 پایان سکانس
11 انتهای موضوع
... ...

به طور معمول اولین NAL یک جریان بیت است PLC. این نوع NAL وظیفه اطلاع رسانی در مورد متغیرهای رمزگذاری رایج مانند پروفایل، سطح، وضوح و غیره را بر عهده دارد.

اگر از اولین نشانگر همگام‌سازی بگذریم، می‌توانیم اولین بایت را رمزگشایی کنیم تا بفهمیم کدام نوع NAL اول است.

به عنوان مثال، اولین بایت بعد از نشانه همگام سازی است 01100111، جایی که بیت اول (0) در فیلد f استorbidden_zero_bit. 2 بیت بعدی (11) میدان را به ما می گوید nal_ref_idc، که نشان می دهد که آیا این NAL یک فیلد مرجع است یا خیر. و 5 بیت باقی مانده (00111) میدان را به ما می گوید nal_unit_type، در این مورد بلوک SPS است (7) NAL.

بایت دوم (دوتایی=01100100, هگزا=0x64, دسامبر=100) در SPS NAL فیلد است profile_idc، که نمایه ای را که رمزگذار استفاده کرده را نشان می دهد. در این مورد، یک پروفایل محدود محدود استفاده شد (یعنی یک پروفایل بالا بدون پشتیبانی از بخش B دو طرفه).

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

اگر به مشخصات بیت استریم نگاه کنید 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 x 1080 نمایش داد pic_width_in_mbs_minus_1 با مقدار 119 ((119 + 1) * macroblock_size = 120 * 16 = 1920). باز هم برای صرفه جویی در فضا، به جای رمزگذاری 1920، این کار را با 119 انجام دادیم.

اگر به بررسی ویدیوی ایجاد شده خود به شکل باینری ادامه دهیم (به عنوان مثال: xxd -b -c 11 v/minimal_yuv420.h264، سپس می توانید به آخرین NAL که خود فریم است بروید.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

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

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

با استفاده از اطلاعات مشخصات، رمزگشایی نوع قطعه (slice_type) و شماره قاب (فریم_تعداد) در میان سایر زمینه های مهم.

برای بدست آوردن مقادیر برخی از فیلدها (ue(v), me(v), se(v) و یا te(v))، باید قطعه را با استفاده از رمزگشای ویژه بر اساس رمزگشایی کنیم کد گلومب نمایی. این روش برای رمزگذاری مقادیر متغیر بسیار کارآمد است، به خصوص زمانی که مقادیر پیش فرض زیادی وجود دارد.

معانی slice_type и فریم_تعداد این ویدیو 7 (قطعه I) و 0 (فریم اول) هستند.

جریان بیت را می توان به عنوان یک پروتکل در نظر گرفت. اگر می خواهید در مورد بیت استریم بیشتر بدانید، باید به مشخصات آن مراجعه کنید ITU H.264. در اینجا یک نمودار ماکرو نشان می دهد که داده های تصویر کجا هستند (YUV به صورت فشرده).

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

بیت استریم های دیگر را می توان بررسی کرد، مانند VP9, H.265 (HEVC) یا حتی بهترین بیت استریم جدید ما AV1. همه شبیه هم هستند؟ نه، اما هنگامی که حداقل یکی را فهمیدید، درک بقیه بسیار آسان تر است.

می خواهید تمرین کنید؟ جریان بیت H.264 را کاوش کنید

می توانید یک ویدیوی تک فریم تولید کنید و از MediaInfo برای بررسی جریان بیت استفاده کنید H.264. در واقع، هیچ چیز مانع شما نمی شود که حتی به کد منبعی که جریان بیت را تجزیه و تحلیل می کند نگاه کنید H.264 (AVC).

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

برای تمرین، می توانید از Intel Video Pro Analyzer استفاده کنید (آیا قبلاً گفتم که برنامه پولی است اما نسخه آزمایشی رایگان با محدودیت 10 فریم وجود دارد؟).

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

مرور

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

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

قبلاً محاسبه شده بود که برای ذخیره یک فایل ویدیویی یک ساعته با کیفیت 139p و 720 فریم بر ثانیه به 30 گیگابایت فضای دیسک نیاز است. اگر از روش‌های مورد بحث در این مقاله (پیش‌بینی‌های درون فریمی و داخلی، تبدیل، کوانتیزه کردن، کدگذاری آنتروپی و غیره) استفاده می‌کنید، می‌توانید (بر اساس این واقعیت که ما 0,031 بیت در هر پیکسل صرف می‌کنیم) ویدیویی با کیفیت کاملاً رضایت‌بخش داشته باشید. ، تنها 367,82 مگابایت اشغال می کند، نه 139 گیگابایت.

چگونه H.265 نسبت تراکم بهتری نسبت به H.264 بدست می آورد؟

اکنون که درباره نحوه کار کدک ها بیشتر می دانیم، درک اینکه چگونه کدک های جدیدتر می توانند وضوح بالاتری را با بیت های کمتر ارائه دهند آسان تر است.

اگر مقایسه کنید AVC и HEVC، شایان ذکر است که این تقریباً همیشه یک انتخاب بین بار CPU بیشتر و نسبت فشرده سازی است.

HEVC دارای گزینه های بخش (و زیربخش) بیشتر از AVC، جهت های پیش بینی داخلی بیشتر، کدگذاری آنتروپی بهبود یافته و موارد دیگر. همه این پیشرفت ها انجام شده است H.265 قادر به فشرده سازی 50 درصد بیشتر از H.264.

کدک ویدیویی چگونه کار می کند؟ بخش 2. چه، چرا، چگونه

قسمت اول: اصول کار با فیلم و تصاویر

منبع: www.habr.com

اضافه کردن نظر