Mohammad Ghodsian
Mohammad Ghodsian
خواندن ۱۷ دقیقه·۴ سال پیش

آلیس در سرزمین ffmpeg

سلام سلام سلام. خوبین؟

با احتمال بالای نود درصد، شمایی که الان داری این مطلبو میخونی، یه وقتی، یه روزی، یه جایی، یه جوی، صبر داشتی و مجبور شدی با یه محتوای مالتی مدیا دست و پنجه نرم کنی.
برای خیلیا هم حریفِ چغرِ بد بدن یعنی کارایی مثل یه تبدیل ساده فرمت فیلم (مثلا برای پخش کردن روی دستگاه های مختلف)، کاهش حجم، چسبوندن و حذف کردن صدا و زیرنویسِ فیلم و موارد این چنینی.

توی این مقاله میخوایم با یکی از ابزارایی که کلی قابلیت برای وَر رفتن با انواع محتوا بهمون میده آشنا بشیم، درسته که نرم افزار هایی هم وجود دارن که خیلیم خوب هستن و کلی راه اندازن، اما بعضیاشون یا حجمشون زیاده، یا کار باهاشون شاید خیلی آسون نباشه، یا دست و بال ما رو خیلی باز نمیذارن، یا حتی جالبه که خیلی از نرم افزارا هم خودشون از همین FFmpeg استفاده میکنن.

استفاده از FFmpeg رایگانه ولی قبل از ادامه هم بگم که این مقاله نیاز به اجرای دستورات داره و اگه با این قضیه مشکل دارین لطفاً قبل از اینکه سریع صفحرو ببنیدن، تصمیم بگیرین که یه نگاهی به مثالایی که زده میشه بندازین، شاید هم علاقه مند شدین هم یه جایی کارتون رو راه انداخت. حتی شاید به دیگران معرفیش کنید یا به عنوان یه ابزار توی شغلتون ازش استفاده کنید.

راستی، حالا چرا "آلیس در سرزمین FFmpeg"؟ اوووم، خب دلیل خیلی خاصی نداره :)
تنها ربط آلیس و دنیای عجایبش به این مقاله اینه که اسم کارتون و فیلمه، ما هم قراره در مورد کار کردن با انواع محتوا (مثل فیلم) صحبت کنیم. از طرفی هم وقتی شروع به استفاده از FFmpeg بکنید واقعا شاید یجورایی قبول کنید که خیلیم چیزی از دنیای عجایب کم نداره!

FFmpeg is a complete, cross-platform solution to record, convert and stream audio and video
FFmpeg is a complete, cross-platform solution to record, convert and stream audio and video

شما یا با FFmpeg آشنا هستین، یا میخواین آشنا بشین، یا صرفاً قصد جاست خوندن دارین، یا شایدم گزینه چهار، یعنی همه موارد، شایدم هیچ کدام! در هر صورت بیاین اول ببینیم FFmpeg چی هست.

توضیحی که توی سایت رسمی FFmpeg نوشته شده، میگه که FFmpeg یه راه حل کاملِ قابل اجرا روی پلترفرم های مختلفه برای ضبط، تبدیل و استریم صدا و فیلم (برای stream اگه ترجمه مناسبی به فارسی پیدا کردین خوشحال میشم بگین).

برای نصبش که زیادم سخت نیست میتونید از سایت رسمی FFmpeg استفاده کنید.
برای یادگیریش هم میتونید از داکیومنتِ سایت Ffmpeg کمک بگیرین.

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


قرار نیست اینجا ما کل FFmpeg رو یاد بگیریم، فقط تا حدود قابل قبولی با ماهیت، منطق ساختاری، و برخی از کاربردهای عمومیش آشنا میشیم و یسری مثالِ نسبتاً کاربردی میبینیم.

