فرمت و کدک ویدیو
کانتینر و کدک دو چیز جدا هستند: MP4 اسم ظرف است و H.264 اسم روشی که تصویر با آن فشرده شده. همین یک تفکیک بیشتر گرفتاری های «چرا این فایل باز نمی شود» را حل می کند، چون پخش کننده باید هم ظرف را بشناسد و هم کدک داخلش را.
- درس ۳ از ۱۰
- مقدماتی
- رایگان، بدون ثبت نام
یک فایل ویدیو، چهار لایه
از چیزی که می بینید تا فایلی که روی دیسک است. هر لایه یک تصمیم جدا است و دو تای پایینی همان هایی هستند که با هم اشتباه گرفته می شوند.
- رزولوشن و نرخ فریمچند پیکسل در هر فریم و چند فریم در هر ثانیه. این چیزی است که چشم می بیند. 1080p یا 4K
- بیت ریتچقدر داده در هر ثانیه خرج می شود. رزولوشن بالاتر بدون بیت ریت بالاتر یعنی تصویر بدتر. ثابت یا کیفیت ثابت
- کدکروش فشرده سازی. مجوز و پشتیبانی سخت افزاری همین جا تعیین می شوند. H.264، H.265، VP9، AV1
- کانتینرفایلی که روی دیسک است و همه چیز را کنار هم نگه می دارد. عوض کردنش معمولا کدگذاری دوباره لازم ندارد. MP4، MKV، WebM
این چهار لایه حجم فایل و سازگاری را توضیح می دهند، نه کیفیت خود تصویر. صحنه ای که بد نورپردازی شده با هیچ ترکیبی از این چهار تا درست نمی شود.
آخرین بررسی: فکت ها و نام ابزارهای این درس در همین تاریخ با منابعشان بازبینی شده اند.
کانتینر و کدک؛ کدام کدام است
کدک روشی است که تصویر و صدا با آن فشرده و دوباره باز می شوند، و کانتینر فایلی است که آن جریان های فشرده شده را کنار هم نگه می دارد: تصویر، یک یا چند مسیر صدا، زیرنویس، و اطلاعاتی مثل مدت و نرخ فریم. راهنمای کانتینرهای موزیلا همین را در جمله اول می گوید: کانتینر یک یا چند جریان رسانه ای را همراه با متادیتا در خودش کپسوله می کند تا با هم ذخیره و پخش شوند.
پس MP4 نام یک ظرف است و H.264 نام یک کدک. جمله «برایم یک MP4 بفرست» تقریبا هیچ چیزی درباره فایل نمی گوید، چون همان ظرف می تواند H.264 داشته باشد یا AV1، و این دو روی نصف دستگاه های دنیا سرنوشت متفاوتی دارند.
نتیجه عملی اینجاست: برای پخش شدن یک فایل، پخش کننده باید هر دو را بلد باشد. مرورگری که MP4 را باز می کند و کدک داخلش را نمی شناسد، فایل را باز می کند و یک قاب سیاه نشانتان می دهد. برعکسش هم هست: کدکی که مرورگر می شناسد ولی داخل ظرفی نشسته که مرورگر پخش نمی کند، همان قدر بی فایده است. وقتی این را بدانید، تشخیص خرابی دو سوال ساده می شود به جای یک حدس.

