لینوکس و من

اسکریپت جدا کردن یک تکه از فیلم بوسیله FFMPEG

نویسنده : امین | تاریخ: 1395/07/5

چند وقت پیش در مورد اینکه چطوری یه تیکه از فیلمی رو بوسیله ffmpeg جدا کنیم نوشته بودم. اینجا بخونید.
به یاد سپردن این دستورات طویل ffmpeg کار راحتی نیست! بنابراین اومدم با توجه به اسکریپتی که یکی از دوستان در انجمن فارسی کاربران آرچ برای کمک به من نوشته بود (در مورد واترمارک کردن فیلمها) یه اسکریپت برای این کار تهیه کردم:
#!/bin/bash

path_of_first_file=$(dirname "$1")
name_of_first_file=$(basename "$1")
startpoint=$2
duration=$3

new_name="$(echo "$name_of_first_file.mp4")"
new_output=$(echo "$path_of_first_file/$new_name")

ffmpeg -loglevel panic -i "$1"  -vcodec copy -acodec copy -ss "$2" -t "$3"  "$new_output"

echo
echo "New video saved in: " "$path_of_first_file"\/$new_name

وقتی این اسکریپت رو جایی ذخیره کنید و بهش مجوز اجرایی بدید، و بعد یک alias براش تعریف کنید، (مثلا vidcut) به راحتی با دستوری مشابه این میتونید تکه ی دلخواهتون رو از فیلم جدا کنید:
vidcut /path/to/video.mp4 00:12:30 00:03:08
قسمت نارنجی که واضحه، مسیر فایل ویدیویی هست. یعنی از  دقیقه ۱۲ و ثانیه ۳۰ ( قسمت سبز) شروع کن و به مدت سه دقیقه و هشت ثانیه فیلم رو کات کن (قسمت صورتی). تکه کات شده با نام جدید و با پسوند mp4 در همون محل فایل اصلی ذخیره میشه.

جدا کردن یک تکه از فیلم بوسیله FFMPEG

نویسنده : امین | تاریخ: 1395/06/11

برای اینکه یک قسمت از یک فایل ویدیویی رو جدا کنیم خیلی راحت میتونیم از ffmpeg استفاده کنیم. مثلا:

ffmpeg -i /PATH/TO/INPUT.mp4  -vcodec copy -acodec copy -ss 00:02:55 -t 00:01:00 /PATH/TO/OUTPUT.mp4
یعنی از دقیقه ۲ و ثانیه ۵۵ (مقدار سبز) به مدت یک دقیقه (مقدار بنفش)، این تکه از فیلم کات بشه و در فایل مورد نظر ما ذخیره بشه.
به همین راحتی. به همین خوشمزگی.

یک اسکریپت برای ایجاد واترمارک روی ویدیو

نویسنده : امین | تاریخ: 1395/05/16

نیاز داشتم به اینکه یک واترمارک روی یک سری ویدیوهای آموزشی قرار بدم. سرچ کردم و روشش رو با ffmpeg پیدا کردم. منتها اگه میخواستی برای هر ویدیو اون دستور طولانی رو اجرا کنی سخت میشد! برای همین از دوستان انجمن فارسی آرچ کمک گرفتم تا یک اسکریپت داشته باشم برای اینکار. آقای Arcush زحمت کشیدن و این اسکریپت رو ساختن.

اول اینکه دستور اولی به این شکل بود:
ffmpeg -i '/PATH/TO/INPUT.flv'  -i /PATH/TO/wm.png -filter_complex '[0:v][1:v]overlay=15:10[outv]' -map [outv] -map 0:a -c:a copy -c:v libx264 -crf 22 -preset veryfast output.mp4
یا
ffmpeg -i '/PATH/TO/INPUT.flv' -i /PATH/TO/wm.png -filter_complex "overlay=15:10" -preset veryfast output.mp4



دستور بالا واترمارکی که در مسیر مشخص شده قرار گرفته روی فایلی که مورد نظر ماست قرار میده و اون رو با نام output.mp4 در پوشه home کاربر میسازه. چیز جالبیه. اما راحت نیست. 15:10 هم یعنی ۱۵ واحد از سمت چپ و ۱۰ واحد از سمت بالا فاصله داشته باشه.
#!/bin/bash 
for k in $(ls *.wmv); do ffmpeg -i "$k" -i ~/wm.png -filter_complex '[0:v][1:v]overlay=15:10[outv]' -map [outv] -map 0:a -c:a copy -c:v libx264 -crf 22 -preset veryfast "new-$k"; done
یا
for k in $(ls *.wmv); do ffmpeg -i "$k" -i ~/wm.png -filter_complex "overlay=15:10" -preset veryfast "new-$k"; done




اگه ما دستور بالا رو به این شکل در بیاریم، و اون رو در یک اسکریپت مثلا با نام addwmall قرار بدیم، و اون رو در پوشه ای که فیلمهای ما قرار دارند اجرا کنیم، فایل wm.png که باید در فولدر ویدیوها موجود باشه به تمام  فایل‌های wmv در پوشه ای که اسکریپت در اون ایجاد میشه اضافه میشه. که این هم خوبه، ولی چیزی که میخواستم اسکریپت پایینی بود که دوست خوبم در انجمن آرچ اون رو نوشت:
#!/bin/bash