برای اجرای FFmpeg میشه از نرم افزارهایی که رابط کاربری هم دارن استفاده کرد اما بشدت توصیه میکنم سعی کنید با محیط هایی مثل cmd یا پاورشل و ... در ویندوز یا ترمینال و شل در لینوکس کار کنید (ادامه این مقاله هم کامندها یا دستوراتی که میتونید توی این محیط ها اجرا کنید رو نشون میده)

قبل از ادامه یه نکته خیلی مهم و جالب رو هم بگم که FFmpeg متن باز یا همون Open Source هست و اگه برنامه نویس هستین یا به دیدن و خوندن کد علاقه دارین، بفرمائید، این شما و این هم: https://git.ffmpeg.org/ffmpeg.git


و بالاخره تازه رسیدیم به نقطه شروع. هر کامند یا دستور FFmpeg با کلمه کلیدی ffmpeg شروع میشه. اول از همه برای اینکه مطمئن بشیم ffmpeg روی سیستم شما بدرستی نصب شده با اجرای دستور ffmpeg به تنهایی باید بتونید ورژنش رو ببینید:

ویندوز
ویندوز
لینوکس
لینوکس

دستور FFprobe

قبل از اینکه ببینیم ffmpeg چه ویژگی هایی داره، بیاین با دستور ffprobe آشنا بشیم. وقتی ffmpeg رو نصب کنید میتونید از دستور ffprobe هم استفاده کنید:

ffprobe linux
ffprobe linux

دستور ffprobe میتونه تمامی اطلاعاتی که از یه محتوای صوتی یا تصویری و حتی زیرنویس لازم دارین رو در اختیارتون قرار بده. برای مثال خروجی دستور زیر:

ffprobe c:\BigBuckBunny.mp4

بصورت زیر هست:

ffprobe
ffprobe

اول بریم سراغ دستور. وقتی دستور ffprobe c:\BigBuckBunny.mp4 رو تایپ میکنیم، داریم اول میگیم که ما میخوایم از ffprobe استفاده کنیم، و جلوی اون، آدرس فایلی که قراره اطلاعاتش رو متوجه بشیم وارد میکنیم (آدرس میتونه محلی یا آنلاین یا هر جور دیگه ای باشه ولی باید قابل دسترسی باشه فایل)

و جواب ممکنه توی نگاه اول یکم ترس آور باشه، اما باید اون قسمتایی که برای ما اهمیت داره رو در نظر بگیریم. اینجا برای مثال، توی عکس بالا که خروجی دستورمونه، فلشای قرمز استریم هامون، و فلش سبز طول کل فیلم رو نشون میده. یعنی مدتِ این فیلم، 00:09:56.47 (یا همون حدود ده دقیقه) هست. همونطور که میبینیم اطلاعات دیگه ای مثل بیت ریت، کدک یا فرمت رو هم میتونیم متوجه بشیم.

یه نکته اینکه ffprobe و ffmpeg، هر تیکه از محتوای شما رو اصطلاحاً به عنوان stream میشناسن. یعنی توی این مثالی که زدیم، محتوای ما یک استریم ویدیو از نوع h264 داره و یه استریم صدا از نوع aac.
مفهوم کاملترش این میشه که یه محتوا، میتونه هر تعداد استریم که میخواد داشته باشه. مثلا میتونید یه فیلم داشته باشید، و روی اون هر تعداد استریم صوت (مثلا دوبله های مختلف یا زبونای متفاوت) و هر تعداد استریم زیرنویس که میخواین رو بهش اضافه کنید.

بیاین یه مثال دیگه ببینیم، با اجرای دستور زیر بریم سراغ یه فیلم دیگه:

این مثالی که میبینیم، یه استریم ویدئو (رنگ بنفش)، دو تا استریم صوت یا همون صدای دوبله (رنگ آبی)، و 8 تا استریم از نوع زیرنویس برای زبان های مختلف (رنگ سبز) داره.


دستور FFmpeg