چرا پخش شدن به هر دو بستگی دارد
کانتینر
ظرف: MP4، MKV، WebM
- تصویر و صدا و زیرنویس را کنار هم نگه می دارد
- مدت و نرخ فریم را در متادیتا دارد
- هر ظرف فقط فهرست کوتاهی از کدک ها را می پذیرد
کدک
روش: H.264، H.265، VP9، AV1
- تصویر را فشرده می کند و دوباره باز می کند
- مجوز و حق امتیاز به این لایه مربوط است
- دیکدر سخت افزاری هم همین را می شناسد یا نمی شناسد
پخش کننده باید هر دو را بشناسد؛ یکی کافی نیست.
پخش کننده یا مرورگر
جایی که تصمیم واقعی گرفته می شود
- ظرف را نمی شناسد: فایل اصلا باز نمی شود
- کدک را نمی شناسد: فایل باز می شود و تصویر سیاه است
- هر دو را می شناسد ولی سخت افزار ندارد: پخش می شود و می پرد
این نمودار می گوید فایل پخش می شود یا نه. درباره اینکه خوب به نظر می رسد یا نه چیزی نمی گوید.
سه ظرفی که در عمل با آنها سر و کار دارید
MP4 ظرف تحویل است. تقریبا هر دستگاه و هر مرورگر و هر پلتفرمی آن را می پذیرد و به همین دلیل چیزی است که به مشتری می دهید و روی شبکه های اجتماعی آپلود می کنید. موزیلا هم همین را می نویسد: اگر فقط یک قالب می توانید بدهید، MP4 را بدهید.
MKV ظرف کار است. تقریبا هر کدکی را قبول می کند، چند مسیر صدا و چند زیرنویس را بدون دردسر نگه می دارد، و برای همین بین آرشیو و دانلود محبوب است. مرورگرها پخشش نمی کنند و این نقص MKV نیست؛ MKV برای وب ساخته نشده.
WebM ظرف وب است و عمدا کم توقع: فهرست موزیلا برای تصویرش فقط AV1 و VP8 و VP9 را می آورد و برای صدایش Opus و Vorbis. همین محدودیت است که بعدا در همین درس به کارتان می آید.
MOV هم هست، ظرف اپل، و در تدوین زیاد می بینیدش. برای تحویل به دنیای بیرون معمولا اول به MP4 تبدیل می شود، و آن تبدیل تقریبا همیشه فقط عوض کردن ظرف است و نه کدگذاری دوباره. این تمایز، همان چیزی است که در بخش تجربه خودمان با عدد نشانش داده ایم.
چهار کدکی که همه جا می بینید
ستون های زیر از راهنمای کدک های ویدیوی موزیلا خوانده شده اند و نه از تجربه شخصی، چون این ها فکت اند و تاریخ مصرف دارند.
| کدک | مجوز | پشتیبانی مرورگر | ظرف رایج | ادعای فشرده سازی |
|---|---|---|---|---|
| H.264 (AVC) | اختصاصی و ثبت اختراع دار، استفاده تجاری مجوز می خواهد | همه مرورگرها | MP4، 3GP | مبنای مقایسه |
| H.265 (HEVC) | اختصاصی، چند استخر ثبت اختراع، هزینه از توسعه دهنده گرفته می شود نه از تولیدکننده محتوا | وابسته به سیستم عامل و دیکدر سخت افزاری | MP4، MPEG-TS، QuickTime | نظرا نصف حجم AVC با کیفیت مشابه |
| VP9 | باز و بدون حق امتیاز | همه مرورگرها، بدون شفافیت در سافاری | WebM، MP4، Ogg | کیفیت نزدیک به HEVC در بیت ریت مشابه |
| AV1 | استاندارد باز و بدون حق امتیاز | همه مرورگرها؛ در سافاری فقط دستگاه هایی که دیکدر سخت افزاری دارند | WebM، MP4، MPEG-TS | بهتر از VP9 و HEVC، و تا پنجاه درصد بهتر از AVC |
یک نکته درباره ستون آخر که راحت اشتباه خوانده می شود: این عددها ادعای نسبت فشرده سازی اند، نه وعده اینکه فایل شما نصف می شود. نتیجه واقعی به خود تصویر بستگی دارد، به تنظیمات انکودر، و به اینکه چقدر حاضرید صبر کنید.
و ستون سافاری برای AV1 آن چیزی است که در پروژه واقعی گاز می گیرد. موزیلا می نویسد پشتیبانی سافاری محدود به دستگاه هایی است که دیکدر سخت افزاری دارند، یعنی مک بوک های M3 به بعد و آیفون ۱۵ پرو و آیفون ۱۶ به بعد. «AV1 در همه مرورگرها هست» و «AV1 روی آیفون مشتری من پخش می شود» دو جمله متفاوت اند.
بیت ریت و رزولوشن چه فرقی دارند
رزولوشن تعداد پیکسل هر فریم است، مثل 1080p یا 4K. بیت ریت مقداری داده است که کدک اجازه دارد در هر ثانیه خرج کند. این دو مستقل اند و همین جاست که بیشتر خروجی های بد ساخته می شوند.
اگر رزولوشن را بالا ببرید و بیت ریت را ثابت نگه دارید، تصویر بدتر می شود نه بهتر: همان مقدار داده حالا باید بین پیکسل های بیشتری تقسیم شود. خروجی 4K با بیت ریتی که برای 1080p تنظیم شده، یک فایل بزرگ تر با تصویر نرم تر و لکه دار تر است. این را همه جا می شود دید، مخصوصا در صحنه هایی که چیزی سریع حرکت می کند.
در عمل دو جور می شود بیت ریت را تعیین کرد. یکی گفتن یک عدد ثابت، که وقتی مقصد سقف دارد به کار می آید. دیگری کیفیت ثابت، که در ffmpeg با CRF تنظیم می شود: به انکودر می گویید کیفیت را نگه دار و هرچقدر بیت لازم است خرج کن. برای فایلی که قرار است روی سایت بنشیند، کیفیت ثابت تقریبا همیشه انتخاب بهتری است، چون صحنه ساکت بیت کمتری می گیرد و صحنه شلوغ بیشتر، و این دقیقا همان کاری است که چشم انتظارش را دارد.
چرا این فایل روی گوشی مشتری باز نمی شود
سه چیز جواب این سوال را می دهند و هر سه به کدک برمی گردند، نه به ظرف.
اول سخت افزار. بیشتر دستگاه ها H.264 را در یک تراشه جدا دیکد می کنند و برای همین پخشش خنک و کم مصرف است. کدک های تازه تر تراشه تازه تر می خواهند و روی دستگاه قدیمی به نرم افزار می افتند، یعنی پردازنده کار را انجام می دهد: باتری زودتر تمام می شود و اگر دستگاه ضعیف باشد تصویر می پرد. موزیلا برای AV1 و HEVC هر دو همین قید سخت افزار را می نویسد.
دوم مجوز. H.264 و H.265 ثبت اختراع دارند و AV1 و VP9 ندارند، و همین توضیح می دهد چرا هر مرورگر چیزی را می فرستد که می فرستد. موزیلا اضافه می کند که استخر ثبت اختراع Via LA برای پخش ویدیوی AVC روی اینترنت، تا وقتی که ویدیو برای کاربر نهایی رایگان باشد، هزینه مجوز نمی گیرد؛ و هزینه HEVC از توسعه دهنده گرفته می شود نه از تولیدکننده و توزیع کننده محتوا. این توضیح می دهد چرا وضعیت HEVC در مرورگرها این قدر تکه تکه است.
سوم خود ظرف. مرورگر MKV پخش نمی کند، هرچند کدک داخلش را بشناسد. و اینجا یک تله واقعی هست: WebM جریان H.264 را اصلا قبول نمی کند، پس «MP4 را به WebM تبدیل کن» بدون عوض کردن کدک شدنی نیست. این را می شود آزمایش کرد و ما در بخش تجربه خودمان همین کار را کرده ایم.
پس ترتیب عیب یابی این است: اول ببینید داخل فایل چه کدکی است، بعد ببینید مقصد آن کدک را می پذیرد یا نه، و تازه بعد سراغ ظرف بروید. عوض کردن پسوند فایل هیچ وقت جواب نبوده و نیست.
موقع خروجی گرفتن کدام ترکیب را بگذارم
سه مقصد داریم و هر کدام جواب خودش را دارد. جواب ها از دل همان چیزی درمی آیند که تا اینجا خوانده اید و نه از یک فهرست دلبخواه.
تحویل به مشتری یا آپلود در شبکه اجتماعی: H.264 با صدای AAC داخل MP4. اینجا شما آن طرف را کنترل نمی کنید، پس سازگاری بر حجم مقدم است. موزیلا هم دقیقا همین ترکیب را به عنوان گزینه امن معرفی می کند، با یادآوری اینکه رعایت شرایط مجوز به عهده خودتان است.
پخش روی سایت خودتان: AV1 یا VP9 با صدای Opus داخل WebM، و یک MP4 به عنوان جایگزین. تگ video اجازه می دهد چند منبع بگذارید و مرورگر اولین موردی را که می شناسد برمی دارد. توصیه خود موزیلا هم همین دو منبع پشت سر هم است: اول WebM با AV1 و Opus، بعد MP4.
آرشیو و مستر: هرچه از دوربین یا از تدوین بیرون آمده، دست نخورده. هر خروجی جدید را از مستر بگیرید و نه از خروجی قبلی. فایل با اتلاف که دوباره فشرده شود، مرحله دور ریختن دوباره اجرا می شود، این بار روی چیزی که یک بار دور ریخته شده. این تنها قاعده این درس است که هیچ استثنایی ندارد.
و یک چیزی که در این صفحه نخواهید دید: عددی که بگوید تبدیل به AV1 چقدر حجم را کم می کند. ما این آزمایش را روی همین سرور اجرا کردیم، ولی کلیپ آزمایشی مان یک الگوی مصنوعی بود و نسبت فشرده سازی روی الگوی مصنوعی به ویدیوی واقعی منتقل نمی شود. عدد چاپ نکردن بهتر از چاپ کردن عددی است که برای شما درنمی آید.
یک سوال که خروجی را تعیین می کند
شما تعیین می کنید این فایل کجا پخش شود، یا کس دیگری؟
سازگاری اول: H.264 و AAC داخل MP4
- تحویل به مشتری، آپلود در شبکه اجتماعی، پیوست ایمیل
- هر دستگاهی این را دیکد می کند، اغلب با سخت افزار
- حجم بیشتر است و همین بهایی است که برای اطمینان می دهید
حجم کمتر: AV1 یا VP9 و Opus داخل WebM
- ویدیو روی سایت خودتان، با تگ video و چند منبع
- یک MP4 هم به عنوان جایگزین بگذارید، همیشه
- کدگذاری کندتر است؛ این را در برنامه کاری حساب کنید
این فورک درباره تحویل است و نه درباره آرشیو. مستر همیشه دست نخورده می ماند و هر خروجی تازه از خود مستر گرفته می شود.
مسیر سریع با هوش مصنوعی
راه معمول این است که فایل را در یک نرم افزار باز کنید و دوباره خروجی بگیرید. راه سریع با یک سوال دیگر شروع می شود: اصلا لازم است چیزی دوباره کدگذاری شود؟ نصف کارهایی که اسمشان «تبدیل ویدیو» است فقط عوض کردن ظرف اند، و عوض کردن ظرف نه کیفیت می برد و نه وقت. مدل زبانی اینجا دو کار را خوب انجام می دهد: خواندن خروجی خام ffprobe و نوشتن خط فرمان ffmpeg، که به قدر کافی نامهربان است که آدم ها از آن فرار کنند. مدل سریع و ارزان از رده Flash برای این کافی است و انتخاب فعلی ما در بخش هوش مصنوعی همین سایت فهرست شده.
- اول ببینید داخل فایل چیست، نه اینکه پسوندش چیست. یک خط کافی است: ffprobe -v error -show_entries stream=codec_type,codec_name,profile,width,height,r_frame_rate,bit_rate:format=format_name,duration,size -of default=nw=1 input.mp4
- مقصد و محدودیت هایش را صریح بنویسید. بدون این، مدل درباره کدک نظر می دهد ولی نمی داند سقف حجم یا رزولوشن پذیرفته شده چیست، و جوابش عمومی می شود.
- نسخه پایین را پر کنید و اجرا بگیرید. کلید کار بند دوم آن است: اگر فقط ظرف اشتباه است، جواب باید یک دستور با c copy باشد و همانجا تمام شود.
- بعد از اجرا دو چیز را چک کنید. اگر انتظار داشتید فقط ظرف عوض شود، جریان تصویر باید بایت به بایت همان باشد؛ با ffmpeg -i out -map 0:v -c copy -f md5 - روی هر دو فایل قابل اثبات است. و اگر واقعا کدگذاری دوباره شده، خروجی را روی همان دستگاهی ببینید که قرار است پخشش کند.
نسخه آماده کپی
نقش: مهندس ویدیو. کار تو تصمیم گرفتن درباره ظرف و کدک است، نه توصیه کلی. هیچ عددی نساز که در خروجی ffprobe یا در مشخصات مقصد نباشد.
مقصد این فایل:
{مثلا: پخش روی سایت خودمان با تگ video | آپلود در اینستاگرام | تحویل به مشتری | آرشیو}
محدودیت هایی که مقصد اعلام کرده:
{مثلا سقف حجم، حداکثر رزولوشن، کدک های پذیرفته شده. هرچه اعلام نشده بنویس «اعلام نشده»}
خروجی ffprobe:
{خروجی را اینجا بگذار}
به این ترتیب جواب بده:
۱. داخل این فایل چیست: ظرف، کدک تصویر، کدک صدا، رزولوشن، نرخ فریم، مدت.
۲. آیا برای این مقصد اصلا کدگذاری دوباره لازم است؟ اگر فقط ظرف اشتباه است، دستور تغییر ظرف با c copy را بده و همینجا تمام کن.
۳. اگر کدک باید عوض شود، دقیقا یک دستور ffmpeg بده و زیرش در یک خط بگو هر گزینه چه می کند.
۴. اگر مقصد چیزی را اعلام نکرده، بنویس «اعلام نشده» و گزینه امن را پیشنهاد بده. حدس نزن.
۵. آخر کار بنویس بعد از اجرا چه چیزی را باید با چشم خودم چک کنم.
قبل از اعتماد به خروجی: مدل تصویر شما را نمی بیند. می تواند بگوید داخل فایل H.264 است و داخل MP4 نشسته؛ نمی تواند بگوید خروجی بد به نظر می رسد. پس بند پنجم نسخه شوخی نیست: کیفیت را همیشه خودتان روی همان دستگاه مقصد چک کنید. و یک چیز را هرگز به مدل نسپارید که پایین در بخش ریسک آمده.
هوش مصنوعی در این کار
انتخاب کدک کاری نیست که هوش مصنوعی در آن چیز تازه ای اضافه کند؛ قاعده هایش نوشته شده و در همین صفحه هست. جایی که مدل واقعا وقت آزاد می کند خط فرمان است: ffmpeg بیش از صد گزینه دارد و کسی آنها را حفظ نیست. و جایی که همه چیز خراب می شود، ابزارهای «ارتقای هوشمند» تصویرند.
ابزارهایی که واقعا کمک می کنند
- Claude برای نوشتن خط فرمان ffmpeg و توضیح دادن هر گزینه، چون توضیحش قابل رد کردن است و می شود با مستندات مقایسه اش کرد. ایران در فهرست کشورهای پشتیبانی شده انتروپیک نیست و مسیر پرداخت رسمی از ایران وجود ندارد.
- Gemini برای پاس مکانیکی روی خروجی ffprobe یک پوشه پر از فایل، با مدل سریع و ارزانش. صفحه خود گوگل می گوید اپ وب جمینای در بیش از دویست و سی کشور و منطقه کار می کند و ایران در آن فهرست نیست.
- FFmpeg هوش مصنوعی نیست و عمدا در این فهرست آمده. کاری که در این درس واقعا تکرار شونده است با یک خط دستور انجام می شود و هیچ مدلی لازم ندارد. مدل تصمیم می گیرد و پیشنهاد می دهد، ابزار اجرا می کند.
- RGB لایه دسترسی و پرداخت برای ایران، جدا از خود ابزارها.
کجا نتیجه معکوس می دهد
سه ریسک، و اولی از همه جدی تر است. ابزارهای ارتقای ویدیو جزئیاتی را که در فایل ضبط نشده اند برنمی گردانند؛ جزئیات محتمل می سازند. برای تیزر و کار تزئینی مهم نیست، ولی وقتی ویدیو قرار است شاهد باشد، یعنی یک مصاحبه، یک رضایت نامه مشتری، یک تصویر دوربین مداربسته، نسخه «ارتقا یافته» دیگر همان چیزی نیست که ضبط شده و ارائه اش به جای منبع، تحریف است. ریسک دوم: کدگذاری دوباره واترمارک هوش مصنوعی را پاک نمی کند. گوگل درباره SynthID می نویسد واترمارکش طوری طراحی شده که در برابر برش و فیلتر و تغییر نرخ فریم و فشرده سازی با اتلاف دوام بیاورد، و خودش هم ابزار تشخیص دارد. ریسک سوم کوچک تر ولی روزمره است: از مدل نپرسید امروز کدام مرورگر کدام کدک را پشتیبانی می کند. جواب می دهد، مطمئن به نظر می رسد، و از داده آموزشی می آید که تاریخش را به شما نمی گوید. این را از موزیلا یا caniuse بخوانید، نه از یک مدل و نه از همین صفحه ای که می خوانید.
منبع ها: MDN: Web video codec guide MDN: Media container formats Google DeepMind: SynthID
حد این توصیه
کدک اهرم کوچکی است. فایلی که چهار برابر جایگاه نمایشش رزولوشن دارد، با هر کدکی که بسازیدش فایل غلطی است؛ مدت و رزولوشن تقریبا همیشه از انتخاب کدک مهم ترند. ستون پشتیبانی مرورگر هم تاریخ مصرف دارد: هرچه در جدول این صفحه است در تاریخ بالای صفحه از موزیلا خوانده شده و راه درست برای امروز باز کردن خود آن راهنما یا caniuse است، نه اعتماد به این صفحه. و یک چیز را هیچ صفحه ای نمی تواند به شما بگوید: اینکه دیکدر سخت افزاری دستگاه مشتری شما چه چیزی را می شناسد. تنها آزمون واقعی، پخش کردن همان فایل روی همان دستگاه است.
از تجربه خود ما
ادعای «کانتینر فقط ظرف است» را روی همین سرور اندازه گرفتیم، با ffmpeg نسخه 6.1.1 و در تاریخ بالای همین صفحه. یک کلیپ ده ثانیه ای 1280x720 با H.264 ساختیم و بعد بدون هیچ کدگذاری دوباره آن را در دو ظرف دیگر ریختیم. اندازه سه فایل شد 3776719 و 3775504 و 3776666 بایت، یعنی اختلاف هر سه با هم از یک کیلوبایت هم کمتر است، و کل کار کمتر از یک دهم ثانیه طول کشید. مهم تر از اندازه، این است: md5 خود جریان تصویر در هر سه فایل دقیقا یکی است، 93dc8bd0df89a3adff8aa9233b8bbb46. یعنی نه یک بایت از تصویر عوض شده و فقط بسته بندی فرق کرده. بعد همان جریان را با همان دستور در WebM ریختیم و ffmpeg قبول نکرد: Could not write header (incorrect codec parameters ?). این دو نتیجه کنار هم، همان چیزی است که این درس با آن شروع شد.
سوال هایی که واقعا پرسیده می شوند
MP4 بهتر است یا MKV؟
دو کار متفاوت اند. MKV تقریبا هر کدکی و هر تعداد مسیر صدا و زیرنویس را نگه می دارد و برای آرشیو و دانلود خوب است؛ مرورگرها پخشش نمی کنند. MP4 قالب تحویل است، چون همه جا باز می شود. تبدیل یکی به دیگری هم اغلب فقط عوض کردن ظرف است و کیفیت نمی برد.
چرا حجم ویدیو بعد از تبدیل بیشتر شد؟
چون فایلی که از قبل فشرده بود دوباره و این بار با بیت ریت بالاتری کدگذاری شده. انکودر نمی داند فایل ورودی چقدر کیفیت دارد؛ فقط عددی را که به آن داده اید رعایت می کند. راه حل، گرفتن خروجی از مستر است و نه از خروجی قبلی.
الان AV1 استفاده کنم؟
روی سایت خودتان بله، به شرط اینکه یک MP4 هم به عنوان جایگزین بگذارید. دو هزینه دارد که باید بدانید: کدگذاری اش محسوس کندتر است، و در سافاری فقط روی دستگاه هایی کار می کند که دیکدر سخت افزاری AV1 دارند. برای فایلی که دست مشتری می دهید، هنوز H.264 انتخاب کم دردسرتری است.