1399-12-21 22:19 FFmpeg - هر کار ویدیویی و صوتی را می توانید با FFMPEG انجام دهید
afshin160

 
یا ابا صالح ادرکنی

FFmpeg

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

1399-12-21 22:48 ffmpeg
afshin160

 
ffmpeg چیست : یک نرم افزار سورس باز هست که روی ویندوز ، لینوکس و IOS قابل استفاده می باشد .

سایت ffmpeg

من از خط فرمان ffmpeg استفاده می کنم . لذا یکسری از دستوراتی که خودم استفاده کرده ام خدمتتان عرض می کنم .

خط فرمان های زیر را در command prompt یا powershell در ویندوز اجرا می کنیم .

D:\ffmpeg.exe -i d:\file1.avi d:\file1.mp4


خوب اول مسیر فایل ffmpeg را میدهیم و بعد با i- مسیر فایل مبدا با فرمتش را قید می کنیم و بعد بلا فاصله مسیر و فرمت فایل مقصد را می نویسیم
نکته 1: اگر در مسیری کلمات فارسی یا کاراکتر خاصی داشتید مسیر ها را داخل " " قراردهید . مثلا :
"D:\لیست\ffmpeg.exe"


نکته2 : تقریبا از هر فرمتی به هر فرمتی قابل تبدیل می باشد . (audio و video)

برای کوتاه شدن به شکل خلاصه می نویسم .
#cut mp3
ffmpeg.exe -ss 10 -to 16 -i input.mp3 output.mp3

در این دستور از ثانیه 10 فایل به مدت 16 ثانیه جدا می کند و در در فایل خروجی یه فایل 16 ثانیه ایجاد می کند .

#Extract the audio from video
ffmpeg.exe -i input.mp4 -vn -ab 256 output.mp3

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


#Mute a video (Remove the audio component)
ffmpeg.exe -i input.mp4 -an output.mp4

در این دستور صدای فیلم را ازش میگیریم و در واقع فیلم بی صدا میشود.

#Change the audio volume
ffmpeg.exe -i input.mp3 -af 'volume=5' output.mp3

صدای فایل را تا5 برابر بالا میبرد .
1399-12-22 00:42 ffmpeg
afshin160

 
حال به یکسری از دستورات دیگر می پردازیم :

# گرفتن تمام فریم های یک ویدو
ffmpeg.exe -i input.mkv -r 1/1 output %03d.bmp

با این دستور می تونید تمام فریم های یک فیلم را بیرون بکشید .

#crop video
ffmpeg.exe -i input .mp4 -filter:v "crop=9:3:150:250" output .mp4

یک قسمتی از صفحه فیلم را برش می دهد که با "crop=9:3:150:250" اندازه وجای اون مشخص می شود .

#Add an image in front of video using ffmpeg اضافه کردن عکس به فیلم
ffmpeg.exe -i input .mp4 -i frames_1.png -filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" -pix_fmt yuv420p -c:a copy output.mp4

یک عکس و یک فیلم می دهیم و می گوییم در چه موقعیتی و( 25 عرض و 25 طول ) چه زمانی (ثانیه 0 تا تانیه 20 ) و در خروجی به ما فیلمی با افزودن اون عکس به ما می دهد .

# merge two file audio
ffmpeg.exe -i "concat:input1.mp3| input 2.mp3" -codec copy output.mp3

با این دستور می توانید دوفایل را به هم بچشبانید .

1399-12-22 01:51 ffmpeg.exe , ffplay.exe , ffprobe.exe
afshin160

 
# پاک کردن کلیه متادیتاها
ffmpeg.exe -i input.mp3 -map 0 -map_metadata -1 -c copy output.mp3

#پاک کردن متادیتا و قراردادن دیتای جدید
ffmpeg.exe -i input.mp3 -map_metadata -1 -c:v copy -metadata title="test afshin2" -c:a copy output.mp3

# درج متادیتا
ffmpeg.exe -i input.ts -metadata title="my afshin" output.ts