توی قسمت قبلی تونستیم جزئیات کامل یه فیلم رو به کمک دستور ffprobe ببینیم. حالا وقتشه که بریم یکم با ffmpeg دست و پنجه نرم کنیم.

تبدیل فرمت

اوه با چه مثال سختی هم شروع کردیم. دستور زیر رو ببینین:

ffmpeg -i video.mp4 video.mkv

عکس زیر رو میتونین نگاه نکنین ولی قسمتی از خروجیه:

و تمام! به همین راحتی فیلم video.mp4 رو تبدیل کردیم به video.mkv. یعنی بدون زحمت خاصی فقط گفتیم ffmpeg جان، عزیزم، بیان این محتوای mp4 من رو تبدیل که به mkv! و میتونیم اغلبِ فرمتای رایج رو استفاده کنیم، مثلا برعکس این مثالمون (تبدیل mkv به mp4).

کلن وقتی میخوایم از ffmpeg اسفاده کنیم، با نوشتن i- به ffmpeg میگیم که یه ورودی داریم، مثلا توی دستور زیر:

ffmpeg -i video.mkv videoNew.mp4

بعد از i- اسم فیلم ورودیمون (یعنی video.mkv) رو دادیم، و در آخر هم خروجی مد نظرمون (اینجا videoNew.mp4) رو وارد کردیم.

توی این دو تا مثال (تبدیل نوع فیلم)، ffmepg از تنظیمات پیشفرض خودش استفاده کرده، اما ما میتونیم تنظیمات مد نظر خودمون رو از بین دریایی از دستورات و کامندهایی که ffmpeg در اختیارمون میذاره انتخاب و استفاده کنیم.

تقطیع و برش

تقطیع و برش میتونه هم برای ویدئو، هم برای صوت و هم برای زیرنویس استفاده بشه. بیاین یه مثال در مورد تقطیع و برش یه فیلم رو ببینیم:

ffmpeg -i input.mp4 -ss 00:00:10 -t 25 output.mp4

این دستور میگه ffmpeg یه ورودی داره به اسم input.mp4. مقداری که بعد از ss- میاد نشون میده که میخوایم تقطیعمون از چه زمانی از فیلم شروع بشه، و با عددی که بعد از t- نوشتیم گفتیم به مدت چند ثانیه برو جلوتر (ss- و t- میتونن قبل از i- هم قرار بگیرن که به عملیاتمون سرعت بیشتری میدن)
خلاصه عملکرد دستور بالا: از ثانیه 10 به مدت 25 ثانیه (یعنی از ثانیه 10 تا 35) فیلم رو برش بده و با اسم output.mp4 ذخیره کن. (به این نکته هم توجه کنین که ffmpeg میتونه to- رو هم بگیره بجای t-، با این تفاوت که to- میگه دقیقاً تا کجای محتوا مد نظرمونه. برای مثال اینجا میتونستیم بنویسیم -ss 00:00:10 -to 00:00:35)

جا داره به دو تا نکته هم توجه کنیم. یکی اینکه ss- و t- میتونن به تنهایی هم بکار برن (ss- به تنهایی یعنی از زمانی که جلوش اومده شروع بشه، و t- به تنهایی یعنی به مدتی که جلوش اومده عملیات تبدیل انجام بشه)، و نکته ی مهمتر دیگه اینه که یه کامند ffmpeg میتونه تعدادی ورودی و تعدادی خروجی داشته باشه. مثلا با دستور زیر:

ffmpeg -i input.mp4 -t 00:00:30 output1.mp4 -ss 00:00:20 output2.mp4

شاید اگه بصورت زیر ببینیمش بهتر متوجه بشیم (صرفاً برای وضوح بیشتر):

ffmpeg -i input.mp4 -t 00:00:30 output1.avi -ss 00:01:20 output2.mkv -ss 00:00:50 -t 20 output3.mp4

