با سلام و احترام خدمت بازدیدکنندگان عزیز
آموزش و آشنایی با نرم افزار FFmpeg – قسمت پنجم – تعیین فرمت یا Container
برای مشاهده قسمت اول به این پست مراجعه نمایید.
برای مشاهده قسمت دوم به این پست مراجعه نمایید.
برای مشاهده قسمت سوم به این پست مراجعه نمایید.
برای مشاهده قسمت چهارم به این پست مراجعه نمایید.

تعیین فرمت یا Container:
تعیین فرمت برای mux و demux بوسیله سوئیچ -f انجام می گیرد اما معمولا به درج این سوئیچ نیازی نمی شود. انتخاب دیماکسر معمولا وقتی نیاز می شود که فایل ورودی از طریق pipe می آید (اون هم نه در همه موارد) یا در موارد نادر دیگر زیرا قدرت تشخیص فرمت فایل در FFmpeg بسیار بالا هست. برای ماکسر هم معمولا از طریق پسوندی که برای فایل خروجی انتخاب می کنید تشخیص می دهد مگر در موارد نادر مانند pipe یا غیره.
در این مثال یک فایل جدید mkv با تصویر h264 و صدای aac در اختیار داریم. می خواهیم بدون انکد مجدد استریم ها فرمت فایل اون را ( containerش را) به mp4 تغییر بدیم تا فرضا در ادوبی پریمیر که از mkv پشتیبانی نمی کنه بازش کنیم: SET FFmpeg=D:\ _Tools_\_my builds\64bit\video\ffmpeg.exe

"%FFmpeg%" -i "file1.mkv" -codec copy -y "file1_remuxed.mp4"
Pause
(اگر دقت کنید در کامندلاین بالا از هیچ گونه دستور -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) دانستنی: برنامه نویسان FFmpeg تصمیم گرفتند برای فرمت های مختلف کدک های پیش فرض صوت و تصویر و... در نظر بگیرند تا استفاده از آن راحت و راحت تر بشود.
با اجرای دستور زیر خواهید فهمید که برای هر ماکسر چه فرمت های صوت و تصویر و زیرنویس پیش فرضی در نظر گرفته شده. (مثال زیر برای ماتروسکا می باشد): "%FFmpeg%" -help muxer=matroska
Pause
که در این تاریخ خروجی 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…
...


--پایان قسمت پنجم - مشاهده قسمت ششم