# خواندن متا دیتا
#ffmpeg.exe -i input_video.mp3 -f ffmetadata metadata.txt

# پخش فیلم بی صدا
ffplay.exe -i input.mp4 -vf "select=not(mod(n\,1))" -an

نکته 3: an- باعث حذف صدا می شود .

نکته 4 : برای افزایش سرعت های خیلی زیاد که معمولا برای مونیتورینگ می باشد باید فرمت ts باشد
#یعنی به صورت هر 120 فریم یک فریم نمایش میدهد
ffplay.exe -i my.ts -vf "select=not(mod(n\,120))" -an


#اطلاعات دقیقی از کدک و فرمت و تایم متادیتای فایل می دهد
ffprobe.exe input.mp4
1399-12-22 02:07 ffmpeg , ffplay , ffprobe - روی کل فیلم تایم می اندازد
afshin160

 
ffmpeg , ffplay , ffprobe
# روی کل فیلم تایم می اندازد

اگر دستورات زیر را در powershell بنویسید روی کل فیلم در جایی که شما مشخص می کنید تایم همان لحظه فیلم را با هر متن دیگری که بخواهد نشان میدهد




$Source="E:\ok\myt2.mp4" # مسیر فایل مبدا
$target="E:\ok\tv3_1219_2100.mp4" #مسیر فایل مقصد
$hour="21" # ساعت شروع
$Minutes="57" # دقیقه شروع
$Fontsize="36" # بزرگی فونت
$FontColor="yellow" #رنگ فونت
$Boxcoler="black" # رنگ پس زمینه فونت
$transparent="0.9" # روشنایی پس زمینه فونت
$x="150" # محل قرار گیری فونت در محور طول ها
$y="2" # محل قرار گیری فونت دز محور عرض ها
$FontFile="E\:\\ok\\FreeSerif.ttf" # مسیر فایل فونت
$Timecode_reate="25" # فرمت reate

Remove-Item $target # پاک کردن فایل مقصد در صورت وجود

$paramet= "drawtext=fontfile='"+$FontFile+"':fontsize="+$Fontsize
$paramet+=":fontcolor="+$FontColor+":x="+$x+":y="+$y+":box=1:boxcolor="+$Boxcoler
$paramet+="@"+$transparent+": rate=2:timecode='"
$paramet+=$hour +"\:"+ $Minutes+ "\:00\:00':timecode_rate="+$Timecode_reate

اعمال تغییرات با ffmpeg.exe
E:\ok\ffmpeg.exe -y -i $Source -vf $paramet $target

پخش فایل ایجاد شده از مسیر مشخص شده با ffplay.exe
E:\ok\ffplay.exe -i $target
1400-01-04 21:41 برش قسمتی از ویدیو یا صدا - تغییر فرمت تمام فایل های یک فلدر
afshin160

 
برش قسمتی از فیلم یا صدا :


#Cut video file into a smaller clip از ثانیه 50 به طول 20 ثانیه برش میزند
E:\ok\ffmpeg.exe -i E:\ok\my3.mp4 -ss 00:00:50.0 -codec copy -t 20 E:\ok\test10.mp4



Clear-Host
ForEach ($file in Get-ChildItem D:\MyAfshin\Video\ -filter "*.mpg")
{
$myArray= $file.name.split(".",2)
$myArray[0]
$Source="D:\MyAfshin\Video\" + $myArray[0] + ".mpg"
$Newitem="D:\MyAfshin\Video\"+ $myArray[0]+".mp4"

if ((Test-Path $Source ) -and ( Test-Path $Newitem) )
{
Remove-Item $Source
}
D:\MyAfshin\ffmpeg.exe -i $Source $Newitem -threads 5
Remove-Item $Source
}