ورودی input.mp4 رو بگیر، سه تا برش ازش بهم بده، اول بیا 00:00:30 از اول محتوا (30 ثانیه اول فیلم) رو با اسم و فرمت output1.avi، بعدش بیا از زمان 00:01:20 تا آخر فیلم (از یک دقیقه و بیست ثانیه تا آخر فیلم) رو با اسم و فرمت output2.mkv، و در نهایت هم از 00:00:50 به مدت 20 ثانیه (از ثانیه 50 تا 1 دقیقه و ده ثانیه که در مجموع میشه 20 ثانیه فیلم) رو با اسم و فرمت output3.mp4 ذخیره کن.

جداسازی استریم

اگه بخوایم یکی از استریم های مثلا صدا رو از یه فیلم رو بیرون بکشیم، میتونیم بسته به ورژنمون از دستورات مختلفی استفاده کنیم، مثال زیر رو ببینید:

ffmpeg -i video.mp4 -vn -ab 256 audio.mp3

یا این یکی:

ffmpeg -i video.mp4 -c:a aac audio.aac

دستور اولی به کمک vn- میگه که استریم video رو نمیخوام، به کمک دستور ab- فرمت خروجی میتونه mp3 باشه با کیفیت ۲۵۶Kbps که جلوش نوشتیم.

دستور دوم رو یکم با دقت بیشتری ببینیم. جایی که نوشتیم -c:a قسمت مهمش a: هست که میگه من از محتوام، استریم صوتش رو میخوام، و میخوام که خروجیم از نوع aac باشه و بریزش توی فایل audio.aac.

بصورت کلی وقتی مینویسیم -c:s یعنی زیرنویس، وقتی مینویسیم -c:v یعنی ویدئو، و وقتی مینویسیم -c:a یعنی صوت.

حالا یه سوال، اگه بخوایم صدای دوم از فیلم رو بیرون بکشم باید چیکار کرد؟ دستور زیر این کارو میکنه:

ffmpeg -i video.mp4 -c:a:1 aac audio2.aac

به این تیکه دقت کنید:

-c:a:1

بصورت کلی وقتی مینویسیم:

-c:a:n

یعنی از محتوای من، برو سراغ audio ها یا همو صدا ها (چون وسطش a گذاشتیم، اگه v میذاشتیم میشد ویدئوها و اگه s میذاشتیم میشد زیرنویس ها) و زیر نویس n-1 ام رو در نظر بگیر. چرا n-1 ؟ بخاطر اینکه شماره استریم ها از 0 شروع میشه. یعنی از نظر ffmpeg اگه یه محتوایی 3 تا صوت داره، صوت اولش میشه 0 اُمین استریم صدا، صوت دومش میشه 1 اُمین استریم صدا، و صوت سومش میشه دومین استریم صدا.
فقط دقت کنیم که اگه محتوایی n استریم زیرنویس داشته باشه، و ما عددی مساوی یا بیشتر از n رو بصورت زیر انتخاب کنیم:

-c:s:n

با خطا مواجه میشیم که طبیعی هم هست، چون محتوا گفتیم که محتوامون n تا زیر نویس داره و همونطور که متوجه شدیم ffmpeg اونارو از 0 تا n-1 میشناسه.

به عنوان آخرین مثال از بیرون کشیدن استریم هم میتونیم بصورت زیر زیرنویس دوم یه فیلم رو بیرون بکشیم:

ffmpeg -i input.mp4 -map 0:s:1 subs.vtt

اینجا دستور -map رو میبینیم که حتما پیشنهاد میکنم در موردش بیشتر بخونید، اما خلاصه کل دستور بالا اینه که ورودی inpu.mp4 رو بگیر، از ورودی اول (عدد صفر جلوی map) که در حقیقت همون تنها ورودیمونه که input.mp4 هست، برو سراغ زیرنویساش و زیرنویس 1 یعنی دومین زیرنویس رو بریز توی فایل sub.vtt.

چند ورودی

