| mjpegtools(1) | General Commands Manual | mjpegtools(1) |
نام (NAME)
mjpegtools - مجموعه ابزارهای پردازش، ضبط و کدگذاری ویدئوهای MJPEG و MPEG
توضیحات (DESCRIPTION)
راهنمای کاربردی MJPEG HOWTO - مقدمهای بر mjpeg-tools (توضیحات مجموعه ابزارهای ضبط، ویرایش، پخش MJPEG و کدگذاری MPEG)
مقدمه
این موارد را یادداشت کردم زیرا برگههای یادداشت متعددی داشتم. این متن باید نوعی چکیده از دانش جمعآوریشده در یک دوره زمانی طولانی باشد. Andrew Stevens در زمینه دانش و نکات کدگذاری و VCD کمک کرد.
مجموعه Mjpegtools دستهای از برنامههاست که میتوانند ضبط، پخش، ویرایش و در نهایت فشردهسازی MPEG صدا و تصویر را در لینوکس انجام دهند.
اگرچه این ابزارها عمدتاً برای استفاده با کارتهای ضبط/پخش مبتنی بر تراشه کدک MJPEG یعنی Zoran ZR36067 در نظر گرفته شدهاند، اما mjpegtools میتواند به آسانی برای پردازش و فشردهسازی جریانهای ویدئویی MJPEG ضبطشده با استفاده از xawtv از طریق دستگاههای ساده فریمبافر (frame-buffer) به کار رود.
راهنمای HOWTO این ابزارها با هدف ارائه مقدمهای بر MJPEG-tools و ایجاد ویدئوهای MPEG 1/2، VCD، SVCD و DVD و تبدیل مجدد (transcoding) جریانهای mpeg موجود تهیه شده است.
برای اطلاعات بیشتر در مورد برنامهها، به صفحه راهنمای (man-page) مربوطه مراجعه کنید.
توجه: نسخه آلمانی نیز در دسترس است:
صفحه راهنمای man نیز از این متن وجود دارد. در صورت نصب بودن، میتوانید آن را با ”man mjpegtools” بخوانید. ما همچنین یک نسخه info داریم که میتوانید آن را با دستور info بخوانید.
نسخه متنی این سند از طریق cvs در دسترس است. شما باید آن را به همراه تاربال (tarball) یا بسته از پیش کامپایلشده (RPM و deb) دریافت کنید.
در تصویر زیر گردش کار متداول هنگام ضبط یک ویدئو، برش آن پس از ضبط و سپس کدگذاری آن را مشاهده میکنید. در تصویر همچنین ارتباط با سایر برنامهها دیده میشود. این بخشها به رنگ خاکستری هستند. بخشهای آبیرنگ را میتوان با mjpegtools انجام داد.
گردش کار کدگذاری ویدئو
فهرست نامرتب نکات مفید
شما باید بسته mjpeg_play را کامپایل و نصب کنید؛ برای این کار فایلهای README و INSTALL.real را بخوانید و نکات ارائهشده توسط اسکریپت configure را دنبال کنید. اگر نمیخواهید آن را کامپایل کنید، میتوانید بسته .RPM یا .DEB مربوط به mjpeg را از Sourceforge دانلود کنید یا در صورت وجود، از نسخه ارائهشده توسط توزیع خود استفاده نمایید.
اسکریپتی در دایرکتوری scripts/ وجود دارد. این اسکریپت روشی را نشان میدهد که کار از طریق آن قابل انجام است. همچنین (تحت شرایط خاصی) ویدئوهایی با کیفیت مناسب ایجاد میکند. ویدئوهای بهتر را تنها با تنظیم دقیق پارامترها به دست خواهید آورد.
اگر از هسته لینوکس سری 2.4 استفاده میکنید، معمولاً باید درایورهای کارتهای Buz یا DC10 یا LML33 را بارگذاری کنید. شما باید اسکریپت بهروزرسانی را اجرا کرده و نام کارت خود را به عنوان گزینه به آن بدهید. این اسکریپت معمولاً در /usr/src/driver-zoran/ قرار دارد. درایور کرنل zoran پیش از کرنل 2.4.4 کار نمیکند. باید از درایور موجود در این نشانی استفاده کنید:
در هسته 2.6 لینوکس، درایور کارتهای zoran گنجانده شده است؛ فقط باید مطمئن شوید که به درستی بارگذاری شده است. اگر یک سیستم x64 و کرنلی جدیدتر از 2.6.30 دارید، خوشحال میشویم بشنویم که توانستهاید از کارت مبتنی بر zoran ضبط کنید؛ مطمئن نیستم که این ترکیب به درستی کار کند.
درایور کارت Matrox Marvel نیز کار میکند، اطلاعات بیشتر درباره آن:
اگر ابزارها را روی رایانهای مبتنی بر P6 (شامل PPro، P-II، P-III، P-4، Athlon، Duron) کامپایل کنید، هرگز سعی نکنید آنها را روی رایانهای مبتنی بر P5 (مانند Pentium، Pentium-MMX، K6، K6-x، Cyrix، Via، Winchip) اجرا کنید. خطای ”illegal instruction” دریافت خواهید کرد و برنامه کار نخواهد کرد. این موضوع برای پردازندههای جدیدتر نیز صادق است. اگر از بهینهسازیهای خاص استفاده میکنید، به این موارد دقت داشته باشید.
اگر lav2yuv با خطای core dump متوقف شد، یک علت احتمالی این است که پشتیبانی از dv گنجانده نشده است. برای فعال کردن آن، مطمئن شوید که libdv روی سیستم نصب است. این کار در صورتی لازم خواهد بود که از یک دوربین دیجیتال (یا مبدل آنالوگ به DV مانند Canopus ADVC100) استفاده کنید و فرمت dv avi را به فرمت MPEG تبدیل نمایید.
برنامه xawtv را اجرا کنید تا ببینید تصویر دریافت میکنید یا خیر. اگر میخواهید از پخش سختافزاری جریانهای ضبطشده استفاده کنید، باید یک بار xawtv (هر برنامه تلویزیونی دیگری نیز کار میکند) را اجرا کنید تا جریانها پخش شوند. همچنین باید تنظیمات میکسر کارت صدا را بررسی کنید. اگر از v4l2 استفاده میکنید، بهتر است mplayer را برای مشاهده تصویر امتحان کنید.
اگر ابزارها را روی پلتفرمی غیر از لینوکس کامپایل کنید، ممکن است همه ابزارها کار نکنند. به عنوان مثال، Mjpegtools روی سیستمعامل OS/X قابلیت V4L (video4linux) را نخواهد داشت.
هرگز هنگام اجرای lavrec سعی نکنید برنامه تلویزیون را متوقف یا راهاندازی کنید. اگر برنامه تلویزیون را شروع یا متوقف کنید، lavrec ضبط را متوقف میکند یا ممکن است رایانه شما به اصطلاح قفل (freeze) شود. این مشکل مربوط به v4l (video4linux) است.
این مشکل با v4l2 حل شده است. اگر از v4l2 استفاده کنید، میتوانید ویدئو را ضبط کرده و هر زمان که خواستید برنامه تلویزیون را متوقف و مجدداً راهاندازی کنید. اما در حال حاضر (۷ ژانویه ۲۰۰۳) v4l2 فقط برای کارتهای مبتنی بر zoran (مانند BUZ، DC10، DC10+، LML33) پشتیبانی میشود، به شرطی که از درایور CVS از mjpeg.sf.net با تگ ZORAN_VIDEODEV_2 استفاده کنید. و این درایور فقط با هسته 2.4.20 و هسته توسعه 2.5.* کار میکند.
یک نکته پایانی درباره دادههایی که پیش از شروع کار به دست میآورید:
Audio: ( Samplerate * Channels * Bitsize ) / (8 * 1024) CD Quality:(44100 Samples/sec * 2 Chanels * 16 Bit) / (8 * 1024)=172,2 kB/sec The 8 * 1024 convert the value from bit/sec to kByte/sec Video: (width * height * framerate * quality ) / (200 * 1024) PAL HALF Size : (352 * 288 * 25 * 80) / (200 * 1024) = 990 kB/sec PAL FULL size : (720 * 576 * 25 * 80) / (200 * 1024) = 4050 kB/sec NTSC HALF size: (352 * 240 * 30 * 80) / (200 * 1024) = 990 kB/sec NTSC FULL size: (720 * 480 * 30 * 80) / (200 * 1024) = 4050 kB/sec
مقدار 1024 بایتها را به کیلوبایت تبدیل میکند. همه کارتها نمیتوانند در اندازههای ذکرشده ضبط کنند. به عنوان مثال، Buz و Marvel G400 فقط میتوانند هنگام استفاده از -d 1 با اندازه 720x576 ضبط کنند؛ کارت DC10 هنگام استفاده از -d 2 با اندازه 384x288 ضبط میکند.
وقتی نرخ داده صدا و تصویر را با هم جمع میکنید، این مقداری است که دیسک سخت شما باید بتواند به طور پیوسته روی جریان بنویسد؛ در غیر این صورت فریمهای از دست رفته (lost frames) خواهید داشت.
اگر میخواهید با گزینه --mjpeg-buffer-size کار کنید، به یاد داشته باشید که این مقدار باید حداقل آنقدر بزرگ باشد که یک فریم در آن جا بگیرد. اندازه یک فریم برابر است با: (width * height * quality ) / (200 * 1024) = kB. اگر بافر خیلی کوچک باشد، محاسبات نرخ دیگر همخوانی نخواهد داشت و سرریز بافر (buffer overflow) رخ میدهد. حداکثر مقدار 512kB است.
نحوه کار ویدئو و تفاوت بین انواع ویدئو در اینجا توضیح داده شده است:
در آنجا همچنین نحوه ایجاد تصاویر ثابت (Still Images) برای VCD/SVCD را خواهید یافت.
توضیحات مناسبی از DV (Digital Video) را میتوان در اینجا یافت:
برخی کتابهای مفید (Some useful books)
کتابهای نوشتهشده به زبان انگلیسی:
کتاب Digital Video and HDTV نوشته Charles Poyton (شابک: 1-55860-792-7)
کتاب Digital Video Compression نوشته Peter Symes (شابک: 0-07-142487-3)
کتاب Video Demystified نوشته Keith Jack (شابک: 1-878707-56-6)
کتابهای نوشتهشده به زبان آلمانی:
کتاب Fernsehtechnik نوشته Rudolf Maeusl (شابک: 3-7785-2374-0)
کتاب Professionelle Videotechnik - analoge und digitale Grundlagen نوشته U. Schmidt (شابک: 3-540-43974-9)
کتاب Digitale Film- und Videotechnik نوشته U. Schmidt (شابک: 3-446-21827-0)
اگر کتاب بسیار خوب دیگری در این زمینه میشناسید، به ما اطلاع دهید!
ضبط ویدئوها
مثالهای lavrec (lavrec examples)
ضبط با lavrec به این صورت است:
> lavrec -f a -i P -d 2 record.avi
اکنون باید ضبط شروع شود،
استفاده از AVI به عنوان فرمت خروجی،
استفاده از ورودی SVHS-In با فرمت PAL به عنوان منبع ورودی،
اندازه تصاویر نصف اندازه کامل (352x288) باشد،
نام فایل ایجادشده.
ضبط با فشردن کلیدهای Ctrl-C (در صفحهکلیدهای آلمانی: Strg-C) پایان مییابد. گاهی اوقات ممکن است استفاده از -f A به جای -f a لازم باشد.
مثال دیگر:
> lavrec -f q -i n -d 1 -q 80 -s -l 80 -R l -U record.avi
اکنون باید ضبط شروع شود،
استفاده از Quicktime به عنوان فرمت خروجی،
استفاده از ورودی Composite-In با فرمت NTSC،
ضبط تصاویر با اندازه کامل (640x480)،
تنظیم کیفیت تصویر ضبطشده روی 80%،
استفاده از حالت استریو (پیشفرض مونو است)،
تنظیم سطح صدای ضبط روی 80% حداکثر در حین ضبط،
تنظیم منبع ضبط روی Line-In،
با این گزینه lavrec به جای mmap از read برای ضبط استفاده میکند؛ این گزینه در صورتی لازم است که کارت صدای شما از mmap برای ضبط پشتیبانی نکند.
تنظیم میکسر برای هر کارت صدایی کار نمیکند. اگر با ۲ تنظیم مختلف ضبط کردید و صدای هر دو ضبط به یک اندازه بلند بود، باید میکسر را با یک برنامه میکسر تنظیم کنید. پس از آن، هنگام ضبط با lavrec باید از گزینه -l -1 استفاده نمایید.
اندازه تصویر به کارتی که استفاده میکنید بستگی دارد. در اندازه کامل (-d 1) این اندازههای تصویر را دریافت میکنید: برای BUZ و LML33 برابر 720x576، برای DC10 و DC30 برابر 768x576.
مثال دیگر:
> lavrec -w -f a -i S -d 2 -l -1 record%02d.avi
باید ضبط شروع شود،
منتظر تایید کاربر برای شروع میماند (فشردن کلید Enter)،
استفاده از AVI به عنوان فرمت خروجی،
استفاده از ورودی SECAM SVHS-Input (ضبط کامپوزیت SECAM نیز با -i s امکانپذیر است)،
اندازه تصاویر نصف اندازه کامل باشد،
به تنظیمات میکسر دست نزند،
در اینجا lavrec اولین فایل را با نام record00.avi ایجاد میکند؛ پس از اینکه حجم فایل به 1.6GB رسید (پس از حدود ۲۰ دقیقه ضبط)، دنباله جدیدی با نام record01.avi و به همین ترتیب آغاز میشود تا زمانی که ضبط متوقف شود یا دیسک پر گردد. با انتشار نسخه 1.9.0، مجموعه mjpegtools قادر به مدیریت فایلهای AVI بزرگتر از 2GB است. بنابراین این گزینه برای سازگاری وجود دارد.
مثال دیگر:
> lavrec -f a -i t -q 80 -d 2 -C europe-west:SE20 test.avi
اکنون باید ضبط شروع شود،
استفاده از AVI به عنوان فرمت خروجی،
استفاده از ورودی تیونر (tuner)،
تنظیم کیفیت تصویر ضبطشده روی 80%،
اندازه تصاویر نصف اندازه کامل (352x288) باشد،
انتخاب کانالهای تلویزیونی؛ گزینههای مربوطه یعنی -it و -iT (منبع ویدئو: تیونر تلویزیون) در حال حاضر میتوانند روی Marvel G200/G400 و Matrox Millenium G200/G400 با افزونه Rainbow Runner استفاده شوند (پشتیبانی از BTTV در دست توسعه است). برای اطلاعات بیشتر در مورد نحوه فعالسازی بخشهای تیونر تلویزیون این کارتها، به پروژه Marvel/Linux مراجعه کنید:
آخرین مثال:
> lavrec -f a -i p -g 352x288 -q 80 -s -l 70 -R l --software-encoding test03.avi
دو گزینه جدید عبارتند از -g 352x288 که اندازه ویدئوی ضبطشده را تعیین میکند، و گزینه --software-encoding که کدگذاری نرمافزاری تصاویر ضبطشده را فعال میسازد. با این گزینه میتوانید از کارتهای مبتنی بر bttv نیز ضبط کنید. بار پردازنده در این حالت بالاست. این گزینه فقط برای کارتهای عمومی video4linux (مانند کارتهای مبتنی بر brooktree-848/878) کار میکند و برای کارتهای مبتنی بر zoran کارایی ندارد.
سایر نکات ضبط (Other recording hints)
تمامی ابزارهای lavtools توصیف فایلی مانند file*.avi را میپذیرند؛ بنابراین مجبور نیستید نام تکتک فایلها را ذکر کنید، اگرچه این امکان نیز وجود دارد.
نکته: گزینههای بیشتر در صفحه راهنما (man-page) توضیح داده شدهاند، اما با همین موارد باید بتوانید کار را شروع کنید.
در اینجا نکاتی برای تنظیمات معقول آورده شده است. برای ضبط با -d 2 کیفیت را روی 80% یا بیشتر قرار دهید. در وضوح کامل حتی مقدار 40% از نظر بصری ”عالی” به نظر میرسد. حالت -d 2 در حال حاضر بسیار بهتر از ویدئوی VHS است (*خیلی* بهتر!). برای کارت Marvel نباید در هنگام ضبط با اندازه کامل (-d 1) کیفیت را بالاتر از 50 تنظیم کنید. اگر از تنظیمات بالاتر (-q 60) استفاده کنید، احتمال بروز مشکل بیشتر خواهد بود و تنظیمات بالاتر منجر به افت فریم (framedrop) میشود. اگر قصد ایجاد VCD دارید، ضبط با وضوح کامل فایده چندانی ندارد زیرا در هر صورت بعداً باید وضوح را به -d 2 کاهش دهید.
میتوانید در اندازههایی غیر از مقادیر مشخص -d 1/2/4 نیز ضبط کنید. میتوانید از ترکیبهایی استفاده کنید که در آنها اندازه افقی نصف و اندازه عمودی کامل است: -d 21. این حالت برای NTSC با اندازه 352x480 ضبط میکند. این مورد زمانی کمک میکند که بخواهید SVCD بسازید؛ کشیدن ۳۵۲ پیکسل به ۴۸۰ به اندازه استفاده از ترکیب دیگر یعنی -d 12 برای چشم محسوس نیست. در ترکیب -d 12 که وضوح افقی کامل و وضوح عمودی نصف است، اندازه در NTSC برابر 720x288 خواهد بود.
اطلاعات خروجی متداول lavrec در حین ضبط (Typical lavrec output)
0.06.14:22 int: 00040 lst:0 ins:0 del:0 ae:0 td1=0.014 td2=0.029
بخش اول زمان ضبط lavrec را نشان میدهد. int: فاصله زمانی بین دو فریم است. lst: تعداد فریمهای از دست رفته (lost frames). ins و del: تعداد فریمهای درجشده و حذفشده برای اصلاح همگامسازی (sync). ae: تعداد خطاهای صوتی. td1 و td2 اختلاف زمانی صدا و تصویر هستند.
(int) فاصله فریمها (frame interval): باید حدود ۳۳ (برای NTSC) یا ۴۰ (برای PAL/SECAM) باشد. اگر خیلی متفاوت باشد، احتمالاً ضبط بدی خواهید داشت و/یا فریمهای از دست رفته زیادی ایجاد میشود.
(lst) فریمهای از دست رفته (lost frames): نامطلوب هستند و نشان میدهند چیزی در حین ضبط به خوبی کار نمیکند (دیسک سخت بیش از حد کند، مصرف CPU بیش از حد بالا و...). سعی کنید با کاهش وضوح (decimation بیشتر) و احتمالاً کیفیت پایینتر ضبط کنید.
(ins, del) فریمهای درجشده یا حذفشده: وجود برخی از آنها طبیعی است → همگامسازی. اگر فریمهای از دست رفته و درجشده زیادی دارید، بار کاری بیش از حدی از سیستم خود میکشید. از گزینههای سبکتر استفاده کنید یا کارت صدای دیگری را امتحان نمایید.
(ae) خطاهای صوتی (audio errors): هرگز خوب نیستند. همیشه باید 0 باشد.
(td1, td2) اختلاف زمانی (time difference): همیشه حول و حوش 0 شناور است، مگر اینکه اصلاح همگامسازی غیرفعال شده باشد (--synchronization!=2 که ۲ پیشفرض است).
نکاتی درباره ترتیب میدانهای اینترلیس (Interlace field order)
ابتدا، نادرست بودن ترتیب میدانهای اینترلیس (interlace field order) به چه معناست؟
زنجیره پردازش تصویر mjpegtools فریممحور است. از آنجا که ماده اولیه ویدئویی ضبط میشود، هر فریم شامل یک میدان بالایی (top field - خطوط ۰، ۲، ۴ و به همین ترتیب) و یک میدان پایینی (bottom field - خطوط ۱، ۳، ۵ و به همین ترتیب) است.
سه اتفاق نامطلوب ممکن است برای میدانها رخ دهد:
این مسئله واقعاً فقط برای فیلمهای سینمایی در ویدئوی PAL پیش میآید که در آن هر فریم فیلم به عنوان یک جفت میدان ارسال میشود. این میدانها میتوانند با میدان بالایی یا پایینی اول ارسال شوند و متأسفانه همیشه یکسان نیست، هرچند به نظر میرسد میدان پایینی اول رایجتر است. اگر با ترتیب میدان اشتباه ضبط کنید (شروع ضبط هر فریم به جای میدان بالایی با میدان پایینی باشد یا بالعکس)، فریمهای فیلم *بین* فریمهای جریان تقسیم میشوند. هنگام پخش روی تلویزیون که هر میدان به تنهایی نمایش داده میشود، این موضوع مشکلی ایجاد نمیکند؛ دنباله میدانهای پخششده دقیقاً همان دنباله میدانهای پخششده سراسری است. متأسفانه، هنگام پخش روی مانیتور کامپیوتر که هر دو میدان یک فریم به طور همزمان ظاهر میشوند، تصویر *بسیار بد* به نظر میرسد، زیرا هر فریم در عمل دو لحظه را با فاصله زمانی ۱/۲۵ ثانیه ترکیب میکند.
دو میدان ممکن است به نحوی جابهجا شوند؛ به طوری که میدان بالا به عنوان میدان پایین و میدان پایین به عنوان میدان بالا در نظر گرفته شود. نتیجه این امر لرزش شدید (juddering) و خطخطی شدن تصویر (”slicing”) است. این مشکل گاهی به دلیل اشکالات سختافزاری در کارت ضبط رخ میدهد.
در جایی از مراحل ضبط یا پردازش، ممکن است *ترتیب* زمانی دو میدان در هر فریم به نحوی اشتباه برچسبگذاری شود. این وضعیت نامطلوب است زیرا به این معناست که هنگام پخش نهایی، میدانی که تصویر آن در زمان زودتری نمونهبرداری شده است، بعد از میدانی که دیرتر نمونهبرداری شده نمایش مییابد. نتیجه این موضوع اثرات لرزشی عجیب (”juddering”) خواهد بود.
چگونه میتوانم تشخیص دهم که کدامیک از این مشکلات را دارم؟
تشخیص این موضوع میتواند دشوار باشد. اگر در حین پخش با تصاویر دارای پرش و لرزش مواجه شدید، یک بخش کوتاه را با ترتیب معکوس اجباری فیلدها کدگذاری کنید (به ادامه مراجعه کنید). اگر وضعیت بهبود یافت، متوجه خواهید شد که مشکل چه بوده و راهحل چیست!
دو میدان ممکن است به نحوی جابهجا شوند به طوری که میدان بالا به عنوان پایین و میدان پایین به عنوان بالا در نظر گرفته شود. نتیجه این امر لرزش و چندتکه شدن تصویر است. این موضوع گاهی به دلیل اشکالات سختافزاری در کارت ضبط پیش میآید. این مشکل به این شکل دیده میشود:
مشکل اینترلیس (Interlacing problem)
در جایی از مراحل ضبط/پردازش ممکن است *ترتیب* زمانی دو میدان در هر فریم اشتباه برچسبگذاری شود. این موضوع خوب نیست زیرا به این معناست که هنگام پخش نهایی، میدانی که زودتر نمونهبرداری شده بعد از میدانی که دیرتر نمونهبرداری شده ظاهر میشود. نتیجه آن جلوههای لرزشی نامطلوب خواهد بود.
اگر از glav یا lavplay استفاده میکنید، حتماً از گزینه -F/--flicker نیز استفاده کنید. این گزینه برخی پردازشها را که تصویر را بهبود میدهند غیرفعال میکند.
اگر میخواهید ویدئو را بررسی کنید، میتوانید از yuvplay نیز استفاده نمایید:
> lav2yuv │ ... │ yuvplay
اگر مشکلی در ترتیب فیلدها وجود داشته باشد، باید آن را با yuvplay مشاهده کنید.
چگونه میتوانید آن را رفع کنید؟
برای رفع این مشکل، میدانها باید در طول فریمها جابهجا (”shifted”) شوند. از گزینه -T BOTT_FORWARD/TOP_FORWARD در yuvcorrect برای تغییر نحوه تخصیص میدانها به فریمها استفاده کنید. میتوانید ترتیب فعلی فیلدها را برای یک فایل MJPEG با مشاهده چند خط اول خروجی خطایابی (debug) پیدا کنید: > lav2yuv -v 2 the_mjpeg_file > /dev/null یا دوباره با تعویض -f a به جای -F A یا بالعکس ضبط کنید.
این مشکل نیز خیلی بد نیست. از ابزاری استفاده کنید که به سادگی فیلدهای بالا و پایین را برای بار دوم جابهجا کند. yuvcorrect میتواند این کار را با استفاده از -T LINE_SWITCH انجام دهد.
رفع این یکی آسان است. یا به یک ابزار در مسیر پردازش بگویید فیلدها را دوباره برچسبگذاری کند یا به پخشکننده بگویید با ترتیب جابهجا شده پخش کند (مورد دوم را میتوان به طور غیرمستقیم با تعیین معکوس کردن فلگ (-z b│t) در mpeg2enc هنگام کدگذاری انجام داد که به رمزگشا میگوید از چه ترتیبی برای میدانها استفاده کند).
برای تعیین دقیق اینکه چه نوع مشکل اینترلیسی دارید، باید چند فریم از جریان ضبطشده را استخراج کرده و به آنها نگاه کنید:
> mkdir pnm > lav2yuv -f 40 video.avi │ y4mtoppm │ pnmsplit - pnm/image%d.pnm > rm pnm/image?.pnm > cd pnm > xv
ابتدا دایرکتوری ایجاد میکنیم که تصاویر را در آن ذخیره کنیم. دستور lav2yuv -f 40 فقط ۴۰ فریم اول را روی stdout مینویسد. برنامه y4mtoppm فریمها را به تصاویر pnm تبدیل میکند و pnmsplit تصویر را به دو فریم در تصویر به دو تصویر جداگانه تقسیم میکند. سپس ۱۰ تصویر اول را حذف میکنیم زیرا pnmsplit از شمارهگذاری %0xd پشتیبانی نمیکند. بدون صفر در ابتدای شماره، فایلها با ترتیب اشتباه مرتب میشوند که منجر به پخش گیجکننده خواهد شد.
از برنامه گرافیکی مورد علاقه خود (مثلاً xv) برای مشاهده تصاویر استفاده کنید. از آنجا که هر تصویر فقط شامل یک میدان از دو میدان است، آنها به صورت کشیده در جهت عمودی ظاهر میشوند. اگر به تصاویر نگاه کنید، باید حرکت آهسته فیلم به جلو را ببینید.
اگر یک فیلم سینمایی دارید، همیشه باید ۲ تصویر را ببینید که تقریباً یکسان هستند (زیرا فریم فیلم برای پخش به دو میدان تقسیم شده است) که پشت سر هم قرار دارند. اگر هنگام متوقف کردن فیلم اثرات شانهای (comb effects) داشته باشید، میتوانید این موضوع را به راحتی مشاهده کنید زیرا هر دو میدان همزمان نمایش داده میشوند. دو تصویری که به هم تعلق دارند باید یک شماره زوج و شماره فرد بعدی باشند. بنابراین اگر به تصاویر نگاه کنید: ۴ و ۵ تقریباً یکسان هستند، ۵ و ۶ متفاوتند (دارای حرکت هستند)، ۶ و ۷ یکسان هستند، ۷ و ۸ متفاوتند و...
برای رفع این مشکل باید از گزینه -T BOTT_FORWARD یا TOP_FORWARD در yuvcorrect استفاده کنید. همچنین ممکن است این مشکل را داشته باشید که ترتیب میدانها (بالا/پایین) همچنان اشتباه باشد. ممکن است لازم باشد یک بار دیگر از yuvcorrect با -M LINE_SWITCH استفاده کنید یا از گزینه -z (b│t) در mpeg2enc استفاده نمایید.
برای اینکه ببینید درست حدس زدهاید یا خیر، فریمها را دوباره استخراج کنید و با استفاده از yuvcorrect ترتیب آنها را تغییر دهید:
> lav2yuv -f 40 video.avi │ yuvcorrect -T OPTION │ y4mtoppm │ pnmsplit - pnm/image%d.pnm
که در آن ”OPTION” همان گزینهای است که فکر میکنید مشکل را حل میکند. این مورد برای محتوای تبدیلشده از فیلم سینمایی است. محتوایی که مستقیماً برای تلویزیون تولید شده است در زیر بررسی میشود.
فیلمهای سینمایی NTSC چطور؟
فیلمهای سینمایی در NTSC با استفاده از روش پولداون ”3:2” پخش میشوند؛ به این معنی که نیمی از فریمهای ضبطشده شامل میدانهایی از ۱ فریم فیلم و نیمی دیگر شامل میدانهایی از ۲ فریم هستند. برای بازگرداندن این اثر جهت کدگذاری کارآمد MPEG، باید از yuvkineco استفاده کنید.
اگر منبع اینترلیسشده مانند دوربین تلویزیونی دارید، فریمی دارید که از دو میدان تشکیل شده که در نقاط زمانی متفاوتی ضبط شدهاند. تشخیص مشکل در اینجا سختتر است. شما باید چیزی را پیدا کنید که به صورت افقی از چپ به راست حرکت میکند. وقتی میدانها را استخراج میکنید، آن شیء باید در گامهای کوچک از چپ به راست حرکت کند، نه یک گام بزرگ به جلو، یک گام کوچک به عقب، گام بزرگ به جلو، گام کوچک به عقب... برای اصلاح مشکل باید از همان گزینههای ذکرشده در بالا استفاده کنید.
انتظار نداشته باشید که ترتیب میدانها همیشه یکسان باشد (میدان بالایی یا پایینی اول). ممکن است بین کانالها، بین فیلمها و حتی درون یک فیلم تغییر کند. اگر به طور مداوم تغییر میکند، ممکن است مجبور شوید با mpeg2enc با گزینه -I 1 یا حتی -I 2 کدگذاری کنید.
شما فقط در صورتی ممکن است این مشکلات را داشته باشید که با اندازه کامل ضبط کنید!
ایجاد ویدئوها از منابع دیگر
در اینجا نکات و توضیحاتی درباره نحوه ایجاد ویدئوها از سایر منابع مانند تصاویر و سایر انواع ویدئو آورده شده است.
همچنین ممکن است مایل باشید نگاهی به بخش تبدیل فرمت جریانهای MPEG-2 موجود (Transcoding of existing MPEG-2) بیندازید.
ساخت ویدئو از تصاویر (Creating videos from images)
میتوانید از jpeg2yuv برای ایجاد یک جریان yuv از تصاویر مجزای JPEG استفاده کنید. این جریان به خروجی استاندارد (stdout) فرستاده میشود، بنابراین میتوان آن را درون یک فایل ذخیره کرد، مستقیماً با استفاده از mpeg2enc به یک ویدئوی mpeg کدگذاری نمود یا برای هر کار دیگری به کار برد.
ذخیره یک جریان yuv میتواند به این صورت انجام شود:
> jpeg2yuv -f 25 -I p -j image%05d.jpg > result.yuv
فایل result.yuv حاوی دادههای ویدیویی yuv با ۲۵ فریم بر ثانیه (FPS) ایجاد میشود. گزینه -f برای تنظیم نرخ فریم استفاده میشود. توجه داشته باشید که image%05d.jpg به این معنی است که فایلهای jpeg با نامهای image00000.jpg، image00001.jpg و غیره نامگذاری شدهاند (05 به معنی پنج رقم، 04 به معنی چهار رقم و غیره است). گزینه -I p برای تعیین حالت اینترلیس (interlacing) لازم است. باید بررسی کنید چه نوع حالتی دارید. اگر اینترلیس ندارید، کافی است p را برای پروگرسیو (progressive) انتخاب کنید.
اگر میخواهید مستقیماً از تصاویر jpeg یک ویدئوی mpeg را بدون ذخیره یک فایل ویدئویی مجزا کدگذاری کنید، دستور زیر را بنویسید:
> jpeg2yuv -f 25 -I p -j image%05d.jpg │ mpeg2enc -o mpegfile.m1v
همان کار بالا را انجام میدهد اما به جای ویدئوی yuv، یک ویدئوی mpeg ذخیره میکند. برای جزئیات نحوه استفاده از mpeg2enc، بخش mpeg2enc را ببینید.
همچنین میتوانید از yuvscaler میان jpeg2yuv و mpeg2enc استفاده کنید. اگر میخواهید از تصاویر منبع خود یک SVCD بسازید:
> jpeg2yuv -f 25 -I p -j image%05d.jpg │ yuvscaler -O SVCD │ mpeg2enc -f 4 -o video.m2v
میتوانید از گزینه -b برای تنظیم شماره تصویری که کار از آن شروع میشود استفاده کنید. تعداد تصاویری که باید پردازش شوند را میتوان با -n مشخص کرد. برای مثال، اگر تصویر اول شما به جای image00.jpg فایل image01.jpg است و فقط میخواهید ۶۰ تصویر پردازش شوند، دستور زیر را بنویسید:
>jpeg2yuv -b 1 -f 25 -I p -n 60 -j image*.jpg │ yuv2lav -o stream_without_sound.avi
سپس افزودن صدا به جریان:
> lavaddwav stream_without_sound.avi sound.wav stream_with_sound.avi
برای ورودی ppm ابزار ppmtoy4m وجود دارد. یک صفحه راهنما برای ppmtoy4m موجود است که برای اطلاعات بیشتر باید به آن مراجعه شود.
برای ساخت یک ویدئوی mpeg این دستور را امتحان کنید:
>cat *.ppm │ ppmtoy4m -o 75 -n 60 -F 25:1 │ mpeg2enc -o output.m1v
هر فایل *.ppm را به ppmtoy4m پایپ (cat) کنید. در آنجا ۷۵ فریم (تصویر) نخست نادیده گرفته میشوند و ۶۰ فریم بعدی توسط mpeg2enc در output.m1v کدگذاری میگردند. میتوانید آن را بدون گزینههای -o و -n اجرا کنید. گزینه -F نرخ فریم را تنظیم میکند؛ مقدار پیشفرض NTSC (30000:1001) است و برای PAL باید از -F 25:1 استفاده کنید.
اگر مبدلی به ppm وجود داشته باشد، فرمتهای دیگر تصویر نیز قابل استفاده هستند.
>ls *.tga │ xargs -n1 tgatoppm │ ppmtoy4m │ yuvplay
فهرستی از نامفایلها (ls *.tga) به xargs داده میشود که tgatoppm را با یک آرگومان در هر فراخوانی (-n 1) اجرا کرده و خروجی را به ppmtoy4m میفرستد. این بار ویدئو فقط روی صفحه نمایش داده میشود. دستور xargs فقط زمانی لازم است که مبدل (tgatoppm) تنها بتواند روی یک تصویر در هر بار کار کند.
اگر میخواهید از ابزار convert متعلق به ImageMagick (یک چاقوی سوئیسی همهکاره) استفاده کنید:
>convert *.gif ppm:- │ ppmtoy4m │ yuvplay
این یعنی همه تصاویر '.jpg' در دایرکتوری را بگیرید، به فرمت PPM تبدیل کنید، به stdout پایپ کنید، سپس به ppmtoy4m برای تبدیل به y4m بفرستید ....
رمزگشایی جریانها با mplayer (Decoding streams with mplayer)
رمزگشایی جریانها با mplayer روش مناسبی برای تبدیل هر ویدیویی است که mplayer قادر به پخش آن است به قالبی که بتوانید آن را با mjpegtools ویرایش کرده یا به mpeg کدگذاری کنید. این روش با mplayer 1.0rc2 آزمایش شده و باید با نسخههای جدیدتر نیز کار کند.
>mkfifo stream.yuv
>cat stream.yuv │ yuv2lav -o mjpeg_wo.avi &
>mplayer -nosound -noframedrop -vo yuv4mpeg anyfile.mpg
>mplayer -vo null -ao pcm:file=anyfile.wav anyfile.mpg
اکنون شما نمونهای از یک AVI با کدگذاری mjpeg و بدون صدا دارید. صدا در فایل anyfile.wav قرار خواهد گرفت. میتوانید انتخاب کنید که آیا میخواهید صدا را با lavaddwav به AVI اضافه کنید و فایل را پیش از کدگذاری ویرایش نمایید.
همچنین میتوانید به جای yuv2lav از mpeg2enc یا هر ابزار دیگری از mjpegtools استفاده کنید، بنابراین دستور شما میتواند به این شکل نیز باشد:
> cat stream.yuv │ yuvdenoise │ yuvscaler -O SVCD │ mpeg2enc -f 4 -o video_svcd.m2v
فایل wav را برای کدگذاری به صدای MP2 به mp2enc پایپ (cat) کنید. گزینه -vo yuv4mpeg با سایر انواع ورودیهای ذکر شده در مستندات mplayer به خوبی کار میکند.
رمزگشایی جریانهای MPEG-2 با mpeg2dec (Decoding MPEG-2 streams with mpeg2dec)
میتوانید جریانهای mpeg2 را با نسخه پچشده mpeg2dec که جریانهای yuv ایجاد میکند رمزگشایی کنید. میتوانید آن را به هر برنامه دیگر mjpegtools پایپ کنید. یا میتوانید از یک نسخه mpeg2dec مستقیماً از پروژه libmpeg2 استفاده کرده و از حالت خروجی pgmpipe بهره ببرید. با برنامه pgmtoy4m میتوانید آن خروجی pgm را دوباره به yuv تبدیل کنید.
اگر از خود میپرسید چرا یک نسخه پچشده و pgmtoy4m وجود دارد، پاسخ این است که پچ مربوط به خروجی yuv چندین بار برای توسعهدهندگان libmpeg2 فرستاده شد اما هرگز اضافه نشد. اکنون دو راه برای دور زدن این مشکل داریم. رمزگشایی به این صورت است:
> mpeg2dec -s -o pgmpipe ANYTS.VOB │ pgmtoy4m -i t -a 10:11 -r 30000:1001 │ mpeg2enc -f 8 newvideo.m2v
میتوانید صدا را همانطور که در بخش تغییر کدک فایلهای موجود MPEG-2 (Transcoding of existing MPEG-2) توضیح داده شده رمزگشایی کنید.
سایر موارد قابل توجه (Other things to know)
اگر جریانهای ترنسپورت (Transport streams) از کارت DVB یا گیرنده ماهوارهای خود دارید، ممکن است بخواهید آنها را دیمالتیپارکس یا برش دهید. یک ابزار عالی برای این کار Project X است که از نشانیهای زیر در دسترس است:
میتوانید پس از آن جریانها را همانطور که با هر فیلم mpeg یا صدا و تصویر دیمالتیپارکسشده انجام میدهید، پردازش کنید. بنابراین بخش تغییر کدک فایلهای موجود MPEG-2 (Transcoding of existing MPEG-2) در این سند برایتان جالب خواهد بود.
بررسی موفقیتآمیز بودن ضبط (Checking if recording was successful)
میتوانید از lavplay یا glav استفاده کنید. مهم: هرگز سعی نکنید xawtv و lavplay یا glav را با پخش سختافزاری همزمان اجرا کنید؛ کار نخواهد کرد. برای پخش نرمافزاری بدون مشکل کار میکند.
>lavplay -p S record.avi
باید ویدیوی ضبطشده را ببینید و صدا را بشنوید. اما رمزگشایی ویدئو توسط CPU انجام میشود که بار سنگینی روی سیستم خواهد گذاشت. مزیت این روش این است که نیازی به xawtv ندارید.
روش بهتر:
>lavplay -p H record.avi
ویدئو توسط سختافزار رمزگشایی و پخش میشود. بار سیستم بسیار کم است. این کار ویدئو را به جای رمزگشایی نرمافزاری، با استفاده از سختافزار روی صفحه نمایش پخش میکند.
همچنین میتوانید این دستور را امتحان کنید:
> lavplay -p C record.avi
که ویدئو را با استفاده از سختافزار اما روی خروجی ویدیویی کارت پخش خواهد کرد.
> glav record.avi
همان کار lavplay را انجام میدهد اما یک رابط کاربری گرافیکی (GUI) زیبا در اختیارتان میگذارد. گزینههای glav و lavplay تقریباً یکسان هستند. با استفاده از هیچ گزینهای، پخش نرمافزاری (SW) به کار گرفته میشود.
با استفاده از پخش سختافزاری، یک سیگنال برای Composite و SVHS OUT تولید میشود تا بتوانید فیلم را روی تلویزیون خود تماشا کنید.
> lav2yuv test.eli │ yuvplay
روش دیگری برای دریافت ویدئو بدون صدا است. میتوانید از yuvplay یک بار در دستور کدگذاری استفاده کنید. وقتی از yuvplay در دستور کدگذاری استفاده میکنید، تغییرات ایجاد شده توسط فیلترها و مقیاسبندی را میبینید. همچنین میتوانید از آن برای دیباگ با حرکت آهسته (slow-motion) استفاده کنید.
نکته: پس از بارگذاری درایورها، باید xawtv را راهاندازی کنید تا برخی مواردی را که lavplay و glav تنظیم نمیکنند آماده سازد، زیرا این موارد برای پخش سختافزاری (HW-Playback) نیاز هستند. بستن xawtv را فراموش نکنید!!
نکته ۲: سعی نکنید glav و lavplay را به پسزمینه بفرستید، به درستی کار نخواهد کرد!!!
نکته ۳: پخش SECAM در حال حاضر (۱۲.۳.۲۰۰۱) فقط به صورت سیاه و سفید (monochrome) است اما ضبط و کدگذاری به درستی انجام میشود.
نکته ۴: کابلهای نامرغوب ممکن است کیفیت تصویر را کاهش دهند. معمولاً نمیتوانید این موضوع را ببینید اما هنگامی که متنی وجود دارد ممکن است متوجه سایه کوچکی شوید. وقتی این را دیدید باید کابل را تعویض کنید.
به زودی: ابزاری وجود دارد که بازکدگذاری ویدئوها را بسیار ساده میکند: Linux Studio.
ویرایش ویدئو
ویرایش با glav (Edit with glav)
بیشتر کارها به راحتی توسط glav قابل انجام است؛ مانند حذف بخشهایی از ویدئو، برش، جایگذاری و کپی کردن قسمتهایی از ویدئوها.
توضیحات دکمههای glav:
تغییرات باید ذخیره شوند زیرا glav ویدئو را به صورت مخرب ویرایش نمیکند. این بدان معناست که ویدیوی اصلی دستنخورده باقی میماند و تغییرات در یک فایل اضافی «فهرست ویرایش» (Edit List) که با یک ویرایشگر متنی قابل خواندن است نگهداری میشوند. این فایلها میتوانند به عنوان ورودی برای سایر برنامههای lavtools مانند lav2wav، lav2yuv و lavtrans استفاده شوند.
اگر میخواهید ابتدا و انتهای جریان را برش دهید، ابتدا و انتها را علامتگذاری کرده و از دکمه «save select» استفاده کنید. سپس فایل لیست ویرایش به عنوان ورودی برای lavtools استفاده میشود. اگر میخواهید یک ویدیوی ضبطشده را به چند بخش کوچکتر تقسیم کنید، به سادگی بخشها را انتخاب کرده و سپس هر بخش را در یک فایل لیست جداگانه ذخیره نمایید.
میتوانید تمام تغییرات ویدئو و صدا را هماکنون مشاهده کنید و نیازی به محاسبه مجدد چیزی ندارید.
اگر میخواهید یک نسخه «مخرب» (اعمال نهایی) از ویدیوی ویرایششده خود دریافت کنید، دستور زیر را به کار ببرید:
> lavtrans -o short_version.avi -f a editlist.eli
نام خروجی را مشخص میکند
فرمت خروجی را مشخص میکند (برای مثال AVI)
فایل لیستی است که تغییرات در آن توصیف شدهاند. شما این فایل لیست را با دکمههای «save all» یا «save select» در glav ایجاد میکنید.
یکپارچهسازی ویدئوها (Unify videos)
> lavtrans -o stream.qt -f q record_1.avi record_2.avi ... record_n.avi
نام فایل خروجی را مشخص میکند
فرمت خروجی را مشخص میکند؛ در این مورد quicktime
این معمولاً مورد نیاز نیست. به یاد داشته باشید که محدودیت حجم فایل ۲ گیگابایتی روی سیستمهای ۳۲ بیتی با glibc قدیمیتر وجود دارد. معمولاً این روزها مشکلی ایجاد نمیکند.
جداسازی صدا (Separate sound)
> lavtrans -o sound.wav -f w stream.avi
یک فایل wav حاوی صدای stream.avi ایجاد میکند. در صورتی که بخواهید نویز را حذف کنید یا آن را به فرمت صوتی دیگری تبدیل نمایید ممکن است مورد نیاز باشد.
روش دیگری برای جداسازی صدا:
> lav2wav editlist.eli >sound.wav
جداسازی تصاویر (Separate images)
>mkdir jpg; lavtrans -o jpg/image%05d.jpg -f i stream.avi
ابتدا دایرکتوری «jpg» را بسازید. سپس lavtrans از فایل stream.avi تصاویر مجزای JPG را در دایرکتوری jpg ایجاد میکند. نام فایلها به این صورت خواهد بود: image00000.jpg، image00001.jpg و غیره.
تصاویر jpg ایجاد شده حاوی کل تصویر هستند. اما اگر با اندازه کامل ضبط کرده باشید، تصاویر به صورت اینترلیس ذخیره میشوند. معمولاً برنامههای نمایش تصویر فقط فیلد اول را در فایل jpg نمایش میدهند.
اگر میخواهید تصویر را در یک فایل تک داشته باشید، میتوانید از این نسخه استفاده کنید:
> lav2yuv -f 1 stream.avi │ y4mtoppm -L >file.pnm
اگر میخواهید فیلدها را به فایلهای مجزا تفکیک کنید از این دستور استفاده نمایید:
> lav2yuv -f 5 ../stream.avi │ y4mtoppm │ pnmsplit - image%d.pnm
اگر به تصاویر نمونه نیاز دارید و نمیخواهید با ابزارهای عکسبرداری تکتصویر درگیر شوید، شاید جالب باشد.
ایجاد ترنزیشنهای فیلم (Creating movie transitions)
به لطف ابزار lavpipe نوشته فیلیپ زابل (Philipp Zabel)، اکنون میتوانیم ترنزیشنهای سادهای بین فیلمها ایجاد کنیم یا چندین لایه از فیلمها را با هم ترکیب نماییم.
فیلیپ این راهنما را در مورد نحوه ایجاد ترنزیشنها نوشته است:
بیایید این صحنه ساده را در نظر بگیریم: ما دو ویدیوی ورودی intro.avi و epilogue.mov داریم و میخواهیم با مدت زمان یک ثانیه (یعنی ۲۵ فریم برای PAL یا ۳۰ فریم برای NTSC) از intro.avi به epilogue.mov ترنزیشن ایجاد کنیم.
فایلهای intro.avi و epilogue.mov باید فرمت یکسانی داشته باشند (نرخ فریم و وضوح یکسان). در این مثال هر دو فایلهای 352x288 استاندارد PAL هستند. فایل intro.avi حاوی ۲۵۰ فریم است و طول epilogue.mov برابر با ۱۰۰۰ فریم است.
بنابراین فایل خروجی ما شامل موارد زیر خواهد بود:
۲۲۵ فریم نخست intro.avi
یک ترنزیشن ۲۵ فریمی شامل ۲۵ فریم پایانی intro.avi و ۲۵ فریم ابتدایی epilogue.mov
۹۷۵ فریم پایانی epilogue.mov
میتوانیم ۲۵ فریم پایانی intro.avi را با فراخوانی زیر به دست آوریم:
>lav2yuv -o 225 -f 25 intro.avi
گزینه -o 225 (آفست) به lav2yuv میگوید از فریم شماره ۲۲۵ شروع کند و گزینه -f 25 باعث میشود ۲۵ فریم از آنجا به بعد خروجی داده شود.
امکان دیگر (چون آفستهای منفی از انتها شمرده میشوند):
> lav2yuv -o -25 intro.avi
و ۲۵ فریم اول epilogue.mov:
> lav2yuv -f 25 epilogue.mov
گزینه -o به طور پیشفرض روی آفست صفر قرار دارد.
اما باید دو جریان را با lavpipe ترکیب کنیم. بنابراین فراخوانی به این شکل خواهد بود:
> lavpipe ”lav2yuv -o 225 -f 25 intro.avi” ”lav2yuv -f 25 epilogue.mov”
خروجی این دستور یک جریان خام yuv است که میتواند به transist.flt داده شود.
ابزار transist.flt باید از مدت زمان ترنزیشن و میزان مات بودن (opacity) جریان دوم در ابتدا و انتهای ترنزیشن مطلع شود:
- -o num
مات بودن ورودی دوم در ابتدا [0-255]
مات بودن ورودی دوم در انتها [0-255]
مدت زمان ترنزیشن بر حسب فریم
مات بودن 0 به این معنی است که جریان دوم کاملاً شفاف است (فقط جریان یک دیده میشود)، در مقدار 255 جریان دو کاملاً مات است.
در مورد ما فراخوانی صحیح (ترنزیشن از جریان ۱ به جریان ۲) به این صورت خواهد بود:
> transist.flt -o 0 -O 255 -d 25
پارامترهای -s و -n معادل پارامترهای -o و -f در lav2yuv هستند و فقط در صورتی نیاز میشوند که کسی بخواهد به هر دلیلی تنها بخشی از ترنزیشن را رندر کند. لطفاً توجه داشته باشید که این فقط روی محاسبات وزندهی تأثیر میگذارد - هیچ بخشی از ورودی واقعاً نادیده گرفته نمیشود. اگر از پارامتر پرش استفاده کنید (به عنوان مثال -s 30)، باید ۳۰ فریم اول را در lav2yuv نیز نادیده بگیرید (-o 30) تا نتیجه مورد انتظار به دست آید. اگر این را متوجه نشدید به نویسندگان ایمیل بزنید یا به سادگی -s و -n را نادیده بگیرید. کل این فرایند در نهایت خودکار خواهد شد.
اکنون میخواهیم جریان yuv را با yuv2lav فشرده کنیم:
> yuv2lav -f a -q 80 -o transition.avi
جریان yuv را از ورودی استاندارد (stdin) میخواند و یک فایل avi خروجی میدهد (-f a) با فریمهای فشردهشده jpeg با کیفیت 80.
اکنون کل دستور را برای ساخت ترنزیشن در اختیار داریم:
> lavpipe ”lav2yuv -o 225 -f 25 intro.avi” ”lav2yuv -f 25 epilogue.mov” │ transist.flt -o 0 -O 255 -d 25 │ yuv2lav -f a -q 80 -o transition.avi
ویدیوی حاصل را میتوان به صورت یک فهرست ویرایش LAV (یک فایل متنی ساده) که شامل خطوط زیر است نوشت:
LAV Edit List PAL 3 intro.avi transition.avi epilogue.mov 0 0 224 1 0 24 2 25 999
این فایل میتواند به glav یا lavplay داده شود، یا میتوانید آن را با lav2yuv به mpeg2enc پایپ کنید یا تمام اینها را با lavtrans یا lav2yuv│yuv2lav در یک فایل mjpeg یکپارچه ترکیب نمایید.
تبدیل جریان به ویدئوهای MPEG یا DIVx
ابتدا توضیحات کلی در مورد فرایند کدگذاری ارائه میشود و سپس شرح مفصلی از برخی فرمتهای خروجی پرکاربرد میآید.
اگر میخواهید با یک دستور تبدیل به ویدئوهای mpeg را انجام دهید، lav2mpeg را در دایرکتوری اسکریپتها امتحان کنید.
کدگذاری با اسکریپت lav2mpeg برای خروجی mpeg1 به این صورت است:
>lav2mpeg -a 160 -b 2110 -d 320x240 -m mpeg1 -o output.mpg file.eli
یک mpeg1 با نرخ بیت ویدیویی 2110kBit/sec و نرخ بیت صوتی 160kBit/sec
با وضوح 320x240 ایجاد خواهد کرد
یا برای تولید خروجی mpeg2:
lav2mpeg -o mpeg2 -O output.mpg file.eli
یک mpeg2 با نرخ بیت پیشفرض و با همان وضوح ورودی ایجاد خواهد کرد
با این حال، با آزمایش گزینههای مختلف و پیدا کردن مواردی که برای شما بهتر کار میکنند، نتایج بهتری حاصل میشود. این موارد در ادامه مورد بحث قرار گرفتهاند.
ساخت فیلمهای MPEG-1 با مثالهای بیشتر و جزئیات دقیقتر توضیح داده شده است زیرا بیشتر مواردی که برای MPEG-1 قابل استفاده هستند برای سایر فرمتهای خروجی نیز کار میکنند.
برای ایجاد توالیهای تصاویر ثابت (Stills) در VCD/SVCD (گزینههای -f 6 / -f 7 در mpeg2enc) باید به موارد زیر مراجعه کنید:
توالیهای تصویر ثابت برای ساخت منوها در VCD/SVCD مورد نیاز هستند. ساخت منوها در مستندات vcdimager توضیح داده شده است.
ایجاد صدا (Creating sound)
ویدئوهای MPEG-1 به فایلهای صوتی MPEG-1-Layer2 (MP2) نیاز دارند. برای ویدئوهای MPEG-2 میتوانید از MPEG-1-Layer2 و MPEG1-Layer3 (MP3) استفاده کنید. صدای MP3 یک فرمت صوتی رسماً معتبر نیست اما بسیاری از پخشکنندههای VCD آن را شناسایی میکنند. صدای MP3 برای DVDها معتبر نیست. شما باید به MP2 پایبند باشید زیرا بسیاری از پخشکنندههای MPEG-2 (برای مثال پخشکننده DVD؛ معمولاً نسخههای ویندوز نیز با این موضوع مشکلات زیادی دارند) قادر به پخش ویدیوی MPEG2 به همراه صدای MP3 نیستند.
ابزار mp2enc یک کدگذار صوتی MP2 است. کدگذار toolame نیز قادر به تولید یک فایل MP2 است. ابزار Toolame بسیار سریعتر از mp2enc است اما تغییر نرخ نمونهبرداری (resampling از 48000 به 44100 نمونه در ثانیه) را انجام نمیدهد. بسیاری از پخشکنندههای سختافزاری SVCDها را با استفاده از صدای نرخ 48000 پخش میکنند. برای ایجاد MP3 مطمئن هستم که یک کدگذار دارید.
مثال:
> lav2wav stream.avi │ mp2enc -o sound.mp2
این دستور یک فایل صوتی mpeg از stream.avi با نرخ بیت 224kBit/sec و نرخ نمونهبرداری 48kHz ایجاد میکند. اگر فایل صوتی شما 44.1kHz باشد، mp2enc صدا را مجدداً نمونهبرداری میکند تا خروجی 48kHz بسازد. اگر نرخ نمونهبرداری خروجی 44.1kHz میخواهید، باید -r 44100 را به دستور mp2enc اضافه کنید.
مثال:
> cat sound.wav │ mp2enc -v 2 -V -o sound.mp2
این دستور یک خروجی سازگار با VCD (-V نرخ بیت=224، استریو، نرخ نمونهبرداری: 44100) از فایل wav ایجاد میکند.
با -v 2 ابزار mp2enc پرحرفتر میشود و در حین کدگذاری، تعداد ثانیههای صوتی کدگذاریشده را مشاهده میکنید.
میتوانید خروجی را با دستور زیر آزمایش کنید:
> plaympeg sound.mp2
نکته: برنامه plaympeg یک پخشکننده MPEG-1 برای لینوکس است؛ میتوانید از سایر پخشکنندهها نیز استفاده کنید. برای آزمایش صدا میتوانید از mpg123 نیز بهره ببرید. برای پخش هر دو مورد صدا و تصویر، پخشکنندههای همهمنظورهای مانند VLC ،mplayer و غیره وجود دارند.
تبدیل ویدئو (Converting video)
ایجاد ویدئوهای MPEG-1 و MPEG-2.
معمولاً نخستین ویدئویی که ایجاد میکنید بهترین کیفیت را ندارد. برای دستیابی به بهینهترین کیفیت/حجم، باید با نرخ بیت (Bitrate)، شعاع جستجو (Search radius)، فیلتر نویز و... بازی کنید. گزینههای mpeg2enc در صفحه راهنمای mpeg2enc شرح داده شدهاند.
مثال:
lav2yuv stream.avi stream1.avi │ mpeg2enc -o video.m1v
این دستور یک فایل ویدئویی با نرخ بیت ثابت پیشفرض ۱۱۵۲ کیلوبیت بر ثانیه (1152kBit/sec) ایجاد میکند. این همان نرخ بیتی است که برای ایجاد VCD به آن نیاز دارید. میتوانید فایلهای بیشتری را مشخص کنید و همچنین از جایگزین %nd استفاده نمایید، که در آن n نشاندهنده شماره است. بهطور پیشفرض mpeg2enc فرض میکند که میخواهید یک ویدئوی غیر اینترلیس (Non-interlaced یا Progressive) را به MPEG-1 انکود کنید. اگر بخواهید یک ویدئوی فولسایز با ساختار اینترلیس (Interlaced) را انکود کنید، دستور بالا با خطا مواجه خواهد شد.
مثال:
> lav2yuv streami%02d.avi │ mpeg2enc -b 1500 -r 16 -o video.m1v
دستور mpeg2enc ویدئویی با نرخ بیت ۱۵۰۰ کیلوبیت بر ثانیه با استفاده از شعاع جستجوی ۱۶ ایجاد میکند. این بدان معناست که هنگام تلاش برای یافتن ماکروبلوکهای ۱۶×۱۶ پیکسلی مشابه بین فریمها، انکودر تا ۱۶ پیکسل دورتر از موقعیت فعلی هر بلوک را جستجو میکند. هنگام مقایسه فریمهایی با فاصله ۱ فریم، دو برابر دورتر را جستجو میکند و به همین ترتیب. مقادیر معقول ۱۶ یا ۲۴ هستند. مقدار پیشفرض ۱۶ است، بنابراین افزودن این گزینه در اینجا اثری ندارد. مقادیر کمتر (۰، ۸) سرعت انکود را افزایش میدهند اما کیفیت پایینتری (آرتیفکتهای بصری بیشتر) دریافت میکنید، در حالی که مقادیر بالاتر (۲۴، ۳۲) کیفیت را به بهای کاهش سرعت بهبود میبخشند. با الگوی نام فایل stream%02d.avi تمام فایلهایی که با این الگو با 00، 01 و... مطابقت داشته باشند پردازش میشوند.
تغییر مقیاس (Scaling)
با استفاده از yuvscaler اکنون میتوان پیش از انکود کردن، مقیاس ویدئو را نیز تغییر داد. این قابلیت میتواند برای کاربرانی با کارتهای DC10 یا +DC10 که با ابعاد -d 1 (768x576) یا -d 2 (384x288 در استانداردهای PAL/SECAM) یا -d 1 (640x480 در استاندارد NTSC) تصویربرداری میکنند، بسیار مفید باشد.
میتوانید با مطالعه صفحه راهنما یا با اجرای دستور زیر، توضیحات کامل تمامی گزینهها را دریافت کنید:
>yuvscaler -h
مثال:
> lav2yuv stream.avi │ yuvscaler -O VCD │ mpeg2enc -o video.m1v
این دستور مقیاس جریان را به اندازه VCD تغییر میدهد که برای PAL/SECAM برابر ۳۵۲×۲۸۸ و برای NTSC برابر ۳۵۲×۲۴۰ است. جریان yuv تغییر مقیاس یافته سپس به MPEG-1 انکود میشود.
همچنین میتواند تغییر مقیاس به SVCD با ابعاد ۴۸۰×۴۸۰ (برای NTSC) یا ۴۸۰×۵۷۶ (برای PAL/SECAM) را انجام دهد:
> lav2yuv stream.avi │ yuvscaler -O SVCD -M BICUBIC │ mpeg2enc -o video.m1v
کلمه کلیدی حالت (-M) ابزار yuvscaler را مجبور میکند تا برای کاهش مقیاس (Downscaling) از الگوریتمهای باکیفیتتر بایکیوبیک (Bicubic) بهجای الگوریتمهای پیشفرض بازنمونهبرداری (Resample) استفاده کند. افزایش مقیاس (Upscaling) همیشه با استفاده از الگوریتم بایکیوبیک انجام میشود.
مثال:
> lav2yuv stream.avi │ yuvscaler -I USE_450x340+20+30 -O SIZE_320x200 │ mpeg2enc -o video.m1v
در اینجا ما تنها بخشی از ورودی را استفاده میکنیم و یک وضوح خروجی غیراستاندارد را تعیین مینماییم.
نکته: ابزار yuvscaler میتواند یک ناحیه فعال تنظیم کند و بقیه بخشها را با استفاده از دستور زیر به رنگ سیاه درآورد: -I ACTIVE_WidthxHeight+WidthOffset+HeightOffset
تغییر مقیاس با کیفیت بالا: y4mscaler (High quality scaling: y4mscaler)
ابزار y4mscaler مدت زیادی است که در دسترس است؛ اما برای مدت طولانی ابزاری اضافی بود که باید خودتان آن را کامپایل میکردید. یک صفحه راهنمای جامع وجود دارد که تمامی جزئیات را توضیح میدهد، همچنین اطلاعات مفید بسیاری در وبسایت آن در دسترس است.
یکی از ویژگیهای منحصربهفرد آن، توانایی تغییر زیرنمونهبرداری (Subsampling) و حالتهای کروما (Chroma Modes) است. همچنین میتوانید کرنلهای تغییر مقیاس را انتخاب کنید که بسته به منبع میتواند کمک شایانی بکند.
مثال:
> cat raw.yuv │ y4mscaler -O infer=CLIP -O preset=DVD -O sar=PAL_Wide │ mpeg2enc video.m1v
در این مثال y4mscaler جریان ورودی را گرفته و آن را به اندازه متناظر PAL تغییر مقیاس میدهد. گزینه sar دستور میدهد که مقیاس به یک فرمت عریض (16:9) تغییر یابد. گزینه infer=clip به y4mscaler میگوید که میتواند نوارهای بالا و پایین را برش دهد (Clip کند) تا به اندازه نهایی برسد.
مثال:
> mpeg2dec -o pgmpipe deluxe.m2v │ pgmtoy4m -x 420jpeg -r 25:1 -i t │ y4mscaler -I sar=64:36 -I active=344x476+100+48 -O preset=DVD │ mpeg2enc -f 8 video.m1v
این وظیفه مناسبتری برای y4mscaler است. ما یک فرمت منبع عجیب PAL MPEG با ابعاد ۵۴۴×۵۷۶ پیکسل در فرمت عریض 16:9 داریم که نوارهای سیاه در اطراف تصویر اصلی 4:3 ایجاد میکند. این دستور تصویر را تا اندازه اصلی 4:3 بزرگ میکند و فقط مرکز مورد نظر را برمیدارد. نسبت ابعاد نمونه (SAR) در جایی گم شده است، بنابراین ما آن را در ابتدا مشخص میکنیم. پس از مشخص شدن مجدد آن، اندازه فعال تصویری را که باید برای افزایش مقیاس استفاده شود به y4mscaler اعلام میکنید. کلمه کلیدی active در y4mscaler و yuvscaler بهطور متفاوتی پردازش میشود. مقدار DVD یک پیشتنظیم برای فرمت خروجی مورد نظر شما است. از پارامترهای جریان، y4mscaler میداند که این یک جریان PAL و پارامترهای خروجی آن چیست. اگر یک خروجی 16:9 میخواستید، باید از کلمه کلیدی DVD_WIDE استفاده میکردید.
تست و بررسی با دستور زیر انجام میشود:
> mplayer video.m1v
نکته ۱: اینها فقط چند مثال هستند. گزینههای بیشتری وجود دارند که میتوانید استفاده کنید. میتوانید اکثر آنها را با یکدیگر ترکیب کنید تا ویدئوهایی با کیفیت بالا و کمترین نرخ بیت ممکن ایجاد نمایید.
نکته ۲: هرچه شعاع جستجو را بالاتر تنظیم کنید، فرآیند تبدیل طولانیتر خواهد شد. بهطور کلی، هرچه گزینههای بیشتری استفاده شود، انکودینگ زمان بیشتری میبرد.
نکته ۳: فرمت MPEG-1 برای نرخ بیت متغیر (جریان VBR) طراحی نشده بود!! بنابراین اگر با گزینه -q 15 انکود کنید، mpeg2enc حداکثر نرخ بیت -b را روی ۱۱۵۲ تنظیم میکند. اگر یک MPEG-1 با نرخ بیت متغیر (VBR) میخواهید، باید مقدار -b را بسیار بالا (مثلاً ۲۵۰۰) تنظیم کنید.
نکته ۴: شاید بهتر باشد نامهای گویاتری نسبت به video.mpg انتخاب کنید. یک ایده خوب این است که گزینهها را به عنوان بخشی از نام فایل قرار دهید (برای مثال: video_b1500_r16_41_21.m1v). امکان دیگر این است که تمام فایلهای صوتی لایه ۲ را با پسوند «.mp2»، تمام فایلهای ویدئویی MPEG-1 را با پسوند «.m1v» و تمام فایلهای ویدئویی MPEG-2 را با پسوند «.m2v» نامگذاری کنید. در این صورت بهراحتی متوجه میشوید چه خبر است. پسوند .mpg را برای جریانهای چندتابعیتی (Multiplex شده) MPEG-1/2 نگه دارید.
ترکیب جریانها با یکدیگر (Putting the streams together)
مثال:
> mplex sound.mp2 video.m1v -o my_video.m1v
جریانهای sound.mp2 و video.m1v را با یکدیگر در my_video.mpg ترکیب (مالتیپلکس) میکند.
اکنون میتوانید از پخشکننده MPEG دلخواه خود استفاده کرده و آن را تماشا کنید. تمام پخشکنندهها (برای مثال gtv) که بر پایه کتابخانه SMPEG هستند، برای MPEG-1 بهخوبی کار میکنند. پخشکنندههای دیگر (که میتوانند هم فیلمهای MPEG-2 و هم MPEG-1 را پخش کنند) عبارتند از: xmovie، xine، MPlayer و VLC.
نکته: اگر گزینه -S را برای mpeg2enc مشخص کرده باشید، mplex در صورتی که در نام فایل خروجی عبارت %d وجود داشته باشد (مانند: -o test%d.mpg)، فایلها را بهطور خودکار قطعهقطعه (Split) میکند. فایلهای تولید شده به این روش، جریانهای مستقل و مجزای MPEG هستند!
نکته ۲: ممکن است xine در پرش زمانی (Seeking) درون ویدئوها مشکل داشته باشد. ابزار mplayer نیز در «پرش به جلو/عقب» در جریانهای با نرخ بیت متغیر (VBR) مشکل دارد، زیرا در فایل به اندازه حجم داده مربوط به یک جریان با نرخ بیت ثابت به جلو میرود. این مقدار ممکن است بهطور قابل توجهی بیشتر از ۱۰ ثانیه یا یک دقیقه باشد (که مقادیر پیشفرض پرش mplayer برای هر بار فشردن کلیدهای جهتنما هستند). بنابراین اگر زمان پرش به جلو یا عقب بسیار بیشتر از حد انتظارتان بود تعجب نکنید.
مالتیپلکس کردن با نرخ بیت متغیر (VBR): به یاد داشته باشید که علاوه بر mpeg2enc (به اسکریپتهای نمونه مراجعه کنید)، به mplex نیز اطلاع دهید که در حال انکود VBR هستید (گزینه -V). این ابزار *میتوانست* بهطور خودکار شناسایی کند اما هنوز کار نمیکند. باید اندازه بافر ویدئو را در mplex حداقل به اندازه مقداری که به mpeg2enc دادهاید مشخص کنید. اعداد معقول برای MPEG-1 میتواند سقف نرخ بیت ۲۸۰۰ کیلوبیت بر ثانیه، سقف کیفیت (کف کوانتیزاسیون) ۶ و اندازه بافر 400K باشد.
مثال:
> mplex -V -r 1740 audio.mp2 video_vbr.m1v -o vbr_stream.mpg
در اینجا یک جریان با نرخ بیت متغیر را مالتیپلکس میکنیم. ابزار mplex یک مالتیپلکسر تکگذره (Single pass) است، بنابراین نمیتواند حداکثر نرخ بیت را تشخیص دهد و ما باید آن را مشخص کنیم. نرخ داده برای جریان خروجی برابر است با: نرخ بیت صدا + اوج نرخ بیت ویدئو + ۱ تا ۲ درصد برای اطلاعات mplex. اگر صدا (-b 224) برابر ۲۲۴ کیلوبیت و ویدئو ۱۵۰۰ کیلوبیت باشد (که با -b 1500 -q 9 انکود شده است)، آنگاه ۱۷۲۴ × ۱٫۰۱ یا حدود ۱۷۴۰ کیلوبیت خواهیم داشت.
مثال:
> plaympeg my_video.mpg
یا
> mplayer my_video.mpg
ایجاد ویدئوهای MPEG-1 (Creating MPEG-1 Videos)
برای ویدئوهای MPEG-1 میتوانید از صدای MP2 و ویدئوی MPEG-1 استفاده کنید. زیرمجموعهای از فیلمهای MPEG-1 دیسکهای VCD هستند. میتوانید از VBR (نرخ بیت متغیر) برای ویدئو استفاده کنید (هرچند VCDها تقریباً همیشه از ویدئوی CBR استفاده میکنند)، اما صدا باید حتماً CBR (نرخ بیت ثابت) باشد.
فرمت MPEG-1 برای اندازههای تصویر تا ۳۵۲×۲۸۸ در PAL و ۳۵۲×۲۴۰ در NTSC توصیه میشود؛ برای ابعاد بزرگتر، MPEG-2 انتخاب بهتری است. هیچ وضوح دقیقی وجود ندارد که در آن MPEG-1 قطعی بهتر از MPEG-2 باشد. فقط برای اطمینان، MPEG-1 نمیتواند منابع اینترلیس (Interlaced) را مدیریت کند. اگر ویدئوی شما اینترلیس است، برای انکود صحیح آن به MPEG-2 نیاز دارید.
مثال ایجاد صدای MPEG-1 (MPEG-1 Audio creation Example)
> lav2wav editlist.eli │ mp2enc -r 44100 -o sound.mp2
میتوانید با دستور دادن به mp2enc برای استفاده از نرخ بیت پایینتر (گزینه -b) مانند ۱۶۰ یا ۱۹۲ کیلوبیت بر ثانیه، مقداری در حجم صرفهجویی کنید. گزینه -r 44100 ابزار mp2enc را مجبور میکند یک فایل صوتی 44.1kHz تولید کند.
> lav2wav editlist.eli │ mp2enc -b 128 -m -o sound.mp2
این دستور یک خروجی مونو با نرخ بیت ۱۲۸ کیلوبیت بر ثانیه ایجاد میکند. ورودی این بار فایل فهرست ویرایش (editlistfile با هر نام دلخواه) است که با glav ایجاد شده است، بنابراین تمام تغییراتی که در glav ایجاد کردهاید مستقیماً پردازش شده و به mp2enc تحویل داده میشوند. برای تبدیل صحیح نیازی به ایجاد جریان ویرایششده با lavtrans ندارید.
مثال ایجاد ویدئوی MPEG-1 (MPEG-1 Video creation example)
> lav2yuv editlist.eli │ mpeg2enc -b 2000 -r 24 -q 6 -o video.m1v
دستور mpeg2enc یک ویدئو با نرخ بیت ۲۰۰۰ کیلوبیت بر ثانیه (یا ۲۰۴۸۰۰۰ بیت بر ثانیه) ایجاد میکند، اما فلگ -q نرخ بیت متغیر و ضریب کیفیت ۶ را فعال میسازد. همچنین از شعاع جستجوی ۲۴ استفاده میکند.
توضیحات: هنگامی که mpeg2enc بدون فلگ 'q' فراخوانی شود، جریانهای MPEG با «نرخ بیت ثابت» (CBR) ایجاد میکند؛ جایی که (به بیان ساده) شدت فشردهسازی (و در نتیجه کیفیت تصویر) به گونهای تنظیم میشود که به طور میانگین هر فریم از ویدئو دقیقاً تعداد بیتهای مشخصشده را داشته باشد. چنین جریانهای با نرخ بیت ثابت برای پخش همگانی (Broadcasting) و سختافزارهای ارزانقیمت مانند پخشکنندههای DVD و VCD که از سختافزار پخش با سرعت ثابت و کند استفاده میکنند، مورد نیاز است.
بدیهی است که این روش بسیار ناکارآمد است زیرا به این معنی است که صحنههای بدون حرکت بیتهایی را مصرف میکنند که بهتر بود در صحنههای با تغییر سریع «خرج» شوند. تنظیم فلگ 'q' به mpeg2enc میگوید که جریانهایی با نرخ بیت متغیر (VBR) تولید کند. برای چنین جریانهایی، نرخ بیت مشخصشده صرفاً حداکثر نرخ مجاز است. پارامتر 'q' حداقل درجه فشردهسازی را با تعیین چگونگی ثبت دقیق اطلاعات تصویر مشخص میکند. معمولاً 'q' طوری تنظیم میشود که صحنههای آرام کمتر از حداکثر مشخصشده استفاده کنند (حدود ۶ یا ۸)، اما صحنههای با حرکت سریع همچنان محدود به نرخ بیت باشند. برای اهداف بایگانی، تنظیم حداکثر نرخ بیت به اندازه کافی بالا که هرگز به آن نرسد (مثلاً 10Mbps) و مقدار q برابر ۲ یا ۳ انتخابهای معقولی هستند.
مثال:
> lav2yuv stream.avi │ yuvscaler -I ACTIVE_352x240+0+24 │ mpeg2enc -b 1152 -r 16 -4 1 -2 1 -o video.m1v
معمولاً در بالا و پایین یک حاشیه تقریباً سیاه وجود دارد و پهنای باند زیادی برای چیزی که دوست ندارید مصرف میشود. گزینه -I ACTIVE در yuvscaler هر چیزی را که در ناحیه توصیفشده نباشد به رنگ سیاه درمیآورد اما اندازه تصویر (۳۵۲×۲۸۸) تغییر نمیکند. بنابراین شما یک حاشیه سیاه واقعی دارید و انکودر فقط چند بیت برای انکود کردن آنها استفاده میکند. در این مثال شما همچنان با فرمت VCD سازگار هستید. برای تعیین پنجره فعال، یک فریم را به فرمت jpeg استخراج کنید:
> lavtrans -f i -i 100 -o frame.jpg test.avi
سپس از برنامه نمایش گرافیکی مورد علاقه خود برای تعیین اندازه فعال استفاده نمایید. گزینههای -4 1 و -2 1 کیفیت را حدود ۱۰ درصد بهبود میبخشند اما تبدیل کندتر میشود.
در اندازه ۳۵۲×۲۸۸ (نصف اندازه PAL که هنگام استفاده از گزینه -d 2 در حین ضبط ایجاد میشود)، نرخ بیت مورد نیاز بین ۱۰۰۰ تا ۱۵۰۰ کیلوبیت بر ثانیه است/باید باشد. برای NTSC نیز باید تقریباً همین مقدار باشد، زیرا گرچه تصویر کوچکتر است اما تعداد فریمها در ثانیه بیشتر از PAL است.
به هر حال، عامل اصلی کیفیت منبع اصلی و میزان فیلتر کردن است. محتوای بدون فیلتر با کیفیت پایین معمولاً به نرخ بالاتری نیاز دارد تا از ایجاد آرتیفکتهای بصری جلوگیری شود. اگر میخواهید هنگام فشردهسازی برنامههای تلویزیونی، نرخ بیت را بدون ایجاد آرتیفکتهای آزاردهنده کاهش دهید، باید یک (یا چند) مورد از فیلترهای نویز را امتحان کنید.
مثال:
> lav2yuv stream.avi │ mpeg2enc -b 1500 -n s -g 6 -G 20 -P -o video.m1v
در اینجا stream.avi با مشخصات زیر انکود میشود:
نرخ بیت ۱۵۰۰ کیلوبیت بر ثانیه
استاندارد ویدئوی ورودی به SECAM اجبار میشود
این گزینه اطمینان حاصل میکند که ۲ فریم B بین فریمهای مجاور I/P ظاهر شوند. چندین دیکودر متداول MPEG-1 نمیتوانند جریانهایی را که ۲ فریم B بین فریمهای I/P ندارند مدیریت کنند
انکودر میتواند اندازه گروه تصاویر (GOP) را به صورت پویا متناسب با تغییرات صحنه تغییر دهد. این کار با تنظیم حداکثر اندازه GOP (فلگ -G) بزرگتر از حداقل آن (فلگ -g) انجام میشود. برای VCD مقادیر معقول ممکن است حداقل ۹ و حداکثر ۱۵ باشد. برای SVCD مقادیر ۹ و ۱۵ مقادیر خوبی خواهند بود. اگر فقط میخواهید آن را روی پخشکننده نرمافزاری پخش کنید، میتوانید از مقادیر min-max دیگری استفاده کنید.
مثال:
> lav2yuv stream*.avi │ mpeg2enc -b 1500 -r 16 -4 1 -2 1 -S 630 -B 260 -o video_n1_1500_r16_41_21_S630_B240.m1v
دستور lav2yuv تمام فایلهای جریان را پردازش میکند. سپس به mpeg2enc گزینههایی داده میشود که باعث میشود جریان انکود شده بهتر به نظر برسد. استفاده از -S 630 به این معنی است که mpeg2enc جریان را طوری علامتگذاری میکند که mplex به ازای هر 630 مگابایت یک جریان جدید ایجاد کند. یک نکته مهم استفاده از گزینه -B است که نرخ بیت موارد غیرویدئویی (صدا و اطلاعات mplex) را مشخص میکند. مقدار -B برابر ۲۶۰ برای صدای ۲۲۴ کیلوبیت و اطلاعات mplex مناسب خواهد بود. برای اطلاعات بیشتر به اسکریپتهای انکودینگ در دایرکتوری scripts نگاهی بیندازید.
مثال مالتیپلکس کردن MPEG-1 (MPEG-1 Multiplexing Example)
مثال:
>mplex sound.mp2 video.m1v -o my_video.mpg
جریانهای sound.mp2 و video.m1v را با هم در my_video.mpg قرار میدهد. این کار تنها در صورتی به این سادگی کار میکند که CBR داشته باشید (از گزینه -q در mpeg2enc استفاده نشده باشد).
مثال:
mplex -V -r 1740 audio.mp2 video_vbr.m1v -o vbr_stream.mpg
در اینجا یک جریان با نرخ بیت متغیر را مالتیپلکس میکنیم. اکنون mplex یک مالتیپلکسر تکگذره است، بنابراین نمیتواند حداکثر نرخ بیت را تشخیص دهد و ما باید آن را مشخص کنیم. نرخ داده برای جریان خروجی برابر است با: نرخ بیت صدا + اوج نرخ بیت ویدئو + ۱ تا ۲ درصد برای اطلاعات mplex. اگر صدا (-b 224) برابر ۲۲۴ کیلوبیت و ویدئو ۱۵۰۰ کیلوبیت باشد (که با -b 1500 -q 9 انکود شده است)، آنگاه ۱۷۲۴ × ۱٫۰۱ یا حدود ۱۷۴۰ کیلوبیت خواهیم داشت.
ایجاد ویدئوهای MPEG-2 (Creating MPEG-2 Videos)
فرمت MPEG-2 برای منابعی با تصویر بزرگتر از ۳۵۲×۲۴۰ برای NTSC و ۳۵۲×۲۸۸ برای PAL توصیه میشود. فرمت MPEG-2 همچنین میتواند از پس منابع اینترلیس مانند ضبط از تلویزیون با وضوح کامل برآید.
فرمت MPEG-2 امکان استفاده از صدای لایه ۳ امپگ (MP3) را فراهم میکند. بنابراین میتوانید از انکودر mp3 مورد علاقه خود برای ایجاد صدا استفاده کنید. با این حال، صدای MP3 برای DVD معتبر نیست. بهتر است از صدای MP2 (لایه ۲) استفاده کنید. صدا نیز میتواند یک جریان VBR باشد.
جریان MPEG-2 معمولاً یک جریان VBR است. ایجاد MPEG-2 به همراه بهینهسازی به توان پردازشی بالایی نیاز دارد. یک فیلم با وضوح دو برابر، ۴ برابر بزرگتر از یک جریان MPEG-1 نیست. بسته به تنظیمات کیفیت شما، حدود ۱٫۵ تا ۳ برابر بزرگتر از جریان MPEG-1 در وضوح پایینتر آن خواهد بود.
مثال ایجاد صدای MPEG-2 (MPEG-2 audio creation example)
> lav2wav editlist.eli │ mp2enc -o sound.mp2
میتوانید با دستور دادن به mp2enc برای استفاده از نرخ بیت پایینتر (گزینه -b) مانند ۱۶۰ یا ۱۹۲ کیلوبیت بر ثانیه، مقداری در حجم صرفهجویی کنید. شاید بخواهید -r 44100 را اضافه کنید تا mpeg2enc صدایی با نرخ نمونهبرداری 44.1kHz تولید کند. امیدوارم نیازی به توضیح نحوه استفاده از یک انکودر MP3 نباشد. اما نباید از تمام گزینههای فانتزی موجود استفاده کنید.
مثال ایجاد ویدئوی MPEG-2 (MPEG-2 Video creation example)
> lav2yuv editlist.eli │ mpeg2enc -f 3 -b 3000 -q 9 -o video.m2v
یک مثال بسیار ساده برای ویدئوی MPEG-2. مهمترین گزینه -f 3 است که به mpeg2enc میگوید باید یک جریان MPEG-2 ایجاد کند. از آنجا که این یک MPEG-2 عمومی است، باید از گزینههای نرخ بیت -b استفاده کنید؛ و باید از گزینه -q استفاده نمایید چون معمولاً یک جریان VBR کمحجم میخواهید. هنگام استفاده از جریانهای VBR، گزینه -b حداکثر نرخ بیتی را که میتوان استفاده کرد به mpeg2enc میگوید. گزینه -q به mpeg2enc میگوید که جریانها باید چه کیفیتی داشته باشند. نرخ بیت دارای کران بالایی از مقدار مشخصشده توسط -b است.
> lav2yuv editlist.eli │ mpeg2enc -f 3 -4 1 -2 1 -q7 -b 4500 -V 300 -P -g 6 -G 18 -I 1 -o video.m2v
این دستور جریان MPEG-2 با کیفیت بالاتری تولید میکند زیرا گزینههای -4 1 و -2 1 استفاده شدهاند. با -b 4500 -q 7 شما حداکثر نرخ بیت و ضریب کیفیت را به mpeg2enc میگویید. گزینه -V اندازه بافر ویدئو است که برای دیکود کردن جریان استفاده میشود. برای پخش نرمافزاری میتواند بسیار بالاتر از مقدار پیشفرض باشد. ساختار GOP پویا با -g و -G تنظیم میشود. اندازه بزرگتر GOP میتواند به کاهش نرخ بیت مورد نیاز برای یک کیفیت معین کمک کند، اما اندازههای بسیار بزرگ ممکن است به دلیل خطاهای گرد کردن انباشتهشده DCT/iDCT باعث ایجاد آرتیفکت شوند. گزینه -P همچنین تضمین میکند که ۲ فریم B بین فریمهای مجاور I/P ظاهر شوند. گزینه -I 1 به mpeg2enc میگوید که منبع یک ویدیوی اینترلیس است. منطق جبران حرکت اینترلیس (که زمانبر است) در mpeg2enc وجود دارد. اگر اندازه فریمهایی که انکود میکنید بزرگتر از اندازه VCD برای استاندارد تلویزیونی شما باشد، mpeg2enc از آن منطق استفاده خواهد کرد.
اگر فیلم را با yuvdeinterlace دیاینترلیس (Deinterlace) میکنید، باید به mpeg2enc بگویید که نیازی به تخمین حرکت برای محتوای اینترلیس ندارد. باید از گزینه -I 0 در mpeg2enc استفاده کنید تا اعلام نمایید فریمها قبلاً دیاینترلیس شدهاند. این کار زمان زیادی را هنگام انکودینگ ذخیره میکند. اگر از -I 0 استفاده نکنید مشکلی ایجاد نمیشود، فقط انکودینگ بیشتر طول میکشد.
همچنین میتوانید از تغییر مقیاس و گزینههایی که تصاویر را بهینهسازی (حذف نویز) میکنند استفاده کنید تا جریانهای کوچکتری به دست آورید. این گزینهها در بخشهای بعدی به تفصیل توضیح داده شدهاند.
چه مقادیری باید برای انکودینگ VBR استفاده شوند؟ (Which values should be used for VBR Encoding?)
گزینه -q حداقل کوانتیزاسیون جریان خروجی را کنترل میکند. کوانتیزاسیون دقت ثبت اطلاعات تصویر را کنترل مینماید. هرچه مقدار کمتر باشد، کیفیت تصویر بهتر است. مقادیر زیر ۴ حالتهای افراطی هستند و فقط در صورتی باید استفاده شوند که بدانید در حال انجام چه کاری هستید.
معمولاً باید با گزینه -b یک حداکثر نرخ بیت تعیین کنید. کار دشوار این است که مقداری برای گزینه -q و گزینه -b تنظیم کنید که فیلم زیبایی بدون مصرف پهنای باند بیش از حد تولید کند و آرتیفکتهای زیادی ایجاد ننماید.
ضریب کیفیت باید طوری انتخاب شود که خروجی mplex برای اوج نرخ بیت و میانگین نرخ بیت حدود ۲۰ تا ۲۵ درصد با هم تفاوت داشته باشند. اگر این تفاوت بسیار کم باشد (کمتر از ۱۰٪)، احتمالاً در صحنههای با حرکت سریع شروع به دیدن آرتیفکت خواهید کرد. شایعترین دلیل نزدیک بودن (یا برابر بودن) نرخ میانگین به حداکثر نرخ، مقدار نادرست برای حداکثر نرخ بیت یا ضریب کیفیتی است که بسیار بالا تعیین شده است.
ترکیبی که آرتیفکتهای غیرقابل شمارشی تولید خواهد کرد، یک SVCD با حداکثر نرخ بیت ویدئوی ۲۵۰۰ کیلوبیت و ضریب کیفیت ۱ یا ۲ است. برای SVCD با محدودیت ویدئوی ۲۵۰۰ کیلوبیت، ضریب کیفیت ۷ تا ۱۱ کاملاً مناسب است (۸ پیشفرض است). اگر از برنامههای فیلتر استفاده میکنید یا منبع بسیار خوبی مانند تلویزیون دیجیتال، محتوای مشابه DVD یا تصاویر رندرشده دارید، میتوانید هنگام ایجاد SVCD از ضریب کیفیت ۶ استفاده کنید. اگر دستگاه پخش SVCD/DVD شما از نرخهای بیت غیراستاندارد پشتیبانی میکند، میتوانید نرخ بیت را بالاتر از حداکثر استاندارد ۲۷۸۸ کیلوبیت بر ثانیه (ویدئو به علاوه صدا) افزایش دهید. هنگام استفاده از نرخ بیت و ضریب کیفیت بالاتر، صحنههای اکشن بسیار بهتر به نظر میرسند اما البته زمان پخش دیسک کمتر خواهد بود.
همین ضریب کیفیت (۷ تا ۱۱) برای یک تصویر با اندازه کامل و نرخ بیت اوج ۳۵۰۰ تا ۴۰۰۰ کیلوبیت، آرتیفکتهای اندکی تولید خواهد کرد.
برای SVCD/DVD میتوانید در صورتی که حداکثر نرخ بیت خیلی پایین تنظیم نشده باشد، نتیجهای مانند آنچه شرح داده شده را انتظار داشته باشید:
q <= 6 تصاویر واقعاً شفاف و کیفیت عالی q <= 8 کیفیت خوب q >= 10 کیفیت متوسط q >= 11 چندان خوب نیست q >= 13 در اینجا حتی سکانسهای ثابت نیز ممکن است بلوکی به نظر برسند
مقصد انکودینگ: تلویزیون (اینترلیس) یا مانیتور (پروگرسیو)
فرمت MPEG-2 علاوه بر فرمت پروگرسیو (Progressive) از دادههای اینترلیس (Interlaced) نیز پشتیبانی میکند. یک فیلم MPEG-2 میتواند اینترلیس یا پروگرسیو باشد. این موضوع به منبع (فیلم یا پخش تلویزیونی) و دستگاه نمایش بستگی دارد.
اگر یک فیلم سینمایی را انکود میکنید، هر دو فیلد باید یکسان باشند. جریان را با yuvdeinterlace دیاینترلیس کنید، یا اگر منبع باکیفیتی دارید و نیازی به استفاده از نویزگیر ندارید، از yuvcorrect -T NOT_INTERLACED استفاده نمایید. همچنین گزینه حالت اینترلیس (-I) در mpeg2enc را روی 0 تنظیم کنید. این به معنای عدم وجود اینترلیس است. ما در اینجا واقعاً نیازی به دیاینترلیس کردن نداریم زیرا حرکتی بین فیلدهای فریم وجود ندارد؛ فقط کافی است دو فیلد را در یک فریم پروگرسیو واحد ترکیب کنیم.
این فیلم باید روی هر دستگاهی (تلویزیون یا مانیتور) بدون مشکل پخش شود.
اگر منبع اینترلیس (پخش تلویزیونی) دارید، میتوانید آن را به صورت جریان اینترلیس انکود کنید؛ یا جریان را دیاینترلیس کرده و به صورت جریان پروگرسیو انکود نمایید. اگر آن را با yuvdeinterlace دیاینترلیس کنید، جزئیات را از دست خواهید داد. اما اگر قصد دارید جریان ضبطشده را روی دستگاه پخش DVD و تلویزیون خود پخش کنید، عاقلانه نیست که دیاینترلیس انجام دهید. اگر فقط میخواهید آن را روی مانیتور (نمایشگر پروگرسیو) پخش کنید، تصویر در هنگام پخش در صورت دیاینترلیس شدن بهتر به نظر میرسد. اگر پخشکنندهای که استفاده میکنید قابلیت دیاینترلیس کردن دارد، فرقی نمیکند که ویدئوی انکود شده شما فریمهای اینترلیس داشته باشد یا فریمهای پروگرسیو.
اگر قصد دارید جریان را دیاینترلیس کنید، تنها میتوانید این کار را با yuvdeinterlace انجام دهید و در mpeg2enc گزینه -I 0 را تنظیم کنید. اگر نمیخواهید جریان را دیاینترلیس کنید، نیازی به تنظیم هیچ گزینه خاصی ندارید (از yuvdeinterlace و mpeg2enc -I 0 استفاده نکنید).
اگر دوست دارید ویدئو را متوقف (Pause) کرده و به تصویر ثابت نگاه کنید، باید دیاینترلیس کنید؛ زیرا در این صورت هنگام توقف تصویر بدون لرزش (Flicker-free) خواهد بود.
اگر فیلمی (پروگرسیو) دارید که بخشهایی از پخش تلویزیونی (اینترلیس) با آن ترکیب شده است (مانند یک مستند که در آن برخی بخشهای مصاحبهشونده به صورت اینترلیس ضبط شده و بخشهای دیگر فیلمبرداری شدهاند)، باید بین سکانسهای فیلم خوب با تصاویر ثابت متوسط، یا سکانسهای فیلم متوسط با تصاویر ثابت خوب یکی را انتخاب کنید.
برای فیلم خوب با تصاویر ثابت متوسط، دیاینترلیس نکنید. برای سکانسهای فیلم متوسط با تصاویر ثابت خوب، دیاینترلیس کنید (با استفاده از yuvdeinterlace و mpeg2enc -I 0).
مثال مالتیپلکس کردن MPEG-2 (MPEG-2 Multiplexing example)
> mplex -f 3 -b 300 -r 4750 -V audio.mp3 video.m2v -o final.mpg
اکنون هر دو جریان (یک صدای mp3 و یک ویدئوی mpeg2) در یک جریان واحد (final.mpg) ترکیب (مالتیپلکس) میشوند. باید از گزینه -f 3 استفاده کنید تا فرمت خروجی را به mplex بگویید. همچنین باید گزینه اندازه بافر دیکودر -b را با همان مقداری که هنگام انکود ویدئو استفاده شده اضافه کنید. گزینه -r نرخ ویدئو + صدا + ۱ تا ۲ درصد اطلاعات mplex است.
گزینه -V اعلام میکند که منبع شما برای مالتیپلکس یک جریان VBR است. اگر از این گزینه استفاده نکنید، mplex چیزی شبیه به یک جریان CBR با نرخ بیتی که با گزینه -r به آن اعلام کردهاید ایجاد میکند. این جریانها معمولاً بسیار حجیم میشوند.
ایجاد Video CD (VCD)
فرمت VCD نسخهای محدودشده از ویدئوی MPEG-1 است. فرمت VCD توسط فیلیپس (Philips) تعریف شد. هدف استفاده از یک درایو CD با سرعت تکسرعته (1x) و سختافزارهای ارزانقیمت دیگر (غیرقابلانعطاف) برای ساخت یک پخشکننده سختافزاری ارزان بود. به همین دلیل، محدودیتهایی برای تصویر و صدای مورد استفاده در ساخت VCD وجود دارد. نرخ بیت (Bitrate) برای تصویر ۱۱۵۲ کیلوبیت بر ثانیه و برای صدای MP2 برابر با ۲۲۴ کیلوبیت بر ثانیه است. شما مجاز به استفاده از گزینه -q یا اندازههای پویای GOP نیستید و بافر ویدئو به ۴۶ کیلوبایت محدود است. اندازه تصویر برای NTSC به 352x240 و برای PAL به 352x288 محدود شده است.
اگر پخشکننده اختصاصی VCD ندارید و قصد دارید از پخشکننده DVD خود استفاده کنید، کاملاً محتمل است که دستگاه DVD به اندازه کافی انعطافپذیر باشد تا نرخهای بیت بالاتر، اندازههای پویای GOP، بافر ویدئوی بزرگتر و موارد مشابه را بپذیرد.
مثال ایجاد صدای VCD
> lav2wav stream.avi │ mp2enc -V -o sound.mp2
گزینه -V خروجی سازگار با VCD 2.0 را اجباری میکند. در این حالت، نرخ نمونهبرداری صدا روی ۴۴.۱ کیلوهرتز ثابت است. همچنین میتوانید نرخ بیت صدا را برای صدای مونو روی ۶۴، ۹۶ یا ۱۹۲ کیلوبیت بر ثانیه انتخاب کنید. اگر صدای استریو دارید، میتوانید ۱۲۸، ۱۹۲، ۲۲۴ یا ۳۸۴ کیلوبیت بر ثانیه را انتخاب کنید. برای پخشکنندههای سختافزاری، باید به صدای استریوی لایه ۲ با نرخ ۴۴.۱ کیلوهرتز و ۲۲۴ کیلوبیت بر ثانیه پایبند بمانید.
مثال ایجاد تصویر VCD
> lav2yuv stream.avi │ yuvscaler -O VCD │ mpeg2enc -f 1 -r 16 -o video.mpg
برای خروجی سازگار با VCD، گزینه -f 1 تمام تنظیمات لازم را در mpeg2enc اعمال میکند. به نظر میرسد بسیاری از پخشکنندههای VCD (مانند Avex) قادر به پخش جریانهای MPEG کدگذاریشده با شعاع جستجوی بزرگتر از ۱۶ نیستند، بنابراین برای بازنویسی مقدار پیشفرض ۱۶ از گزینه -r استفاده نکنید.
> lav2yuv streams.eli │ mpeg2enc -f 1 -4 1 -2 1 -S 630 -B 260 -P -o video.m1v
استفاده از '-S 630' به این معنی است که mpeg2enc جریان را طوری نشانهگذاری میکند که mplex به ازای هر ۶۳۰ مگابایت، یک جریان جدید ایجاد کند. یک نکته مهم، استفاده از گزینه -B است که نرخ بیت دادههای غیرویدئویی (اطلاعات صدا و mplex) را مشخص میکند. مقدار ۲۶۰ برای -B برای صدایی با نرخ ۲۲۴ کیلوبیت و اطلاعات mplex مناسب خواهد بود. برای اطلاعات بیشتر، اسکریپتهای کدگذاری موجود در دایرکتوری scripts را بررسی کنید. جریانهای چندگانه (Multiplexed) باید به راحتی روی یک CD با ظرفیت ۶۵۰ مگابایت جا شوند.
مقدار پیشفرض (-B) برای ویدئو ۷۰۰ مگابایت است. اگر از گزینه -B برای تعیین مقدار متفاوتی استفاده نشود، mpeg2enc به صورت خودکار هر جریان را در آن اندازه نشانهگذاری میکند. اگر دیسک CD دارید که ظرفیت ذخیره داده بیشتری دارد (مثلاً تا ۸۰۰ مگابایت)، باید گزینه -S را تنظیم کنید؛ در غیر این صورت mpeg2enc جریان را روی ۷۰۰ مگابایت نشانهگذاری کرده و mplex جریان را در آن نقطه تقسیم میکند که مسلماً مورد نظر شما نیست.
مثال چندگانهسازی (Multiplexing) برای VCD
> mplex -f 1 sound.mp2 video.mpg -o vcd_out.mpg
گزینه -f 1 ویژگیهای خاص متعددی را فعال میکند که در حالت عادی در یک چندگانهساز استاندارد کاربردی ندارند!
ایجاد دیسک CD
جریانهای چندگانهشده باید به فرمت سازگار با VCD تبدیل شوند. این کار توسط vcdimager انجام میشود:
> vcdimager testvideo.mpg
این دستور فایل داده videocd.bin و فایل کنترل videocd.cue را ایجاد میکند که به عنوان فایل کنترلی برای cdrdao استفاده میشود.
شما از cdrdao برای رایت کردن ایمیج استفاده میکنید. ابزار cdrdao یکی دیگر از پروژههای خوب Sourceforge است.
نکات (Notes)
برای کدگذاری MPEG-1 یک برنامه معمولی (با مدتزمان حدود ۴۵ دقیقه) یا فیلم حدوداً ۹۰ دقیقهای ضبطشده از پخش آنالوگ، نرخ بیت ثابت حدود ۱۸۰۰ کیلوبیت بر ثانیه ایدهآل خواهد بود. فایل حاصل برای ۴۵ دقیقه حدود ۷۰۰ مگابایت میشود که به خوبی در یک ترک داده خام XA MODE2 روی دیسک CD-R جا میگیرد. برای منابع کاملاً دیجیتال (جریانهای DTV یا DVD و موارد مشابه)، نرخ VCD استاندارد یعنی ۱۱۵۲ به خوبی کار میکند.
نکته: اگر MPEG-1 با نرخ بیت متغیر (VBR با گزینه -q) کدگذاری میکنید، به یاد داشته باشید که سختافزارها احتمالاً برای پخش آن طراحی نشدهاند زیرا در مشخصات استاندارد وجود ندارد. اگر کار کرد بسیار خوشحال باشید. مشاهده شده است که وقتی یک جریان MPEG-1 دارید، معرفی آن به عنوان SVCD به vcdimager میتواند کمککننده باشد. ابزار vcdimager هشدار میدهد (اما فقط یک هشدار و نه خطای مهلک)، با این حال شما باید بتوانید آن را رایت کنید. این کار ممکن است فریمور دستگاه پخش را متقاعد کند از روالهای متفاوتی استفاده کرده و آن را به درستی پخش کند، اما هیچ تضمینی در این مورد وجود ندارد.
ذخیرهسازی فایلهای MPEG
اگر دادهها را به عنوان ترکهای XA mode 2 ضبط کنید، میتوانید مقدار قابلتوجهی داده بیشتر روی دیسک CD جا دهید (به قیمت کاهش تصحیح/تشخیص خطا). میتوانید از vcdimager برای این کار و از vcdxrip (بخشی از بسته vcdimager) برای استخراج (ریپ کردن) فایلهای حاصل استفاده کنید. برای کیفیت بالاتر، فرمتهای SVCD، XVCD و DVD وجود دارند.
در حال حاضر SVCD به طور کامل با یک فرمت از پیش تعیینشده در mplex و ابزارهایی برای ایجاد دیسکها پشتیبانی میشود. جریانهای MPEG قابل پخش توسط سختافزارها و نرمافزارهای پخشکننده DVD را میتوان به راحتی با استفاده از mpeg2enc/mplex تولید کرد.
اگر دستگاه شما از SVCD پشتیبانی نمیکند، ممکن است متوجه شوید که قادر به پردازش جریانهای VCD با نرخهای بیت بسیار بالاتر از استاندارد است. اغلب نرخهایی تا ۲۵۰۰ کیلوبیت بر ثانیه امکانپذیر است. چندین برند از پخشکنندههای DVD نیز میتوانند دیسکهای SVCD و VCD کاملاً خارج از استاندارد را پخش کنند. با نرخهای بیت بالاتر و منبع ورودی باکیفیت، ارزش دارد فلگ -h در mpeg2enc را امتحان کنید که جریانی به وضوح بالاترین حد مجاز استاندارد VCD تولید میکند.
با این حال، اگر دستگاه شما پشتیبانی میکند و صبر کافی برای زمانهای کدگذاری طولانیتر را دارید، SVCD جایگزین بسیار بهتری است. با استفاده از فرمت کارآمدتر MPEG، فرمت SVCD وضوح تصویر را نسبت به VCD بیش از دو برابر میکند، در حالی که معمولاً فایلهایی با حجمی کمتر از دو برابر تولید مینماید.
ایجاد SVCD (Creating SVCD)
فرمت Super Video CD (SVCD) نسخهای ارتقایافته از Video CD است که توسط کمیتهای از سازندگان و پژوهشگران با پشتیبانی دولت چین توسعه یافت. مشخصات نهایی SVCD در سپتامبر ۱۹۹۸ اعلام شد. توضیحات مناسبی از فرمت SVCD از سوی فیلیپس (Philips) ارائه شده است.
با وضوح کامل تلویزیونی ضبط کنید (به معنی -d 1 که برای PAL برابر با 720x576 است). وضوح SVCD برای NTSC برابر 480x480 و برای PAL برابر 480x576 است، بنابراین دلیل ضبط در اندازه کامل مشخص است.
مثال ایجاد صدای SVCD
> lav2wav stream.avi │ mp2enc -V -e -o sound.mp2
مشخصات SVCD امکان انتخاب گستره بسیار وسیعتری از نرخهای بیت صدا را فراهم میکند و نیازی نیست حتماً از ۲۲۴ کیلوبیت بر ثانیه استفاده شود. هر نرخ صدایی بین ۳۲ تا ۳۸۴ کیلوبیت بر ثانیه مجاز است. صدا میتواند VBR (نرخ بیت متغیر) باشد. گزینه -e محافظت خطای CRC را برای صدا فعال میکند. برای انطباق با استاندارد SVCD فعال بودن CRC الزامی است، اما به نظر میرسد بیشتر پخشکنندهها به اطلاعات CRC توجهی ندارند. اطلاعات CRC به ۲ بایت در هر فریم صوتی نیاز دارد.
فرمول تقریبی طول فریم برای MPEG-1 layer-II به صورت زیر است:
(طول فریم به بایت) = 144 * (نرخ بایت) / (نرخ نمونهبرداری)
در تنظیمات معمول VCD، دادههای CRC حدود ۰.۲۷٪ از کل دادهها را اشغال میکنند. در بدترین حالت که جریان MONO با نرخ بیت ۳۲ کیلوبیت باشد، دادههای CRC حدود ۱.۹۲٪ را مصرف میکنند.
مثال ایجاد تصویر SVCD
> lav2yuv stream.avi │ yuvscaler -O SVCD │ mpeg2enc -f 4 -q 7 -I 1 -V 200 -o video.m2v
تنظیمات mpeg2enc را روی SVCD قرار میدهد.
به mpeg2enc دستور میدهد جریانی با نرخ بیت متغیر (VBR) تولید کند.
به mpeg2enc اعلام میکند که سیگنال اصلی یک ویدئوی اینترلیس (Interlaced) است که در آن سطرهای فرد پیکسلها با فاصله نیمفریم پس از سطرهای زوج در هر فریم نمونهبرداری شدهاند. گزینه -I 0 (خروجی پیشرونده یا Progressive، بدون تصاویر میدانی) نیز برای PAL کار خواهد کرد.
میتوانید از نرخهای بیت پایینتر استفاده کنید اما استاندارد SVCD مجموع نرخ بیت (صدا و تصویر) را به ۲۷۸۸۸۰۰ بیت بر ثانیه محدود میکند. بنابراین با صدای ۲۲۴ کیلوبیت بر ثانیه و سربار ساختار، نرخ ۲۵۵۰ ممکن است اندکی لببهلب و فشرده باشد. از آنجا که فرمت SVCD هر نرخ صدایی بین ۳۲ تا ۳۸۴ کیلوبیت بر ثانیه را مجاز میداند، میتوانید با استفاده از صدای ۱۹۲ کیلوبیت (یا برای محتوای غیرموسیقی ۱۶۰ کیلوبیت) مقداری در بیتها صرفهجویی کنید.
فرمت SVCD از نرخ بیت متغیر (VBR) پشتیبانی میکند، زیرا MPEG-2 معمولاً VBR است، اما با سقف نرخ بیت ویدئویی ۲۵۰۰ کیلوبیت بر ثانیه. با فلگ -f 4 انکودر همچنین GOP پویا با حد پایین -g 6 و حد بالای -G 18 را تنظیم میکند. این کار مقداری بیت در ثانیه ذخیره کرده و کیفیت تصویر را هنگام تغییر صحنهها بهبود میبخشد. هنگام کدگذاری با -f 4 ابزار mpeg2enc گزینههای نرخ بیت ویدئو (-b) و شعاع جستجو (-r) را نادیده میگیرد. اگر از -f 5 استفاده کنید، باید نرخ بیت و سایر گزینهها را به mpeg2enc مشخص نمایید.
امکان دیگر برای فیلمها با سیستم ویدئویی PAL (سبک اروپایی ۲۵ فریم / ۵۰ میدان در ثانیه):
> lav2yuv stream.avi │ yuvscaler -O SVCD │ mpeg2enc -f 4 -I 0 -V 300 -o video.m2v
فیلمهای سینمایی با سرعت ۲۴ فریم در ثانیه فیلمبرداری میشوند. برای پخش PAL، فیلم صرفاً با سرعت کمی «بیش از حد سریع» معادل ۲۵ فریم در ثانیه نمایش داده میشود (که موجب ناراحتی افرادی با حس شنوایی دقیق زیروبمی صدا است). فلگ -I 0 محاسبات خستهکننده مورد نیاز برای جبران اینترلیس میدانی را خاموش کرده و کدگذاری بسیار سریعتری ارائه میدهد.
متأسفانه برای فیلمهای پخششده در NTSC (سبک آمریکایی ۳۰ فریم / ۶۰ میدان در ثانیه) این کار فشردهسازی بسیار ضعیفی ایجاد میکند. نمونهبرداری «Pulldown» مورد استفاده برای تولید ۶۰ میدان در ثانیه از یک فیلم ۲۴ فریم در ثانیهای به این معنی است که نیمی از فریمها در NTSC واقعاً اینترلیس میدانی *هستند*.
گزینههای -S و -B ذکرشده در بالا را فراموش نکنید. میخواهید جریان روی دیسک CD جا شود، مگر نه؟
مثال چندگانهسازی SVCD
> mplex -f 4 -b 300 -r 2750 sound.mp2 video.m2v -o svcd_out.mpg
به mplex دستور میدهد یک SVCD چندگانهسازی کند.
نرخ بیت محاسبهشده مجموع صدا + تصویر + ۱ تا ۲ درصد اطلاعات چندگانهسازی است.
بافر در دسترس روی دستگاه پخش است (همان مقداری که برای کدگذاری ویدئو در گزینه -V ابزار mpeg2enc استفاده شده است).
ایجاد دیسک SVCD
مثال:
> vcdimager -t svcd testvideo.mpg
این دستور فایل داده videocd.bin و فایل کنترل videocd.cue را ایجاد میکند که به عنوان فایل کنترلی برای cdrdao استفاده میشود.
همانطور که قبلاً گفته شد از cdrdao برای رایت ایمیج استفاده کنید.
نکته: اگر میخواهید VCD/SVCD «سفارشی» بسازید، باید از سوییچهای -f 2 و -f 5 در mplex استفاده کنید.
نکته: قابلیتهای VCD و SVCD ممکن است روی دستگاه پخش سختافزاری شما کار کنند یا نکنند. گزارشهای زیادی وجود دارد مبنی بر اینکه به خوبی کار میکند. اگر کار نکرد نگران نباشید. همچنین مسئولیتی در قبال CDهای غیرقابل استفاده (دیسکهای سوخته) متوجه ما نیست.
ایجاد DVD (Creating DVDs)
این جمله چند سال پیش درست بود: همه چیز در این بخش جدید است. محدودیتهایی که در اینجا اشاره میکنم ممکن است در نسخه فعلی وجود نداشته باشند. در حال حاضر ایجاد DVD به خوبی کار میکند.
بدیهی است که به یک درایو رایتر DVD نیاز دارید. قبلاً یک Ricoh DVD+RW داشتم که کار میکرد، و از یک رایتر DVD-RAM اطلاع دارم که قادر به رایت DVD-R بود. آن دیسکها نیز با پخشکننده DVD کار میکردند. اکنون اکثر درایوهای رایتر DVD قادر به رایت هر دو نوع دیسک + و - هستند، بنابراین این مورد دیگر نباید مشکلی ایجاد کند. اینکه از چه برنامههایی برای رایت استفاده میکنید، به درایو رایتر DVD شما بستگی دارد.
برای ایجاد و نوشتن فایلهای VOB، IFO و BUP از dvdauthor استفاده میکنیم (قابل دریافت از Sourceforge).
مثال ایجاد صدای DVD
> lav2wav stream.eli │ mp2enc -o sound.mp2
نرخ نمونهبرداری باید ۴۸ کیلوهرتز باشد. ابزار mp2enc به طور پیشفرض نرخ نمونهبرداری ۴۸ کیلوهرتز را ایجاد میکند. اگر ۴۸ کیلوهرتز نباشد، mp2enc صدا را مجدداً نمونهبرداری (Resample) میکند تا به این نرخ برسد. اگر صدا با نرخ ۴۸ کیلوهرتز ضبط شده باشد، نیازی به نمونهبرداری مجدد نیست و میتوان از toolame برای کدگذاری استفاده کرد (که سریعتر از mp2enc است).
مثال ایجاد تصویر DVD
> lav2yuv stream.eli │ mpeg2enc -f 8 -o video.m2v
این گزینه تنظیمات را به درستی برای یک ویدئوی MPEG-2 منطبق با استاندارد DVD تنظیم میکند. حداکثر نرخ بیت روی ۷۵۰۰ کیلوبیت بر ثانیه و اندازه بافر ویدئو روی ۲۳۰ کیلوبایت تنظیم میشود. ضریب کیفیت پیشفرض روی ۸ قرار میگیرد. ابزار mpeg2enc در حال حاضر طول سکانس خودکار را مانند آنچه برای VCD/SVCD انجام میدهد، تنظیم نمیکند.
سایر گزینهها برای به دست آوردن نرخ بیت پایین و جریانی باکیفیت بالا نیز میتوانند برای بازنویسی تنظیمات پیشفرض بالا استفاده شوند. همچنین در صورتی که داده ورودی دارای نویز باشد (مثلاً از نوار VHS)، میتوانید از yuvdenoise برای افزایش کیفیت تصویر استفاده کنید. یک دستور نمونه به این صورت خواهد بود:
lav2yuv moby.eli │ yuvdenoise │ mpeg2enc -f 8 -q 7 -4 1 -2 1 -P -I 0 -N -o video_DVD.m2v
مثال چندگانهسازی DVD
> mplex -f 8 sound.mp2 video.m2v -o my_dvdlikestream.mpg
در اینجا مجدداً مشخص میکنیم که جریانی از نوع MPEG شبیه به DVD میخواهیم. ابزار mplex نمیتواند تمام ویژگیهای پیشرفته مجاز برای DVD را پیادهسازی کند، اما خروجی به اندازه کافی نزدیک است که دستگاههای پخش DVD سختافزاری آن را بپذیرند.
در اینجا نام فایل خروجی را تعیین میکنیم.
مثال ایجاد ساختار نهایی DVD
این مبحث در مستندات برنامه dvdauthor پوشش داده میشود. به طور کلی روال کار به این صورت است:
> dvdauthor -o output/ stream1.mpg stream2.mpg ... my_dvdlikestream.mpg; dvdauthor -T -o output/
یک دایرکتوری شامل پوشههای AUDIO_TS و VIDEO_TS دریافت خواهید کرد. رایت دادهها از دیسک به یک رایتر DVD+-R/+-RW به این شکل انجام میشود:
growisofs -Z /dev/scd2 -dvd-video mydvd/
اگر یک درایو DVD+RW/+R دارید، میتوانید اطلاعات بیشتر را در مستندات مربوطه بیابید. همچنین به نسخهای از cdrtools با پشتیبانی از dvd-video نیاز دارید. نسخه cdrtools 1.11a27 کارایی مناسبی دارد اما نسخههای جدیدتر نیز در دسترس هستند.
برای سایر رایترها، دستورات رایت DVD متفاوت خواهد بود. میتوانید اطلاعات بیشتری را در بسته dvdauthor کسب کنید. هیچ تضمینی وجود ندارد که روی همه دستگاهها کار کند!
ایجاد ویدئوهای DIVX (Creating DIVX Videos)
lav2avi.sh
روش دیگر برای ایجاد DIVX، استفاده از برنامه mencoder از پروژه mplayer است. برای اطلاعات بیشتر در مورد mencoder لطفاً مستندات و راهنمای mencoder/mplayer را مطالعه کنید. گذر اول و دوم در پایان کار، راهنماییهایی درباره نرخ بیت ارائه میدهند که میتواند برای کدگذاری در اندازه مشخص (۶۵۰ مگابایت، ۷۰۰ مگابایت و ۸۰۰ مگابایت) استفاده شود. اسکریپت lav2avi.sh در صورت ارائه این اطلاعات از آنها استفاده میکند (برای جریانهای کوتاه توسط mencoder نادیده گرفته میشود). به دنبال پارامتر preferedSize در اسکریپت بگردید. همچنین میتوانید پارامترهای دیگر کدگذاری را با گزینه encoderParam در اسکریپت مشخص کنید. برای شرح پارامترهای قابل استفاده، به راهنمای mplayer/mencoder مراجعه نمایید.
نام فایل خروجی همان نام فایل ورودی شما (گزینه اول) خواهد بود اما با پسوند avi. اگر حجم فایل کمتر از مقدار مشخصشده در preferedSize باشد، به این دلیل است که منبع از کیفیت بسیار بالایی برخوردار بوده (بدون نویز) و نرخ بیت تعیینشده بالاتر از حد نیاز بوده است. معمولاً برای یک فیلم ۱.۵ ساعته با نصف اندازه تصویر و نرخ بیت حدود ۹۰۰ حجم ۷۰۰ مگابایت به دست میآورید که برای divx کیفیت خوبی محسوب میشود (البته به شرط کیفیت مناسب منبع).
این اسکریپت یک کدگذاری ۳ مرحلهای انجام میدهد:
مرحله اول - کدگذاری صدا
مرحله دوم - گذر اول تصویر
مرحله سوم - گذر دوم تصویر
مستندات mplayer/mencoder استفاده از روش کدگذاری ۳ مرحلهای را منسوخ دانسته (زیرا ممکن است باعث مشکلات همگامسازی صدا و تصویر شود) و استفاده از روش ۲ مرحلهای را توصیه میکند. مستندات mencoder/mplayer جامع بوده و حاوی نکات مفید بسیاری است (همچنین یک ماشینحساب نرخ بیت در دایرکتوری TOOLS/).
برای کدگذاری از کدک سریع ffmpeg (lavc) استفاده کنید. این کدک نتایج عالی را به همراه کارایی بسیار بالا ارائه میدهد. برای کدگذاری صدا از mp3 استفاده میشود. برای کدگذاری تمام بخشها از پایپهای یونیکس (Pipes) استفاده میشود. این بدان معناست که شما به فضای اضافی روی دیسک سخت خود برای انجام تمام تغییرات glav نیاز ندارید. برای کدگذاری صدا، اسکریپت از یک صف FIFO استفاده میکند.
اگر میخواهید اسکریپت را بر اساس نیازهای خود تغییر دهید، از این نکات استفاده کنید:
خروجی مرحله اول فایلی به نام frameno.avi با صدای کدگذاریشده است.
مرحله دوم از frameno.avi استفاده میکند و خروجی آن یک فایل متنی به نام lavc_stats.txt حاوی اطلاعات زمانبندی است.
مرحله سوم از frameno.avi و lavc_stats.txt برای کدگذاری جریان به فایل خروجی movie2.avi استفاده میکند.
اگر فقط میخواهید نرخ بیت ویدئو را تغییر دهید، فایل frameno.avi را نگه دارید، کدگذاری مرحله اول را کامنت کنید و مرحله دوم و سوم را تکرار نمایید. فراموش نکنید خطی را که در آن frameno.avi حذف میشود، بردارید.
بهینهسازی جریان (Optimizing the stream)
استفاده از فیلترها به افزایش کیفیت تصویر در جریانهای ویدئویی با نرخ بیت ثابت (CBR) کمک میکند. در ویدئوهای با نرخ بیت متغیر (VBR)، حجم فایل کاهش مییابد.
مثال:
> lav2yuv stream.avi │ yuvmedianfilter │ mpeg2enc -o video.m1v
در اینجا برنامه yuvmedianfilter برای بهبود تصویر استفاده میشود. این کار مقداری از نویز فرکانس پایین را در تصاویر حذف میکند. همچنین تصویر را کمی نرم (Soft) میکند. این فیلتر یک نقطه مرکزی را در نظر گرفته و میانگین پیکسلهای اطراف آن را که در آستانه تعیینشده قرار دارند محاسبه میکند. سپس پیکسل مرکزی را با این مقدار جدید جایگزین مینماید. همچنین میتوانید از گزینه -r (شعاع) برای تعیین شعاع جستجوی دیگر استفاده کنید.
نکته: شعاع بزرگتر از مقدار پیشفرض ۲ به شدت کند است!
ابزار yuvmedianfilter دارای تنظیمات جداگانه برای روشنایی (Luma) و رنگ (Chroma) است. میتوانید شعاع جستجو و آستانه تحریک را به طور مستقل کنترل کنید. اگر از آستانه ۰ استفاده کنید، فیلترسازی غیرفعال میشود (-t 0 فیلتر روشنایی را غیرفعال میکند و -T 0 فیلتر رنگ را غیرفعال میسازد).
> lav2yuv stream.avi │ yuvmedianfilter -r 3 -t 4 -T 0 │ mpeg2enc -o video.m1v
این مثال از شعاع جستجوی ۳ پیکسل برای روشنایی (Luma)، آستانه ۴ (پیشفرض ۲ است) استفاده کرده و فیلترسازی را برای مؤلفههای رنگ (Chroma) غیرفعال میکند. گاهی اوقات، بسته به منبع ورودی، فیلتر میانه روی رنگ میتواند باعث تغییر جزئی رنگ به سمت سبز شود. فیلترسازی روی مؤلفه روشنایی (و غیرفعال کردن فیلتر رنگ) راهحل این مشکل است.
مثال:
> lav2yuv stream.avi │ yuvdenoise │ mpeg2enc -o video.m1v
اکنون از yuvdenoise برای بهبود تصویر استفاده میکنیم. این فیلتر عمدتاً نویز رنگ و روشنایی و پرش ناشی از خطاهای فاز را کاهش میدهد، اما در حذف لکهها و خالهای ریز نیز مؤثر است.
ابزار yuvdenoise در صورتی که ورودی اینترلیس باشد، نویززدایی را به صورت اینترلیس انجام میدهد. البته میتوانید آستانه نویززدا را تغییر دهید (-g/t). ایجاد حاشیه مشکی میتواند نرخ بیت جریان کدگذاریشده را کاهش دهد، زیرا نواحی کاملاً سیاه بسیار بهتر از نویز فشرده میشوند (تصاویر ضبطشده از منابع آنالوگ مانند VHS و 8mm معمولاً چندین خط در بالا و پایین دارند که بسیار پرنویز هستند). برای این کار میتوانید از مقیاسدهنده (Scaler) استفاده کنید.
ابزار yuvdenoise از روش متفاوتی برای فیلتر کردن نویز استفاده میکند. اطلاعات بیشتر درباره نحوه عملکرد yuvdenoise و همچنین شرح گزینههای آن در صفحه راهنمای آن آمده است.
اگر منبعی باکیفیت بالا دارید، باید فیلتر را به سطوحی مانند این کاهش دهید: -g 0,255,255 -t 2,2,2. همچنین میتوانید از گزینه -h/--keep-hf در mpeg2enc استفاده کنید. این گزینه به mpeg2enc دستور میدهد تا حد امکان اطلاعات فرکانس بالا را حفظ کند. استفاده از -h نرخ بیت (حجم فایل) را به شدت افزایش میدهد. اگر نرخ بیت بیش از حد به حداکثر مجاز (تنظیمشده با -b) نزدیک شود، انکودر مجبور است برای جلوگیری از فراتر رفتن از حداکثر نرخ بیت، کیفیت را کاهش دهد.
یک فیلتر داخلی در mpeg2enc گزینه -N/--reduce-HF است. این گزینه در واقع یک فیلتر به معنای معمول نیست؛ بلکه نحوه کدگذاری دقیق اطلاعات فرکانس بالا را تغییر میدهد. اغلب فرکانسهای بالا نویز هستند. همچنین در مرزها یا گذارهای تیز، فرکانسهای بالا وجود دارند. گزینه -N میتواند مقادیری بین ۰.۰ و ۲.۰ داشته باشد که در آن ۰.۰ هیچ کاری انجام نمیدهد (تقویت کوانتیزهکننده فرکانس بالا را غیرفعال میکند) و ۲.۰ حداکثر تقویت کوانتیزاسیون را اعمال مینماید. مقدار مناسب به کیفیت خروجی و حجم فایل مورد نظر بستگی دارد. مقادیر -N کمتر از ۰.۵ تأثیر بسیار نامحسوسی دارند، در حالی که مقدار ۱.۰ تعادل خوبی بین کاهش نرخ بیت و کیفیت خروجی برقرار میکند. استفاده از مقادیر -N بالاتر از ۱.۵ وضوح تصویر خروجی را به طور محسوسی کاهش میدهد و معمولاً فقط برای منابع بیکیفیت (مانند نوارهای VHS) استفاده میشود.
استفاده از قابلیت yuvmedianfilter برای فیلتر کردن صرف رنگ (-T) به طور متوسط در کاهش نویز در صحنههای تاریک مؤثر است، بدون اینکه تصویر را در صحنههای معمولی (روشنتر) نرم و تار کند. فیلتر میانه روشنایی (-t) نرخ بیت پایینتری ایجاد میکند اما میتواند باعث از دست رفتن جزئیات (نرم شدن تصویر) شود. فیلتر میانه فقط رنگ، کمتر تهاجمی است و انتخاب خوبی برای استفاده در ترکیب با yuvdenoise محسوب میشود.
ترکیب فیلترهای yuvdenoise، yuvmedianfilter و گزینه -N در mpeg2enc کنترل بسیار دقیقی بر نرخ بیت (حجم فایل) فراهم میکند. میزان کاهش (یا افزایش) نرخ بیت به منبع ورودی و گزینههای دقیق کدگذاری/فیلتر مورد استفاده بستگی دارد. بنابراین نمیتوان اعداد دقیقی برای میزان کاهش حجم فایل توسط هر گزینه و ترکیب ارائه داد، بلکه صرفاً خطوط راهنما قابل ذکر است.
معمولاً باید از گزینه -N در بازه ۰.۵ تا ۱.۵ استفاده کنید. کمتر از ۰.۵ نرخ بیت را چندان کاهش نمیدهد (اما وضوح را حفظ میکند). در ۱.۵ و بالاتر متوجه نرم شدن ویدئو و احتمالاً آثار مصنوعی (هاله/حلقه) در اطراف لبههای اشیاء (بهویژه متن/زیرنویس) خواهید شد. اگر فیلترها را ترکیب میکنید، باید از yuvdenoise و شاید پس از آن از yuvmedianfilter استفاده کنید؛ حتی شاید yuvmedianfilter پس از مقیاسبندی (Scaling). قرار دادن yuvmedianfilter در زنجیره پردازش، نرخ بیت را خیلی کاهش نمیدهد. اغلب استفاده از yuvdenoise کافی است. ابزار yuvmedianfilter در صورت داشتن منابع کمکیفیت بسیار کمک میکند و در صورت داشتن کیفیت نسبتاً خوب، تأثیر چندانی ندارد. هنگامی که فیلتر و گزینهها را ترکیب میکنید، به احتمال زیاد حجم فایل را به حدود نصف حجم فایل بدون استفاده از این گزینهها و برنامهها کاهش خواهید داد.
به طور کلی، فیلترسازی تهاجمی فایلهای کوچکتری (نرخ بیت پایینتر) تولید میکند اما کیفیت (جزئیات) تصویر را کاهش میدهد. فیلترسازی/پردازش کمتر تهاجمی جزئیات بیشتری را حفظ میکند اما منجر به فایلهای بزرگتر میشود.
مثال:
> lav2yuv stream.avi │ yuvkineco -F 1 │ mpeg2enc -o video.m1v
ابزار yuvkineco برای منابع NTSC استفاده میشود. این ابزار تبدیل نرخ فریم از 30000.0/1001.0 (حدود ۲۹.۹۷) فریم بر ثانیه به 24000.0/1001.0 (حدود ۲۳.۹۷۶) فریم بر ثانیه را انجام میدهد که میتوان آن را «معکوس 2-3 pulldown» نامید؛ اطلاعات بیشتر در این مورد در README.2-3pulldown آمده است. ابزار yuvkineco فقط مشکلات خاص NTSC را برطرف میکند.
اگر میخواهید تصویر را بهبود بخشید، باید از yuvdenoise نیز استفاده کنید:
> lav2yuv stream.avi │ yuvkineco │ yuvdenoise │ mpeg2enc -o video.m1v
مثال:
> lav2yuv stream.avi │ yuvycsnoise │ mpeg2enc -o video.m1v
ابزار yuvycsnoise نیز برای NTSC استفاده میشود و در رفع نویز تفکیک Y/C در NTSC تخصص دارد. اگر سختافزار ضبط ویدئو دارای تفکیککننده Y/C ضعیفی باشد، در خطوط عمودی (بهویژه قرمز/آبی) نویزهایی ظاهر میشوند که شبیه پرچم شطرنجی بوده و در هر فریم روشن/تاریک معکوس میشوند. ابزار yuvycsnoise نویزهای این چنینی را کاهش میدهد. همچنین میتوانید از آستانههای مختلف برای روشنایی/رنگ و روش بهینهسازی استفاده کنید. این فیلتر هنگام کار با دادههای DV (ویدئوی دیجیتال) مورد نیاز نیست.
ابزار yuvycsnoise فقط در صورتی درست کار میکند که NTSC با مشخصات زیر داشته باشیم:
ارتفاع کامل (۴۸۰ خط)
ضبط با حرکت کامل (۲۹.۹۷ فریم بر ثانیه)
ضبطشده با سختافزار تفکیککننده Y/C ضعیف
برای اطلاعات بیشتر در مورد yuvkineco و yuvycsnoise فایل README را در دایرکتوری yuvfilters بخوانید.
اگر میخواهید برای تعیین تنظیمات بهینه نویززدا، مقیاسدهنده و غیره آزمایش کنید، yuvplay را جایگزین mpeg2enc کنید. ابزار yuvplay فریمهای yuv را پخش میکند تا بتوانید ببینید آیا گزینههای انتخابی شما وضعیت را بهتر یا بدتر میکنند.
یک دستور نمونه به این صورت خواهد بود:
> lav2yuv stream.eli │ yuvdenoise -options │ yuvscaler -options │ yuvplay
اگر میخواهید بدانید هر ابزار چقدر میانگین نرخ بیت را کاهش میدهد، میتوانید از این جدول استفاده کنید تا ببینید در صورتی که یک ویدئوی با اندازه کامل داشته باشید و بخواهید یک DVD با ضریب کیفیت ۵ و حداکثر نرخ بیت مجاز ۸۵۰۰ کیلوبیت بر ثانیه ایجاد کنید، چه انتظاری میتوانید داشته باشید:
بدون نویززدایی: ۸۳۰۰ کیلوبیت بر ثانیه (عمدتاً نزدیک به حد بالا)
فیلتر yuvdenoise به تنهایی: ۷۷۰۰ کیلوبیت بر ثانیه
گزینه mpeg2enc --reduce-hf به تنهایی: ۷۴۰۰ کیلوبیت بر ثانیه
ترکیب yuvdenoise + yuvmedianfilter برابر: ۶۰۰۰ کیلوبیت بر ثانیه
ترکیب yuvdenoise + mpeg2enc --reduce-hf برابر: ۴۹۰۰ کیلوبیت بر ثانیه
تمام موارد فوق با هم: ۳۶۰۰ کیلوبیت بر ثانیه
در حالی که -N│--reduce-hf یا yuvdenoise به تنهایی فقط بهبود متوسطی ایجاد میکنند، همراه با هم نرخ بیت را به میزان قابل توجهی کاهش میدهند. تفاوت بصری چندانی بین استفاده از yuvdenoise به تنهایی و yuvdenoise همراه با mpeg2enc --reduce-hf وجود ندارد. مقادیر مفید بین ۰.۰ و ۱.۵ هستند. میتوان گفت هر چه ضریب کیفیت بالاتری بخواهید، این گزینه بهبود کمتری ایجاد میکند. در ضریب کیفیت ۴ با استفاده از -N 1.0 حدود ۱٪ صرفهجویی میکنید. اگر ضریب کیفیت ۹ بخواهید و از -N 1.0 استفاده کنید، ممکن است تا ۴۰٪ صرفهجویی کنید. اما ممکن است کمتر هم صرفهجویی شود، که به ویدئویی که کدگذاری میکنید بستگی دارد!
اگر از خود میپرسید چرا نباید همیشه از تمام فیلترهای فوق استفاده کرد؟ پاسخ این است که تصویر نرم میشود (از دست رفتن جزئیات) و زمان کدگذاری افزایش مییابد. بیشتر این فیلترها هر کدام تقریباً به همان اندازه زمانی نیاز دارند که mpeg2enc برای کدگذاری ویدئو صرف میکند.
از طرف دیگر، اگر محتوایی با کیفیت بسیار بالا دارید و میخواهید تمام جزئیات حفظ شوند، باید از mpeg2enc --keep-hf│-h استفاده کنید.
نکته: کاهش نرخ بیت به دست آمده به منبع ورودی و نویز تصاویر بستگی دارد.
یکی دیگر از گزینههای جالب mpeg2enc گزینه -E│--unit-coeff-elim است. این گزینه به طور پیشفرض غیرفعال است. اگر آن را فعال کنید، یک الگوریتم ویژه به نام «حذف ضرایب واحد» (Unit Coefficient Elimination) روی بلوکهای تصویر کدگذاریشده اعمال میشود. اساساً این روش بلوکهایی از نوعی را که حامل اطلاعات زیادی نیستند (اما بیتهای زیادی برای کدگذاری مصرف میکنند) مجبور به نادیده گرفته شدن (Skip) میکند. یک مقدار منفی، ضرایب پایه (DC) و متناوب (AC) را بررسی میکند. یک مقدار مثبت بدان معنی است که فقط ضرایب بافت (AC) بررسی شده و احتمالاً صفر میشوند. مقادیر توصیهشده بین ۲۰- و ۲۰+ است. معمولاً میتوانید انتظار کاهش ۵ درصدی حجم فایل را داشته باشید. میزان کاهش نرخ بیت میتواند به طور قابلتوجهی متغیر باشد و دامنه آن از تقریباً نامحسوس تا ۲۰٪ گسترده است.
اگر فکر میکنید ماتریس کوانتیزاسیون متفاوتی کمک میکند، از گزینه -K│--custom-quant-matrices استفاده کنید. میتوانید ماتریس کوانتیزاسیون خود را امتحان کنید یا از ماتریسهای داخلی دیگر به جای پیشفرض استفاده نمایید. میتوانید بین kvcd، tmpgenc، hi-res و ماتریس اختصاصی خود انتخاب کنید. استفاده از -K معمولاً فایل را کوچکتر میکند، به جز گزینه hi-res (که فایلها را به طور قابلتوجهی بزرگتر میکند). ارائه دستورالعملهای دقیق دشوار است؛ گاهی یک ماتریس کوانتیزاسیون دیگر تقریباً هیچ بهبودی ندارد و بار دیگر تا ۲۰٪ صرفهجویی ایجاد میکند. بیش از ۲۰٪ بسیار بعید است و ۱۰ تا ۱۵ درصد در ضریب کیفیت متوسط (-q 8-10) محتمل است. هر چه کیفیت بالاتر باشد صرفهجویی کمتر است؛ در ضریب کیفیت ۴ تا ۶ کاهش نرخ بیت ممکن است تنها ۵٪ باشد.
نکتهای که باید به خاطر داشت این است که حذف ضرایب واحد و گزینه ماتریس کوانتیزاسیون در عین حفظ همان کیفیت بصری، نرخ بیت را کاهش میدهند. در این مرحله میتوانید از فایل کوچکتر برای افزایش مدتزمان ویدئویی که روی رسانه دیسک جا میشود استفاده کنید، یا میتوانید با کاهش مقدار -q به میزان ۱ واحد، کیفیت را باز هم افزایش دهید و فایلی بزرگتر (اما با کیفیتی بالاتر) بسازید.
تغییر مقیاس و اصلاح آفست (Scaling and offset correction)
تغییر مقیاس پایهای در بخش تبدیل ویدیو (Converting video) شرح داده شده است.
تغییر مقیاس بخشی از تصویر را گرفته و آن را به اندازهای بزرگتر یا کوچکتر مقیاسبندی میکند. تغییر مقیاس توسط yuvscaler انجام میشود:
lav2yuv test.eli │ yuvscaler -I USE_400x400+50+100 │ yuvplay
در اینجا فقط بخشی از تصویر را میگیریم و آن را به اندازه فریم اصلی بزرگنمایی میکنیم. اما yuvscaler نسبت ابعاد پیکسل را نیز تغییر میدهد. بدین معنی که هنگام مشاهده جریان با استفاده از yuvplay، در مثال ما به شکل یک مربع به نظر میرسد. پس از مقیاسبندی، اگر نسبت ابعاد نمونه (پیکسل) تغییر نمیکرد، ویدیو با نسبت ابعاد مناسب نمایش داده نمیشد. Yuvscaler این مورد را با تنظیم نسبت ابعاد نمونه جبران میکند. اگر ویدیوی اینترلیس دارید، در صورتی که ویدیو اینترلیس باشد ارتفاع و HeightOffset باید مضربی از ۴ باشند. در غیر این صورت مقادیر (عرض، ارتفاع، widthoffset، heightoffset) باید مضربی از ۲ باشند.
مشکلی که با تغییر مقیاس به آسانی حل نمیشود، زمانی است که تصویر به صورت افقی در مرکز قرار ندارد. برای مثال در یک سمت هیچ پیکسل سیاهی ندارید و در سمت دیگر ۳۰ پیکسل سیاه دارید. تغییر مقیاس در اینجا راهکار اشتباهی است. ابزار y4mshift راهکار عالی است زیرا میتواند تصویر را به چپ یا راست شیفت دهد.
lav2yuv test.eli │ y4mshift -n 20 │ mpeg2enc -f 3 -b 4000 -q 10 -o video.m2v
این دستور تصویر را ۲۰ پیکسل به سمت راست جابهجا میکند. اگر از عدد منفی استفاده کنید، تصویر به سمت چپ جابهجا میشود. باید از یک عدد زوج استفاده کنید. پیکسلهای درجشده به رنگ سیاه تنظیم میشوند.
شاید برخی بپرسند چرا تصویر در مرکز قرار ندارد و هنگام مشاهده آنچه ضبط کردهاید، یک حاشیه سیاه دور تصویر وجود دارد. دلیل حاشیه سیاه در تاریخچه فناوری تلویزیونهای CRT (لامپ پرتو کاتدی) نهفته است. تاریخچه استاندارد تلویزیون داستان بسیار جالبی است اما این مبحث در کتابهای دیگر (و قطور) شرح داده شده است.
تلویزیون تصویر کامل را نشان نمیدهد. بخشی از تصویر نشان داده نمیشود زیرا تلویزیونها دارای اوراسکن هستند (گاهی تا ۱۰٪ اما امروزه ۵٪ رایجتر است). اما وقتی ویدیو را با یک کارت ضبط میکنید، کل تصویر را به همراه حاشیهای که تلویزیونها به دلیل اوراسکن از دست میدهند مشاهده میکنید. آفست افقی معمولاً مشکلی از سوی کارت کپچر نیست. این مشکل زمانی رخ میدهد که فیلم پخش تلویزیونی شده و به خوبی با تصویر همگام نیست. بدین معنی که اسکن منبع دقیقاً با سیگنال حامل همگام نیست؛ شما این را در تلویزیون نخواهید دید.
تبدیل نرخ فریم (Frame rate conversion)
آیا تا به حال نیاز به تبدیل نرخ فریم از PAL به NTSC یا برعکس داشتهاید؟ یا چیزی بسیار سادهتر مانند تبدیل نرخ فریم از 24FPS به 24000:1001 برای تبدیل نرخ فریم فیلم سینمایی به نرخ فریم معتبر NTSC.
در این صورت yuvfps برنامه مدنظر شماست. این برنامه میتواند با حذف فریمها نرخ فریم را کاهش دهد یا با تکرار فریمها نرخ فریم بالاتری ایجاد کند. اگر نرخ فریم نادرستی در هدر دارید، میتوانید تنها هدر جریان YUV را تغییر دهید بدون اینکه خود جریان را دستکاری کنید.
از آنجا که فریمها فقط تکرار (کپی) میشوند، باید ابتدا نویزگیری کنید و سپس نرخ فریم را تغییر داده و در آخرین مرحله مقیاسبندی را انجام دهید. اگر منبع اینترلیس دارید باید پیش از تغییر نرخ فریم، دیاینترلیس نیز بکنید. اگر نرخ فریم بالاتری ایجاد کنید، به احتمال زیاد هنگام پخش پرشها و چشمکزدنهای عجیبی خواهید داشت. اگر PAL را به NTSC (30000:1001 FPS حدود ۲۹٫۹۷ FPS) تبدیل کنید، نرخ فریم تقریباً با ضریب 480/576 (خطوط NTSC / خطوط PAL) کاهش مییابد. اگر نرخ فریم را از PAL به NTSC (در 24000:1001) یا NTSC FILM (24FPS) کاهش دهید، بیتریت تقریباً برابر خواهد بود با: (480 Lines * 24 FPS) / (576 Lines * 25FPS). اگر پیش از نویزگیری نرخ فریم را تغییر دهید، yuvdenoise در یافتن نویز میان فریمها دچار مشکل خواهد شد و پهنای باند مورد نیاز اندکی افزایش مییابد.
مثال:
> lav2yuv video.eli │ yuvfps -r 30000:1001 │ yuvscaler -O SVCD │ mpeg2enc -f 4 -o video_ntsc_svcd.m2v
این مثالی برای تبدیل ویدیوی منبع به یک ویدیوی NTSC با سرعت 30000:1001 FPS (یا حدود ۲۹٫۹۷ فریم بر ثانیه) در اندازه SVCD است.
مثال:
> lav2yuv video.eli │ yuvdenoise │ yuvfps -r 24000:1001 │ yuvscaler -O SIZE_720x480 │ mpeg2enc -f 3 -b 4000 -q 7 -o video_ntsc.m2v
این مثال نحوه استفاده صحیح از ابزارها را نشان میدهد. ابتدا نویزگیری کنید، سپس نرخ فریم را تغییر دهید و در آخرین مرحله اندازه تصویر را تغییر دهید.
ممکن است پیش بیاید که yuvscaler یا mpeg2enc استاندارد تلویزیونی را به درستی تشخیص ندهند. در این صورت باید گزینه تعیین استاندارد -n n/p/s را به برنامهای که استاندارد اشتباه را انتخاب کرده اضافه کنید.
اگر میدانید که هدر نرخ فریم نادرستی را گزارش میدهد، میتوانید به سادگی نرخ فریم هدر yuv را به این شکل تغییر دهید:
> lav2yuv video.eli │ yuvfps -r 25:1 -c │ mpeg2enc -f 3 -b 4000 -q 7 -o video_pal.m2v
به گزینه -c نیاز دارید تا به yuvfps بگویید فقط باید هدر جریان را تغییر دهد. با -r 25:1 به yuvfps میگویید چه نرخ فریمی را باید در هدر بنویسد؛ در مثال شما نرخ فریم PAL یعنی 25 FPS. همیشه باید از فرم کسری استفاده کنید.
اگر میدانید که هدر اشتباه است و به بیتریت خروجی متفاوتی نیاز دارید، میتوانید این کار را در یک مرحله انجام دهید:
> lav2yuv video.eli │ yuvfps -s 24:1 -r 25:1 │ mpeg2enc -o video.m1v
تبدیل کد MPEG-2 موجود (Transcoding of existing MPEG-2)
برای تبدیل کد (ترنسکد) جریانهای MPEG-2 موجود از کارتهای تلویزیون دیجیتال یا DVD، نرخ دادهای پایینتر از پخش تلویزیونی نتایج خوبی به همراه خواهد داشت. استاندارد VCD با 1152 kbps معمولاً برای MPEG-1 بسیار خوب کار میکند. تفاوت در نسبت سیگنال به نویز نسخه اصلی است. نویز موجود در محتوای آنالوگ، فشردهسازی آن را بسیار دشوارتر میکند.
همچنین هنگام مالتیپلکس کردن باید آفست تاخیر صدا نسبت به تصویر را به صورت دستی تنظیم کنید. در اغلب موارد تاخیری در حدود 150ms کارساز خواهد بود.
باید بستههای ac3dec و mpeg2dec را دانلود کنید. میتوانید آنها را در صفحه اصلیشان پیدا کنید: mpeg2dec و ac3dec. برای رمزگشایی جریانهای صوتی mpg123 و mplayer میتوانند بسیار مفید باشند. همچنین به sox و toolame نیاز دارید.
در دایرکتوری اسکریپتها، اسکریپت mpegtranscode وجود دارد که بیشتر کارها را انجام میدهد.
بنابراین تبدیل کد به این صورت خواهد بود:
> mjpegtranscode -V -o vcd_stream mpeg2src.mpg
گزینهها را به گونهای تنظیم میکند که جریانی سازگار با VCD تولید شود
- -o vcd_stream
فایلهای vcd_stream.m1v (ویدیو) و vcd_stream.mp2 (صدا) ایجاد میشوند
جریان منبع را مشخص میکند
اسکریپت همچنین خروجیای شبیه به این چاپ میکند:
> SYNC 234 mSec
هنگام مالتیپلکس کردن باید تاخیرهای شروع صدا/تصویر را تنظیم کنید تا از همگام بودن صدا و تصویر اطمینان حاصل شود. میزان دقیق تاخیر (به میلیثانیه) که باید با سوییچ ”-v” به mplex ارسال کنید تا صدا و تصویر همگام شوند، توسط ابزار extract_a52 با برچسب ”SYNC” هنگام اجرا با فلگ ”s” چاپ میشود. این همان مقداری است که اسکریپت mjpegtranscode پس از کلمه SYNC چاپ میکند.
سپس باید آنها را به این صورت مالتیپلکس کنید:
> mplex -f 1 -O 234 vcd_stream.mp2 vcd_stream.m1v -o lowrate.mpg
فرمت مالتیپلکس روی VCD تنظیم میشود
آفست برچسب زمانی ویدیو به میلیثانیه، تولیدشده توسط اسکریپت mjpegtranscoding؛ در اینجا مقادیر منفی مجاز هستند
فایلهای تولیدشده توسط اسکریپت
جریان خروجی سازگار با VCD
در اینجا یک مثال SVCD (ویدیوی MPEG-2) داریم:
> mjpegtranscode -S -o svcd_stream mpeg2src.mpg
باید آن را با دستور زیر مالتیپلکس کنید:
> mplex -f 4 -O 234 svcd_stream.mp2 svcd_stream.m2v -o lowrate.mpg
مشکل: گاهی اوقات در پخش NTSC و VCD مشکلی وجود دارد زیرا ممکن است فیلمها با پولداون ۳:۲ در NTSC با ۶۰ فیلد بر ثانیه ضبط شده باشند. برنامه mpeg2dec برای پخش روی رایانهها طراحی شده و بیتریت اصلی ۲۴ فریم بر ثانیه را تولید میکند. اگر اکنون ویدیو را انکود کنید، ویدیوی ۳۰ فریم بر ثانیه ایجاد میشود. این ویدیو اکنون برای صدای انکودشده بسیار کوتاه است.
میتوان ترنسکدینگ را به درستی انجام داد، اما باید به صورت دستی انجام شود:
> mpeg2dec -s -o pgmpipe mpeg2src.mpg │ pgmtoy4m -a 59:54 -r 25:1 -i t │ mpeg2enc -I 0 -f 4 -q 9 -V 230 -p -P -o svcd_stream.m2v
گزینه -p به mpeg2enc میگوید که فلگهای هدر را برای پولداون ۳:۲ فیلم ۲۴ فریم بر ثانیه تولید کند. همچنین ممکن است بدون افزودن فلگ -p نیز کار کند. هنگام ترنسکد به فرمت VCD نیازی به فلگ -p ندارید زیرا در mpeg1 پشتیبانی نمیشود.
انجام گامبهگام مراحل به صورت دستی (Doing every step on your own)
استخراج صدا:
> cat test2.mpg │ extract_a52 - -s │ ac3dec -o wav -p sound.wav 2>/dev/null
یکی از نخستین خطوط نمایش داده شده شامل برچسب ”SYNC” است؛ بعداً هنگام مالتیپلکس کردن باید از این زمان استفاده کنید. دستور 2>/dev/null خروجی ac3dec را به /dev/null هدایت میکند. در مرحله بعد، فایل صوتی mpeg را تولید میکنید:
> cat sound.wav │ mp2enc -V -v 2 -o audio.mp2
فرمت VCD را اجبار میکند؛ نرخ نمونهبرداری از 48kHz به 44.1kHz تبدیل میشود
غیرضروری است، اما اگر استفاده شود mp2enc اعلام میکند چند ثانیه از فایل صوتی تاکنون انکود شده است.
فایل خروجی را مشخص میکند.
cat test2.mpg │ extract_a52 - -s │ ac3dec -o wav │ sox -t wav /dev/stdin -t wav -r 44100 /dev/stdout │ toolame -p 2 -b 224 /dev/stdin audio.mp2
مجدداً یکی از نخستین خطوط خروجی شامل برچسب ”SYNC” است. هنگام انجام مالتیپلکس باید از این زمان (که در زیر با عنوان "SYNC_value" به آن اشاره شده) استفاده کنید.
برای ایجاد VCD استفاده کنید از:
> mpeg2dec -s -o pgmpipe test2.mpg │ pgmtoy4m -a 59:54 -r 25:1 -i t │ mpeg2enc -s -o video_vcd.m1v
mpeg2dec:
به mpeg2dec میگوید از دیمالتیپلکسر جریان برنامه استفاده کند
- -o pgmpipe
فرمت خروجی تصاویر، مناسب برای pgmtoy4m
مالتیپلکس با:
> mplex -f 1 -O SYNC_value audio.mp2 video_vcd.m1v -o vcd_stream.mpg
یک جریان VCD تولید میکند
مقدار ذکر شده در بالا
برای ایجاد SVCD استفاده کنید از:
> mpeg2dec -s -o mpeg2src.mpg │ pgmtoy4m -a 59:54 -r 25:1 -i t │ mpeg2enc -f 4 -q 9 -V 230 -o video_svcd.mpg
ضریب کیفیت برای جریان (جریان VBR) (مقدار پیشفرض q: 12)
- -V 230
اندازه بافر ویدیوی هدف به کیلوبایت
فایل خروجی
مالتیپلکس با:
> mplex -f 4 -b 230 audio.mp2 video_svcd -o svcd_stream.mpg
تولید یک جریان SVCD
اندازه بافر ویدیو بر اساس دستگاه پخش را مشخص میکند.
برای سایر فرمتهای خروجی ویدیو ممکن است این دستور کار کند:
> mpeg2dec -s -o pgmpipe test2.mpg │ pgmtoy4m -a 59:54 -r 25:1 -i t │ yuvscaler -O SIZE_320x200 -O NOT_INTERLACED │ mpeg2enc -o strange_video.m1v
اگر میخواهید جریانهای mpeg را ویرایش کنید، این کار نیز انجامپذیر است اما به روشی اندکی متفاوت. برای دیمالتیپلکس کردن میتوانید از bbdmux از بسته bbtools استفاده کنید. ویدیو یا صدا را بسیار تمیز تفکیک میکند. دیگر نمیتوانید آن را از وبسایت برنت بایلر (Brent Beyler) دریافت کنید؛ هنوز میتوانید با جستجوی کلیدواژههای ”bbtools linux -suse -blackbox” آن را پیدا کنید.
ابتدا اجرا کنید:
> bbdmux myvideo.mpg
باید خروجیای شبیه به این دریافت کنید:
Found stream id 0xE0 = Video Stream 0 Found stream id 0xC0 = MPEG Audio Stream 0 Found stream id 0xBE = Padding Stream
استخراج صدا با:
> bbdmux myvideo.mpg 0xC0 audio.mp1
تبدیل آن به wav:
> mpg123 -w audio.wav audio.m1v
استخراج ویدیو با:
> bbdmux myvideo.mpg 0xE0 video.m1v
تبدیل ویدیو به یک جریان mjpeg avi:
> mpeg2dec -o pgmpipe video.m1v │ pgmtoy4m -a 59:54 -r 25:1 -i t │ yuv2lav -f a -o test.avi
سپس افزودن صدا به avi:
> lavaddwav test.avi audio.wav final.avi
اگر ویدیوی منبع از قبل اندازه ویدیوی هدف را دارد، از -o YUV استفاده کنید. استفاده از YUVh اندازه ویدیو را نصف میکند! بقیه کارها را میتوان درست مانند ویرایش و انکود سایر جریانها انجام داد. اگر ویدیوهایی با صدای ac3 دارید، تنها کافی است دستورات بالا را تطبیق دهید.
استخراج صدا:
> cat test2.mpg │ extract_a52 - -s │ ac3dec -o wav 2>dev/null >sound.wav
استخراج ویدیو و افزودن صدا در یک مرحله:
> mpeg2dec -s -o pgmpipe │ pgmtoy4m -a 59:54 -r 25:1 -i t │ yuvscaler -O VCD │ yuv2lav -f a -q 85 -w sound.wav -o test.avi
نکته: به فضای دیسک زیادی نیاز دارید. ۱ گیگابایت ویدیو در فرمت SVCD حجمی در حدود ۲ گیگابایت دارد و البته برای برخی فایلهای موقت نیز به فضای دیسک نیاز است. تبدیل ویدیو به mjpeg نیز مدتی زمان میبرد. روی پردازنده Athlon 500 من هرگز بیش از ۶ تا ۷ فریم در ثانیه حاصل نمیشود. هر بار که جریانی را به فرمت دیگری تبدیل میکنید کیفیت را از دست میدهید!
موازنه کیفیت و سرعت (Trading Quality/Speed)
اگر کیفیت مطلق هدف شماست، میتوان با استفاده از فلگهای -4 و -2 به بهبودی نسبی دست یافت. این فلگها کنترل میکنند که mpeg2enc چقدر سرسختانه تطابقهای نامناسب میان بخشهای فریمهای مجاور را در مراحل اولیه جستجو (زمانی که با خوشههای ۴*۴ و ۲*۲ از پیکسلها به جای تکتک پیکسلها کار میکند) دور بریزد. تنظیم -4 1 -2 1 کیفیت را به حداکثر میرساند. تنظیم -4 4 -2 4 سرعت را به حداکثر میرساند. توجه داشته باشید که چون معیارهای آماری مورد استفاده mpeg2enc برای کنار گذاشتن تطابقهای نامناسب معمولاً کاملاً قابل اعتماد هستند، افزایش یا کاهش کیفیت نسبی (اما محسوس) است.
کاهش شعاع جستجو برای بخشهای منطبق تصاویر نیز سرعت را افزایش میدهد. با این حال با توجه به نحوه کار الگوریتم جستجو، شعاع جستجو عملاً به نزدیکترین مضرب ۸ گرد میشود. علاوه بر این در پردازندههای مدرن، سرعت به دست آمده از کاهش شعاع به کمتر از ۱۶ آنقدر زیاد نیست که افت کیفیت چشمگیر را برای اکثر کاربردها توجیهپذیر کند.
ایجاد جریانها جهت پخش نرمافزاری از دیسک (Creating streams for software players)
معمولاً نرمافزارهای پخشکننده MPEG بسیار انعطافپذیرتر از سختافزارهای تعبیهشده در دستگاههای پخش DVD و VCD هستند. این انعطافپذیری امکان دستیابی به فشردهسازی بسیار بهتر برای همان کیفیت را فراهم میکند. ترفند کار، تولید جریانهای ویدیویی است که از بافرهای ویدیویی بزرگ (۵۰۰ کیلوبایت یا بیشتر) و انکود با نرخ بیت متغیر (فلگ -f / -q در mpeg2enc) استفاده میکنند. همچنین پخشکنندههای نرمافزاری اغلب فرمت صوتی کارآمدتر MPEG layer 3 (همان فرمت صوتی ”MP3”) را به درستی پخش میکنند. یک انکودر خوب MP3 مانند lame نتایجی با کیفیت ۱۲۸Kbps یا ۱۶۰Kbps تولید میکند که با layer 2 در ۲۲۴Kbps قابل مقایسه است.
پردازش چندپردازندهای (SMP) و توزیعشده (SMP and distributed encoding)
انکودینگ توزیعشده برای یک سیستم معمولی در سال ۲۰۱۳ نظریهای کاملاً دور از ذهن است. بنابراین بیشتر کاربران میتوانند با خیال راحت از این بخش عبور کنند. انکودینگ چندپردازندهای (SMP) برای رایانههای معمولی جذابتر و کاربردیتر است.
میزانی که mpeg2enc تلاش میکند کار را میان رشتههای همزمان در حال اجرا تقسیم کند، با گزینه -M یا --multi-thread [0..32] کنترل میشود. این گزینه mpeg2enc را برای تعداد مشخصشده پردازندهها بهینهسازی میکند. به طور پیشفرض (-M 1)، mpeg2enc تنها با اندکی چندرشتهای اجرا میشود: خواندن فریمها همزمان با فشردهسازی انجام میگیرد. این کار به این منظور انجام میشود که پایپلاینهای انکودینگ که میان چند ماشین تقسیم شدهاند (به بخش زیر مراجعه کنید) بدون نیاز به برنامههای بافرینگ خاص به صورت کارآمد عمل کنند. اگر روی سیستمی با یک پردازنده انکود میکنید که با کمبود حافظه RAM مواجه است، ممکن است متوجه شوید که خاموش کردن کامل چندرشتهای با تنظیم -M 0 کمی کارآمدتر عمل میکند.
برای سیستمهای SMP با دو یا چند پردازنده، میتوانید با تنظیم تعداد رشتههای انکودینگ همزمان که میخواهید استفاده کنید (مثلاً -M 2)، به کار mpeg2enc سرعت ببخشید. تنظیم -M 2 یا -M 3 روی یک سیستم دوپردازندهای باید به شما امکان دهد سرعت انکودینگ را حدود ۸۰٪ افزایش دهید. مقادیر بالاتر از ۳ پذیرفته میشوند اما حتی در سیستمهای ۴ پردازندهای تأثیر بسیار کمی دارند.
اگر یک سیستم SMP واقعاً سریع (در حال حاضر ۱ اوت ۲۰۰۳) مانند دو پردازنده Athlon MP 2600 یا مشابه آن دارید، ممکن است -M 2 و فیلترها نتوانند هر دو پردازنده (یا بیشتر) را کاملاً مشغول نگه دارند. استفاده از برنامه buffer یا bfr با یک بافر ۱۰ تا ۲۰ مگابایتی به مشغول نگه داشتن هر دو پردازنده کمک میکند.
بدیهی است که اگر پایپلاین انکودینگ شما شامل چندین مرحله فیلترگذاری باشد، احتمالاً میتوانید حتی بدون استفاده از -M دو یا چند پردازنده را به طور همزمان مشغول نگه دارید. نویزگیری با استفاده از yuvdenoise یا yuvmedianfilter به ویژه سنگین است و تقریباً به اندازه انکودینگ MPEG از توان پردازشی استفاده میکند.
اگر بیش از یک رایانه دارید، میتوانید پایپلاین انکودینگ را با استفاده از دستورات استاندارد اجرای ریموت شل مانند 'rsh' یا 'rcmd' میان رایانهها تقسیم کنید. برای مثال، اگر دو رایانه دارید:
> rsh machine1 lav2yuv ”mycapture.eli │ yuvscaler -O SVCD │ yuvdenoise” │ mpeg2enc -f 4 -o mycapture.m2vi
در اینجا رایانهای که دستور را روی آن اجرا میکنید، انکودینگ MPEG را انجام میدهد و ”machine1” ماشینی است که ویدیوی ضبطشده را دیکود، مقیاسبندی و نویزگیری میکند.
بدیهی است برای اینکه این روش کار کند، ”machine1” باید بتواند به ویدیو دسترسی داشته باشد و رایانهای که دستور در آن اجرا میشود باید فضای کافی برای ویدیوی انکودشده داشته باشد. در عمل، اگر قصد انجام کارهایی از این دست را دارید معمولاً راهاندازی ذخیرهساز فایل تحت شبکه با استفاده از ”NFS” یا بستههای دیگر کاملاً ارزشش را دارد. اگر سه رایانه دارید میتوانید این کار را یک گام فراتر ببرید؛ یک رایانه میتواند دیکود و تغییر مقیاس را انجام دهد، رایانه بعدی نویزگیری کند و رایانه سوم انکودینگ MPEG را انجام دهد:
> rsh machine1 ”lav2yuv mycapture.eli │ yuvscaler -O SVCD” │ yuvdenoise │ rsh machine3 mpeg2enc -f 4 -o mycapture.m2v
نکته: نحوه تنظیم اجرای دستورات از راه دور به گونهای است که دادهها مستقیماً از ماشینی که آنها را تولید میکند به ماشینی که آنها را مصرف میکند ارسال میشوند.
در عمل برای اینکه این کار ارزشمند باشد، شبکهای که استفاده میکنید باید به اندازه کافی سریع باشد تا به گلوگاه تبدیل نشود. برای سیستمهای رده Pentium-III یا بالاتر به اترنت 100Mbps نیاز خواهید داشت.
برای ماشینهای واقعاً سریع ممکن است به اترنت سوییچشده 100MBps (یا بهتر!) نیاز باشد. راهاندازی rshd (”Remote Shell Daemon” مورد نیاز برای کارکرد rsh) و پیکربندی ”rsh” خارج از حوصله این سند است، اما این یک بسته استاندارد است و باید به سادگی روی هر توزیع لینوکس یا BSD نصب و فعال شود.
توجه داشته باشید که این کار بالقوه یک مسئله امنیتی است، بنابراین روی ماشینهایی که برای شبکههای بیرونی قابل مشاهده هستند با احتیاط استفاده کنید!
سازگاری و تعاملپذیری (Interoperability)
فایلهای Quicktime ضبطشده با استفاده از lavrec را میتوان با Broadcast2000 ویرایش کرد. اما Broadcast2000 دیگر در heroinewarrior در دسترس نیست. فایلهای mjpeg AVI ضبطشده با استفاده از ابزار streamer از بسته xawtv را میتوان به صورت نرمافزاری ویرایش، فشردهسازی و پخش کرد. پخش سختافزاری برای چنین فایلهایی به دلیل محدودیتهای سختافزار Zoran که در حال حاضر پشتیبانی میشود امکانپذیر نیست. ویدیوهای ضبطشده با NuppelVideo را نیز میتوان با ابزارهای mjpeg پردازش کرد.
اگر مکینتاش (MAC) دارید و میخواهید از ابزارهای mjpeg استفاده کنید به آنجا نگاهی بیندازید:
فایلهای MPEG تولیدشده با استفاده از این ابزارها برای پخش صحیح در موارد زیر شناخته شدهاند:
کارت دیکودر سختافزاری dxr2
xine
xmovie
mplayer
vlc
فقط MPEG-1: برنامه gtv
برنامه MS Media player نسخههای ۶ و ۷ و نسخههای بعدی
چندین پخشکننده نرمافزاری DVD
برای اینکه بفهمید پخشکننده سختافزاری شما (بیشتر اوقات دستگاه پخش DVD) چه کارهایی میتواند انجام دهد، نگاهی بیندازید به:
به نظر میرسد اگر هنگام مالتیپلکس از -f 1 استفاده کرده باشید، MS Media player جریانهای MPEG-1 را بیشتر ترجیح میدهد.
اگر مشکلی یا پیشنهادی دارید با من (Bernhard Praschinger) از طریق ایمیل در تماس باشید: مطالب زیادی از بخش HINTS که توسط Andrew Stevens ایجاد شده بود، اضافه شده است. Wolfgang Goeller و Steven M. Schultz این سند را برای یافتن باگها و غلطهای املایی بررسی کردهاند.
و با تشکر فراوان از افرادی که در توضیحات برنامهها و نکات به من کمک کردند، سپاسگزارم.
همچنین ببینید (SEE ALSO)
صفحه اصلی
mjpeg در
نشانیهای
زیر قرار
دارد:
http://mjpeg.sourceforge.net
http://sourceforge.net/projects/mjpeg
نرمافزار
vcdimager در نشانی
زیر در
دسترس است:
http://www.vcdimager.org
نرمافزار
cdrdao در نشانی
زیر در
دسترس است:
http://cdrdao.sourceforge.net/index.html
نرمافزار
Linux Video Studio در نشانی
زیر در
دسترس است:
http://ronald.bitfreak.net
ابزارهای
lavtools:
jpeg2yuv(1), lav2wav(1), lav2yuv(1), lavpipe(1),
lavplay(1), lavrec(1), lavtrans(1), lavinfo(1),
mp2enc(1), mpeg2enc(1), mplex(1), ppmtoy4m(1),
pnmtoy4m(1), yuv2lav(1), yuvdenoise(1),
yuvkineco(1), yuvmedianfilter(1), yuvplay(1),
yuvfps(1), yuvscaler(1), yuvycsnoise(1),
y4mblack(1), y4mcolorbars(1), y4mdenoise(1),
y4mhist(1), y4minterlace(1), y4mshift(1),
y4mstabilizer(1), y4mtopnm(1), y4mtoppm(1).
ابزارهای فاقد صفحه راهنما: lavaddwaw, glav
| MJPEG Linux Square | MJPEG tools manual |