درکد با لا هرچی فایل mpg در مسیر مشخص شده می باشد را تغییر فرمت به mp4 میده و فایل های mpg قبلی را هم حذف می کند .
دو روز پیش pcm_s24le - 1*QP2LAMBDA - 56*QP2LAMBDA - xd5c - mxf - XDCam hd 422 50i- 16*9 - 1920*1080 - تبدیل فرمت بدون استفاده از کپی کدک - codec - Downmix both channels
afshin160

 
سلام . وقت بخیر
امروز شما رو با تجربه ای جدید آشنا می کنم که چند روزی من رو سرکار گذاشت .... حقیقتش ما در شرکت احتیاج داشتیم که فایلی بافرمت MXF را به MXF تبدیل کنیم .!! خوب شما هم بهتر از من می دونید که به ظاهر MXF ----> MXF بی معنی هست . ولی حقیقت این هست هر گردی گردو نیست . ما به MXF ی با مشخصات XDcam HD 4.2.2 50i 1920*1080 و 16*9 - 25 f احتیاج داشتیم . که تو چرخه با این قالب به مشکل بر نخورد . و برحسب شرایط کد ها مون نمی تونستیم از کپی کدک استفاده کنیم . ولذا می بایست این property ها را خودمان به فایل تخصیص می دادیم . و بعد از چند روز بالاخره موفق شدم .... و اون کد زیر هست :




E:\ReadMemoryConcatFile\ffmpeg.exe -i E:\ReadMemoryConcatFile\109_4429.MXF -c:a pcm_s24le -ar 48000 -ac 1 -map 0:0 -map 0:1 -map 0:1 -map 0:1 -map 0:1 -map 0:1 -map 0:1 -map 0:1 -map 0:1 -vf copy -field_order tt -top 1 -flags +ildct+ilme -alternate_scan 1 -g 12 -timecode 01:00:00:00 -c:v mpeg2video -r 25 -pix_fmt yuv422p -vf scale=1920x1080 -aspect 16:9 -color_range 1 -color_primaries 1 -color_trc 1 -colorspace 1 -non_linear_quant 1 -dc 11 -intra_vlc 1 -qmin 1 -lmin "1*QP2LAMBDA" -qmax 28 -lmax "56*QP2LAMBDA" -b:v 50000000 -minrate 50000000 -maxrate 50000000 -minrate 50000000 -bufsize 17825792 -bf 2 -metadata creation_time=now -vtag xd5c -intra_matrix 8,17,17,19,17,19,21,21,21,21,21,21,23,22,23,24,24,24,24,24,24,24,25,25,25,26,26,26,29,29,29,26,26,26,25,25,27,27,28,29,29,29,31,32,32,31,31,30,30,33,33,34,34,34,38,38,37,37,43,43,44,50,50,58 -inter_matrix 16,17,17,18,18,18,19,19,19,19,20,20,20,20,20,21,21,21,21,21,21,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,24,24,24,25,24,24,24,25,26,26,26,26,25,27,27,27,27,27,28,28,28,28,30,30,30,31,31,33 -f mxf E:\ReadMemoryConcatFile\test10.mxf



خب خوب بود . جواب کار ما رو داد . ... ولی از اونجا که همیشه کار به اینجا ختم نمیشه یه مشکل دیگه داشتیم و اون هم این بود که باند صدا ی ما 8 کاناله Stereo بود و ما می بایست باند صدا مون می شد Mono و 2 کاناله که کانال چپ صدای محیط باشه و باند راست صدای میکروفن !!!... آخه چرا ... نه ....
خوب یه کمی جستجو از خود سایت FFMpeg پیدا کردم ... آخ جون ....



-filter_complex "[0:a]channelsplit=channel_layout=stereo"

و از دیگر کدهایی که پیدا کردم این ها بودن :

ffmpeg -i stereo.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav
ffmpeg -i stereo.wav -filter_complex "[0:0]pan=1|c0=c0[left]; [0:0]pan=1|c0=c1[right]" -map "[left]" left.wav -map "[right]" right.wav
-threads "16"
-filter_complex channelsplit
-filter_complex amix=inputs=2uration=longest

-filter_complex "[0:a]channelsplit[l][r]" -map 0:v -map "[l]" -map "[r]"
-filter_complex "[0:a]channelsplit=channel_layout=stereo"


اینم لینکی از خود سایت اصلی که هرنوع تبدیل کانال صدایی را یاد داده