پاراگراف آخر قسمت قبل اگه یکم گیجتون کرده اشکالی نداره، فعلا فقط در همین بدونیم که اگه به جایی لازم شد چند تا ورودی بدیم به ffmpeg، میتونیم بصورت زیر عمل کنیم:

ffmpeg -i input1.mp4 -i input2.mp4 ...

دستور بالا میگه که دو تا ورودی داریم، اولی input1.mp4 و دومی input2.mp4. حالا هر زمانی که بخوایم جلوی این دستور با محتوای ورودی اولمون کار داشته باشیم از

-map 0

و هر جایی که با محتوای ورودی دوممون کار داشته باشیم از

-map 1

استفاده میکنیم.

و اگه جلوی عدد و بعد از یه دو نقطه (:) یکی از کاراکترای v یا s یا a رو بذاریم به مفهوم اینه که با استریمای ویدئو، یا زیرنویس یا صداهای فیلم کار داریم.

-map 0:v -map 0:s -map 0:a

و شبیه مثالی که یذره بالاتر دیدیم، اگه یه "دو نقطه" دیگه بذاریم و یه عدد بنویسیم، یعنی اینکه با کدوم استریم کار داریم. دستور زیر یعنی من صوت دوم (عدد 1 چون از 0 شروع میشه) از ورودی سوم (عدد 2 چون از 0 شروع میشه) رو میخوام:

-map 2:a:1

اگه یذره گیج کنند طبیعیه ولی با خوندن و تمرین بهتر متوجه میشین.
کاربرد هم خیلی زیاد داره، مثلا دو تا ورودی بدین، اول فیلم باشه دومی صدا، بعد میتونین به ffmpeg بگین صدای جدید رو جایگزین صدای فیلمه بکن یا به عنوان صدای جدید بهش اضافه کن. یا اینکه توی موارد حرفه ای تر، مثلا دو تا فیلم و یه عکس به عنوان ورودی بدیم، یکی از ویدیوها رو کوچیکتر گوشه ویدیوی دوم بندازین و عکس رو هم مثلا به عنوان لوگو بندازین گوشه تصویر. کلن با اینکه یذره پیچیده شاید باشه کارای اونجوری، ولی ffmpeg اجازه میده هرجور خواستین قیمه ها رو بریزین توی ماستا.

افزودن استریم

توی قسمت جداسازی استریم متوجه شدیم چجوری یه استریم (مثلا یه صدا یا یه زیرنویس) از یه فیلم رو بیرون بکشیم. حالا قراره یه کاری که یذره کاربردی تره رو انجام بدیم. اضافه کردن یه استریم به یه محتوا.

مثلا اگه شما هم مثل من گاهی اوقات با فایل های زیرنویسی که کنار فیلمه مشکل دارین، بصورت زیر میتونین یه زیرنویس جدید به فیلم بچسبونین:

ffmpeg -i movie.mp4 -i subtitle.srt -map 0 -map 1 output.mkv

دستور بالا به ffmpeg میگه دو تا ورودی داری (movie.mp4 و subtitle.srt). به کمک

-map 0

میگیم ورودی اول رو در نظر بگیر، و با دستور

-map 1

میگیم ورودی دوم رو هم در نظر بگیر. ور نهایت اینارو ترکیب کن و بریز توی output.mkv.

به عنوان یه مثال دیگه برای اضافه کردن صدای جدید به یه فیلم (و برای اینکه بدون استفاده از map هم ببینیم چجوری میشه استریم به محتوا اضافه کرد) کامند زیر رو ببینیم:

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac output.mp4

دو تا ورودی داریم (video.mp4 و audio.mp3). با دستوری زیر:

-c:v copy

(همونطور که توی مثالای اول همین مقاله هم متوجه شدیم) میگیم که برو سراغ استریم ویدئو و به کمک کلمه ی copy میگیم فرمتش از هر نوع هست همون رو در نظر بگیر، و با دستور:

-c:a aac