path_of_first_file=$(dirname "$1")
name_of_first_file=$(basename "$1")

new_name="new-$(echo "$name_of_first_file.mp4")"
new_output=$(echo "$path_of_first_file/$new_name")

ffmpeg -i "$1"  -i "$2" \
-filter_complex "overlay=15:10" -preset veryfast "$new_output"

echo
echo "New video saved in: " "$path_of_first_file"\/$new_name
با اسکریپت بالا میتونیم دو مقدار فایل ویدیویی و فایل واترمارک رو بهش بدیم، تا یک فایل حاوی واترمارک با نام جدید در کنار فایل ویدیوی قبلی ایجاد بشه. مثلا:
addwm /PATH/TO/INPUT.flv /PATH/TO/wm.png

طبق تجربه ای که در کار با اسکریپت داشتم دریافتم که فایلهای flv وقتی روشون واترمارک میذاریم با کیفیت بدی ذخیره میشن. اگه اونها پسوند mp4 داشته باشن درست میشه. برای همین در اسکریپت بالا اون mp4. رو که برنگ سبز مشخص کردم اضافه کردم تا همه ی فایلهای واترمارک شده mp4 باشن اصلا! بنابراین میتونین اون new_ هم که با نارنجی مشخص کردم حذف کنین. چون مثلا فایلی به اسم video.flv به فایلی به اسم video.flv.mp4 تبدیل میشه و نیازی به new_ نیست.

فیلم برداری از دسکتاپ با ffmpeg (کامل تر شد)

نویسنده : محسن شایان | تاریخ: 1394/09/7

برای فیلم‌برداری از دسکتاپ نرم‌افزارهای زیادی هست ولی ffmpeg ساده‌ترین راه برای اینکار هست مخصوصاً اگر با alias ها راه‌ترش هم بکنید.
من خودم از این روش استفاده می‌کنم چون دسکتاپ من 1680x1050 هست اینجا هم به همین صورت هست پس تغییرش بدید به اندازه تصویرتون.
برای بدست آوردن نسبت تصویر اگر xrandr در توزیع شما استفاده شده باشه با این دستور به راحتی نمایش میده:

xrandr | grep \* | awk '{print $1}'
   3200x1800


و مقدار اندازه تصویر خودتون رو در دستور زیر قرار بدید:
echo "alias capture='ffmpeg -loglevel panic -video_size 3200x1800 -framerate 25 -f x11grab -i :0 output.mp4'" >> ~/.bashrc

از این پس Terminal رو باز کنید و capture رو بنویسید و اینتر بزنید خودکار شروع به ضبط کردن میشه تا وقتی که q رو بزنید و متوقفش کنید.

اگر میخواید صدا هم همراه فیلم ضبط بشه، برای pulse audio این دستور:
 ffmpeg -loglevel panic -video_size 1366x768 -framerate 25 -f x11grab -i :0 -f pulse -ac 2 -i default output.mkv


و برای ALSA این دستور رو بجای دستور اول قرار بدید.
 ffmpeg -loglevel panic -video_size 1024x768 -framerate 25 -f x11grab -i :0 -f alsa -ac 2 -i hw:0 output.mkv


میتونید یک alias جدا برای ویدیو با صدا مثلا acap و یکی برای بدون صدا مثلا vcap تعیین کنید.

اگر ازffmpeg -loglevel panic استفاده کنید یک ترمینال کاملا پاک خواهید داشت و فقط خطاها نمایش داده میشن.

ویرایش جدید:
میتونیم از این اسکریپت ها استفاده کنیم. برای ضبط بدون صدا:
#!/bin/bash
scr="$(xrandr | grep \* | awk '{print $1}')"
filename="$(date +%F_%H:%M:%S.mp4)"

echo "Capturing screen... Press q to stop."
ffmpeg -loglevel panic -video_size $scr -framerate 25 -f x11grab -i :0 $filename
echo "Video file saved to ~/$filename"



و برای ضبط با صدا:
#!/bin/bash
scr="$(xrandr | grep \* | awk '{print $1}')"
filename="$(date +%F_%H:%M:%S.mp4)"

echo "Capturing screen with audio... Press q to stop."
ffmpeg -loglevel panic -video_size $scr -framerate 25 -f x11grab -i :0 -f pulse -ac 2 -i default $filename
echo "Video file saved to ~/$filename"

توضیح:
یه متغیر به اسم scr تعریف کردیم و بجای رزلوشن قرار دادیم که دیگه لازم نباشه اول با xrandr مقدارش رو پیدا کنید و توی دستور بنویسید. خود اسکریپت این کار رو برای ما میکنه.
و یک متغیر دیگه به نام filename درست کردیم که اسامی ویدیو هایی که ذخیره میشن بر اساس تاریخ و زمان باشن. این خیلی راحت تره تا اینکه همه ویدیو ها هم نام باشن و اگه بخوایم نگهشون داریم تک تک اسمهاشون رو عوض کنیم! با این کار ویدیوها در فایلهای جدا و با اسمهای مختلف ذخیره میشن.