با سلام و احترام خدمت بازدیدکنندگان عزیز
آموزش و آشنایی با نرم افزار FFmpeg – قسمت پنجم – تعیین فرمت یا Container
برای مشاهده قسمت اول به
این پست
مراجعه نمایید.
برای مشاهده قسمت دوم به
این پست
مراجعه نمایید.
برای مشاهده قسمت سوم به
این پست
مراجعه نمایید.
برای مشاهده قسمت چهارم به
این پست
مراجعه نمایید.
تعیین فرمت یا Container:
تعیین فرمت برای mux و demux بوسیله سوئیچ
-f
انجام میگیرد اما معمولا به درج این سوئیچ نیازی نمیشود. انتخاب دیماکسر معمولا وقتی نیاز میشود که فایل ورودی از طریق
pipe
میآید (اون هم نه در همه موارد) یا در موارد نادر دیگر زیرا قدرت تشخیص فرمت فایل در FFmpeg بسیار بالا هست. برای ماکسر هم معمولا از طریق پسوندی که برای فایل خروجی انتخاب میکنید تشخیص میدهد مگر در موارد نادر مانند pipe یا غیره.
در این مثال یک فایل جدید mkv با تصویر h264 و صدای aac در اختیار داریم. میخواهیم بدون انکد مجدد استریمها فرمت فایل اون را ( containerش را) به mp4 تغییر بدیم تا فرضا در یه نسخه از ادوبی پریمیر ( Adobe Premiere ) که از mkv پشتیبانی نمیکنه بازش کنیم:
FFmpeg -i "file1.mkv" -codec copy -y "file1_remuxed.mp4"
(اگر دقت کنید در کامندلاین بالا از هیچ گونه دستور
-map
استفاده نشد. در این گونه شرایط FFmpeg با توجه به توضیح خودش از هر نوع استریم (تصویر، صدا یا...) یکی را انتخاب میکند و آن هم بهترین. مثلا اگر دو استریم صدا وجود داشته باشد اونی که تعداد کانالهاش بیشتر و بیت ریتش بالاتر هست انتخاب میکند و غیره. پس اینجا دریافتیم که مزیت استفاده از دستور map این است که میدانیم چه چیزی انتخاب میشود و ازش راضی خواهیم بود...)
در این مثال همان فایل بالایی را هرکدام از استریمهاشو در یک فایل mp4 جداگانه ذخیره میکنیم:
FFmpeg -i "file1.mkv" -map 0:v:0 -codec copy -y "file1_video.mp4" -map 0:a:0 -codec copy -y "file1_audio.m4a"
توجه داشته باشید که در مثالهای قبلی محل قرار گیری دستور map اختیاری بود (بعنوان output option مسلما)، چون 1 فایل خروجی داشتیم اما در مثال بالا چون 2 فایل خروجی داریم دستور map دقیقا باید قبل از "فایل خروجی موردنظر" قرار بگیرد همچنین دستور codec و کلا هر دستور که مربوط به یک فایل خروجی خاص میشود.
برای دیدن لیستی از فرمتها (muxerها و demuxerها)ی موجود در نسخهای از FFmpeg که در اختیار دارید از سوئیچ
-formats
استفاده میکنید و طریقه ذخیرهاش در فایل txt هم به امید خدا دیگه تا اینجا یاد گرفتید.
بالای لیستی که چاپ میشود نوشته شده که اگر پشت هر کدام از آیتمهای لیست یک E گذاشته بود یعنی فقط امکان mux به اون فرمت را دارد و اگر پشتش D گذاشته بود یعنی فقط توانایی demux کردن اون فرمت را دارد. اگر همزمان جفتش را گذاشته بود یعنی از هر دو عملیات برای اون فرمت پشتیبانی میکند. مثال:
DE
avi AVI (Audio Video Interleaved)
سوئیچهای تفکیک شده دستور
-formats
عبارتند از
-muxers
و
-demuxers
.
دانستنی:
برنامه نویسان FFmpeg تصمیم گرفتند برای فرمتهای مختلف کدکهای پیش فرض صوت و تصویر و... در نظر بگیرند تا استفاده از آن راحت و راحتتر بشود.
با اجرای دستور زیر خواهید فهمید که برای هر ماکسر چه فرمتهای صوت و تصویر و زیرنویس پیش فرضی در نظر گرفته شده. (مثال زیر برای ماتروسکا میباشد):
FFmpeg -help muxer=matroska
که در این تاریخ خروجی FFmpeg این هست:
Muxer matroska [Matroska]:
که یعنی اگر قصدتان استفاده از همان کدکهاست (در اصل چیزی که نوشته اسم فرمت هست) دیگر نیازی به تعیین دستی کدکها با دستور مربوطه نخواهید داشت و دستور زیر کافی خواهد بود (البته تعیین دستی کدکها با همان فرمتها نیز هیچ مشکلی ندارد):
Common extensions: mkv.
Mime type: video/x-matroska.
Default video codec: h264.
Default audio codec: vorbis.
Default subtitle codec: ass.
matroska muxer AVOptions:
...
FFmpeg -i %1 -y "%~dpn1_encoded.mkv"
(عدم استفاده از دستور map در کد بالا دلیل خاصی نداشت)
و بعلاوه چون برای تولید تعداد کمی از فرمتها در FFmpeg بیش از یک انکدر وجود دارد با دیدن صفحه کنسول در زمان شروع عملیات میتوانید متوجه شوید که دقیقا از کدام انکدرها برای تبدیل استریم مربوطه استفاده میکند. که برای مثال بالا به این ترتیب بود:
...
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (ac3 (native) -> vorbis (libvorbis))
Press [q] to stop, [?] for help
frame= 53 fps=0.0 q=28.0 size= 47kB time=00:00:02.24 bit…
frame= 77 fps= 76 q=28.0 size= 129kB time=00:00:03.18 bit…
frame= 93 fps= 61 q=28.0 size= 185kB time=00:00:03.86 bit…
...
- مشاهده
قسمت ششم