میگیم برو سراغ استریم صوت و نوعش رو aac در نظر بگیر.
و در نهایت نتیجه (که در حقیقت میشه ترکیب ویدئو و صدا یا همون اضافه کردن صوت یا دوبله جدید به فیلم) رو بریز توی output.mp4.

حذف استریم

به هر دلیلی هم اگه خواستیم استریمی رو از یه محتوا حذف کنیم میتونیم بصورت زیر عمل کنیم، مثلا برای اینکه یه فیلم رو mute یا بی صدا بکنیم (فقط تصویر داشته باشه بدون هیچ صدایی):

ffmpeg -i input.mp4 -map 0:v -c copy output.mp4

به کمک قطعه دستور زیر

-map 0:v

میگیم که از استریم اولمون که همون input.mp4 هست بیا قسمت ویدیئوش رو انتخاب کن، و به کمک

-c copy

که البته اختیاری هم هست یجورایی، میتونیم بگیم فرمت خروجی مثل فرمت ورودی باشه.

جنگولگ بازی

خب تا اینجا با تبدیل فرمت و چند تا ورودی و چندتا خروجی و افزودن و حذف و بیرون کشیدن استریم آشنا شدیم. ffmpeg دستور و تنظیمات بشدت زیاد داره، مثلا میشه باهاش استریم rtmp فرستاده، یا بصورت لایو محتوای یه شبکه تلویزیونی رو گرفت و همزمان هم لوگو بهش چسبوند هم به چند نرخ بیت و کیفیت مختلف ذخیرش کرد. اگه بخوایم جنگولک بازی در بیاریم میشه تا ابد مثالال مختلفی اورد، ولی چون سطح این مقاله از اول هم قرار نبود خیلی حرفه ای باشه، صرفا چنتا مثال ساده رو ببینیم:

  • تغییر ابعاد فیلم
ffmpeg -i input.mp4 -s 640x480 -c:a copy output.mp4
  • چرخاندن فیلم

نود درجه در جهت عقربه های ساعت:

ffmpeg -i input.mp4 -filter:v 'transpose=1' rotated-video.mp4

اگه transpose=1 رو بکنیم transpose=2 میشه 90 درجه خلاف عقربه های ساعت.

  • تغییر کیفیت و فشرده سازی فیلم
ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4

قسمت -crf 24 هرچی عدد 24 کوچیکتر باشه فشرده سازی کمتری داریم، 0 یعنی هیچ فشرده سازی ای نداشته باشیم. عملا فشرده سازی بالاتر یعنی کیفیت کمتر و برعکس.

قسمت preset هم یجورایی سرعت کاری که میکنیم رو مشخص میکنه، میتونه موارد ultrafast، superfast، veryfast، faster، fast، medium، slow, slower، veryslow رو شامل بشه، و همونطور که مشخصه از سرعت superfast یا بشدت زیاد تا veryslow یا بشدت کم، رو در بر میگیره که سرعت هرچی بالاتر بره کیفیت خروجی کمتر میشه و برعکس (ffmpeg بصورت پیشفرض مقدار medium رو در نظر میگیره)

  • تبدیل فیلم به آلبوم عکس
ffmpeg -i input.mp4 -r 1 -f image2 image-%3d.png

قسمت r- میگه که هر چند فریم عکس بگیره، اینجا ما گفتیم هر 1 فریم، اگه نگیم بصورت پیشفرض هر 25 فریم رو در نظر میگره. قسمت f- فرمت رو مشخص میکنه که ما گفتیم عکسه خروجیمون، و در نهایت خروجیمون که به شکل image-%3d.png هست نشون میده که ما میخوایم اسامی عکس های خروجیمون بصورت image-001.png و image-002.png و همینطور شمارنده به بالا باشه. عدد %3 میگه سه رقم در نظر بگیر. اگه بگیم image%4d.png میشه image0001.png و image0002.png و image0003.png و ...

  • کراپ کردن فیلم
