اصولا ویدئوها (منظورم دنبالهای از تصاویر است و کاری به صدا ندارم) توسط دوربین در حالت آنالوگ ذخیره میشن (این که چه جوری اینکار رو انجام میدن برمیگرده به ساخت اولین دوربینها که قدمت ۳۰۰ ، ۴۰۰ ساله داره!) بعد دوربین اون رو با یه مبدل آنالوگ به دیجیتال تبدیل میکنه به دادههای صفر و یک که به درد دنیای دیجیتالی کامپیوترها میخوره. اینکه این ویدئو خام رو برای استفاده روزمره به کار ببریم اصلا ایده خوبی نیست چون باید برای هر پیکسل از فریم تصویر (که خودش شامل Contrast و رنگ هست و این رنگ هم خودش از ترکیب رنگهای پایه به وجود میاد و تازه هر ثانیه از فیلم ممکنه تا ۶۰ فریم داشته باشه!) باید دادهای در نظر گرفت در نتیجه حجم فوقالعاده بالایی داره (مثلا ۳۰۰ گیگابایت برای ۱ ساعت فیلم) و بهدرد ذخیره روی دیسک و فرستادن روی اینترنت نمیخوره. اینجا بود که روشهای مختلفی برای فشردهسازی ویدئو به وجود آمد که هرکدوم از تکنیکهای مختلف ریاضی و مهندسی استفاده میکنن و اهداف مختلفی هم دارند. مثلا با جدا کردن رنگها و فشرده سازیشون و یا حذف قسمتی از تصویر که تو فریمهای مختلف ثابت است. به هرحال این متدها باید بتونن تعادل مناسبی رو بین حجم و کیفت و پیچیدگی روش برقرار کنن.
چون این روشها متفاوت هستند پس میتونن ویدئوها با فورمتهای متفاوتی ایجاد کنن که این خودش باعث عدم هماهنگی اونها میشه. یه سری فرمت که اطلاعات در موردشون آزاد بود یا از نظر فشردهگی بهینه بودند کم کم تبدیل به استاندارد شدن. مثل MPEG-4 Part2 یا H264 . ما برای اجرا (Decode) یا ساختن این فرمتها (Encode) به کدک نیاز داریم.
کدک: کدک یه سختافزار یا برنامه است که برای کدگذاری و/یا کدگشایی یک جریان اطلاعاتی ویدئویی به کار میره. از این تعریف مشخص هست که کاراهایی که یک کدک انجام میده زیاد هستند مثل کدکردن یه جریان اطلاعاتی برای ارسال اون یا ذخیره کردنش روی دیسک یا کدگشایی اون برای پخش و یا تغییر اون.
کدکها فرمت ویدئویی نیستند
نکته مهم اینجاست که کدکها رو نباید باید فرمتهای ویدئویی اشتباه گرفت. فرمتی مثل MPEG-4 یه سری اطلاعات هست که مشخصاتش رو توضیح داده یا یه فایل ویدئویی که بر اساس اون ساخته شده. کدک برنامهای هست که اون فایل رو میخونه یا ایجاد میکنه. کدکهایی که بر اساس یه فرمت نوشته میشن با هم سازگارن. مثلا ویدئویی که با کدک Xvid نوشته میشه به راحتی توسط کدک DivX Pro خونده میشه چون دوتاشون بر اساس MPEG-4 Part 2 هستند. ولی ممکن هست تصویر خام یکسانی که با این دو کدک Encode میشه کاملا متفاوت باشه از نظر کیفیت!
کدکها رو میشه به دو دسته کلی تقسیم کرد:
Lossy
این کدکها بر اساس فرمتی هستند که مقداری از داده اولیه رو حذف میکنن برای کمتر کردن حجم فایل ولی جوری که این افت کیفیت به چشم نیاد. کمتر کردن حجم فایل مزایای زیادی داره مثلا میشه صوت و تصویر بیشتری رو روی دیسک ذخیره کرد و اینجوری هزینهها رو کاهش داد. فرمتهای مطرحی مثل MPEG-1/2 Audio Layer 3 (همون MP3) و H.264 از نوع Lossy هستند.
Lossless
این فورمتها سعی میکنن تمام اطلاعات موجود در جریان داده اصلی رو در قالبی فشرده ذخیره کنن که هیچ جزئیاتی از دست نره. خوب معمولا از این فرمتها برای نگهداری آرشیو استفاده میشه یا کلا کسی که بخواد یه صوت یا ویدئو رو با بهترین کیفیت داشته باشه. مثالی که الان به ذهنم میرسه ازش فرمت آزاد Flac هست.
فرمت حامل یا Container format : فرمتی هست که شامل ویدئو و صوت و metadata های مختلفی از جمله اطلاعات Sync صدا و تصویر هست. از Container format مطرح میتوان به AVI و Matroska اشاره کنم که حتما فایلهاشو با پسوند MKV دیدید.
کدکها و پلیرها در لینوکس
توی لینوکس به مقدار بسیار زیادی برنامه و فریمورک و کدک برای پخش فایلهای صوتی و تصویری وجود داره که من سعی میکنم مهمترینشون معرفی کنم.
GStreamer
GStreamer یک فریم ورک چند رسانهای هست که به زبان C نوشته شده. فکر کن می خوای یه برنامه پخش موسیقی بنویسی. در اون صورت باید Decoderهای مناسب را بشناسی و فایل رو به اون بدی بعد هم کار با ALSA رو بلد باشی تا صدا به اسپیکر بره. ولی اگر تو برنامه از GStreamer استفاده کنی تمام این مراحل جهنمی رو GStreamer انجام میده و شما میتونید رو قسمتهای دیگه برنامه تمرکز کنی. این فریم ورک خودش کدکی نداره و کدکهاش از طریق پلاگینها روش نصب میشن. ۳ پلاگین Good و Bad و Ugly هر کدوم شامل کدکهای خاصی هستند. GStreamer به طور عمده تو میزکار Gnome استفاده میشه و برنامههای معروفی مثل Totem ، Rhythmbox و Songbird ازش استفاده میکنند.
MPlayer
به نظر من که Mplayer معروفترین و بهترین پلیر لینوکس هست. این برنامه که به OSهای زیاد دیگهای هم از جمله M$ Windows و Mac پورت شده، فرمتهای زیادی رو به بهترین نحو ممکن باز میکنه. این برنامه رابط گرافیکی (GUI) نداره و از طریق کامند لاین باید باش کار کرد. البته GUI های زیادی براش نوشتن مثل SMplayer ولی هیچ کدوم کار کردن مستقیم با خودش اونم با کامند لاین نمیشه!
xine
کسین هم یکی دیگه دیگه پلیرهای جالب تو لینوکس هست که استارتش سال ۲۰۰۰ خورده. این یکی هم GUI نداره مثل MPlayer و Frontend های مختلفی براش نوشتن. یه ویژگی جالب این برنامه که همیشه ازش یاد میشه اصلاح هماهنگی صدا و تصویر تو ویدئو هست. استفاده عمده Xine توی KDE هست. (KDE از Phonon استفاده میکنه و Phonon هم از Xine )
کدوم از همه بهتره؟
این رو به یادت داشته باش که تو برنامههای آزاد اضافه کاری اشتباه است و میشه برای انجام کاری از قسمتی از برنامهای که موجود هست استفاده کنیم. پلیرهایی که نام بردم اکثرا از اجزای مشترک استفاده میکنن. مثلا Xine و Mplayer از libavcodec استفاده می کنن که یه کتابخانه برای Encode و Decode کرد اکثر فرمتهاست و از پروژه FFMPEG اومده. جالب هست که بدونید کدکهای فوقالعاده عالی fddshow هم از این کتابخانه استفاده میکنن (اگر K-lite Codec Pack رو نصب کرده باشید دیدیشون). فرق عمده اینها در خورده کاریهاست مثل پخش زیرنویس و مدریت پلی لیست و … (البته زیاد هم خورده کاری نیست!) موضوع دیگه که پخش فایلهای ویدئویی با روزلوشون بالا هست که برای کارایی بهتر باید برن رو GPU (پردازنده گرافیکی) Decode یا Encode بشن. برنامهها باید بتونن از API های درایورهای موجود برای این امر استفاده کنن. وارد جزئیات نمیخوام بشم ولی Mplayer و نسخه آخرین نسخه VLC تو این ضمینه عالی هستند. به هر حال باید باشون کار کنید تا ببنید با کدومشون بیشتر حال میکنید.