ffmpeg -i input.mp4 -filter:v &quotcrop=640:480:200:150&quot output.mp4

از نقطه ی طول 200 و ارتفاع 150 به اندازه ی یه مربع به طول 640 و ارتفاع 480 رو در نظر بگیر و اون قسمت از ویدئو رو توی کل محتوا کراپ کن و بری توی output.mp4.

  • پوستر آهنگ
ffmpeg -stream_loop 1 -i inputimage.jpg -i inputaudio.mp3 -c:v libx264 -c:a aac -b:a 192k -shortest output.mp4

کامند بالا inputimage.jpg رو به عنوان ورودی اول و inputaudio.mp3 رو به عنوان ورودی دوم میگیره

-c:v libx264

میگه که میخوام خروجی ویدئو از نوع h264 داشته باشم

-c:a aac

میگه خروجیم صداش از نوع aac باشه (یعنی اگه با ffprobe خروجی رو تست کنیم یه استریم صدا از نوع aac داره)

-b:a

میگه بیت ریت صدامون 192k باشه

-shortest

میگه که خروجیمون تا اندازه ای بره که کوچیکترین ورودیمون تایمش تموم شده. این مثلا جایی کاربرد داره
که از یه فیلم تیتراژ پایانیش رو حذف کردین ولی صوتی که دارین تیتراژ رو هم داره، طول خروجی میشه به اندازه ی کوتاه ترین ورود که توی این مثال میشه فیلم بدون تیتراژ (یعنی تیکه آخر تیتراژ از صدای ورودی، توی خروجی نمیاد دیگه)

-stream_loop

یا توی بعضی ورژنا loop هم میگه که میخوایم ورودیمون چندبار تکرار بشه توی خروجی. بیشتر جاهایی کاربرد داره که میخوایم چند بار به هر دلیلی ورودیمون رو تکرار کنیم، مثلا یه شبکه تلویزیونی خصوصی دارین یا یه استریمر رادیو که توش آهنگ دارین و کنداکتور یا همون برنامه زمانیتون 24 ساعت نشده، میتونین بندازین توی یه لوپ (مثلا برنامه ها 12 ساعت باشن و با لوپ 2 دو بار تکرار بشه و 24 ساعت رو پر کنه)

  • چسباندن چند محتوا

فرض کنین میخواین چند تا آهنگ رو پشت سر هم بچسبونین یا چند تا کلیپ فیلم رو. بصورت زیر میشه:

ffmpeg -i &quotconcat:audio1.mp3|audio2.mp3|audio3.mp3|audio4.mp3&quot -c copy output.mp3

اگه میخواین بیشتر متوجه بشین در مورد concat بخونین، ولی خلاصش اینه که جلوی concat چهارتا فایل معرفی کردیم و اینارو میچسبونه پشت سر همدیگه داخل یه فایل به اسم output.mp3.

یه راه دیگه هم برای استفاده از concat هست اونم اینکه مثلا یه فایل داشته باشیم به اسم videos.txt که داخلش لیست فیلمایی که قراره پشت سر هم چسبونده بشه رو گذاشتیم:

file /home/sk/myvideos/part1.mp4 file /home/sk/myvideos/part2.mp4 file /home/sk/myvideos/part3.mp4

و میشه به کمک دستور زیر این فیلم ها رو به هم چسبوند و تازه یه زیرنویس هم بهشون اضافه کرد و ریخت توی output.mp4:

ffmpeg -f concat -safe 0 -i join.txt -c copy output.mp4

قسمتی که پشت ورودی زیرنویس اومده یعنی

-safe 0

نباشه هم نباید مشکلی باشه ولی ممکنه به خطاهایی مثل Unsafe file name و Operation not permitted بر بخورید!

  • تغییر سرعت
ffmpeg -i input.mp4 -vf &quotsetpts=0.5*PTS&quot output.mp4 ffmpeg -i input.mp4 -vf &quotsetpts=5.0*PTS&quot output.mp4

کامند اول فیلم سرعت فیلم رو دو برابر و کامند دوم سرعت رو یک پنجم میکنه. طبیعتا میشه با عوض کردن عدد قبل از PTS سرعت رو متناسب با نیاز تغییر داد (عدد بزرگتر یعنی سرعت کمتر و برعکس)

برای صدا هم میشه بصورت زیر عمل کرد:

ffmpeg -i input.mp4 -filter:a &quotatempo=2.0&quot -vn output.mp4

برای atempo بازه بین 0.5 تا 2 حق انتخاب وجود داره

  • افزودن عکس یا لوگو به فیلم
ffmpeg -i input.mp4 -i logo.png -filter_complex &quotoverlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2&quot -codec:a copy output.mp4

دستور بالا میاد عکس logo.png رو میندازه وسط فیلم. بصورت زیر میشه لوگو رو انداخت گوشه بالا سمت چپ و به اندازه ی 10 در 10 پیکسل:

overlay=10:10

یا مثلا پایین سمت راست با 5 پیکسل فاصله:

overlay=main_w-overlay_w-5:main_h-overlay_h-5

یا پایین سمت چپ یا 8 پیکسل فاصله:

overlay=8:main_h-overlay_h

مقاله زیر هم اضافه شده که برای تغییر اندازه و کار با عکسها میتونید ببینیدش:

https://virgool.io/@mohammad.ghodsian/ffmpeg-image-resizing-efmxeowq25xr

خب توی این مقاله تا حدود قابل قبولی با ffmpeg و کاربرداش آشنا شدین. طبیعتاً متوجه شدین که ffmpeg قابلیت خیلی زیاد داره و خودش دنیاییه برای خودش، و قطعاً توصیه اینه که حسابی باهاش دست و پنجه نرم کنید. از طرفی هم دقت کنید که بجای اینکه بیشتر دنبال پیدا کردن یه کامند خاص برای یه کار خاص باشین، سعی کنین مفهوم و ساختارش رو درک کنید تا بتونید تغییراتی که لازم دارید رو خودتون اعمال کنین.

و آخرین مطلب این که ffmpeg خیلی کامند داره، میتونه حتی خودش یه استریم خالی بفرسته، یا مثلا رنگایی که توی شبکه های خالی میبینید و سوت میکشه رو میتونه خودش ایجاد کنه، همچنین میتونه با توی ایجاد و ویرایش لحظه ای انواع استریمای مختلف هم کمکتون بکنه. بد نیست نگاهی به سایت خودش بندازید و یه چرخی توی داکیومنتاش بزنید. ffmpeg این قابلیت رو داره که توی یه دستور، یعالمه پارامترا و تسکای مختلف براش تعریف بشه. مخصوصاً توی مواردی مثل ترنسکد کردن (حتی توی استریمای آنلاین و زنده، یا شبکه های خصوصی از پیش تعریف شده، و توی کار با انواع vod و aod و nVod و nAod و محتواهای تعاملی و ... هم قابلیتای خوبی رو در اختیارتون میذاره)

یه نکته دیگه: ffmpeg علاوه بر اینکه هم فایلای لوکال یا محلی و روی سیستمتون رو پوشش میده، لینک های http رو هم اگه بهشون دسترسی داشته باشه میتونه عملیات روشون انجام بده، پس عملا میشه به عنوان یه دانلودر (و همزمان تغییر و اعمال رفتاری که خودتون انتظار دارین) هم ازش استفاده کرد!



منتشر شده در ویرگول توسط محمد قدسیان https://virgool.io/@mohammad.ghodsian

https://virgool.io/@mohammad.ghodsian/alice-in-ffmpeg-land-yinzbylr12bf

ffmpegmediacross platformstreamtranscode
مهندس نرم افزار و کارشناس ارشد مدیریت IT (کسب و کار الکترونیک)
شاید از این پست‌ها خوشتان بیاید