คุณจะแปลงทั้งไดเรกทอรี / โฟลเดอร์ด้วย ffmpeg ผ่านทางบรรทัดคำสั่งหรือสคริปต์ชุดเป็นอย่างไร
คุณจะแปลงทั้งไดเรกทอรี / โฟลเดอร์ด้วย ffmpeg ผ่านทางบรรทัดคำสั่งหรือสคริปต์ชุดเป็นอย่างไร
คำตอบ:
คำตอบก่อนหน้าจะสร้างไฟล์เอาต์พุต 1 ไฟล์ชื่อ out.mov เท่านั้น หากต้องการสร้างไฟล์เอาต์พุตแยกกันสำหรับภาพยนตร์เก่าแต่ละเรื่องให้ลองทำสิ่งนี้
for i in *.avi;
do name=`echo "$i" | cut -d'.' -f1`
echo "$name"
ffmpeg -i "$i" "${name}.mov"
done
i was unexpected at this time.
do name=`echo "${i%.*}"`;
จะทำงานกับชื่อไฟล์ที่มีจุด (และช่องว่าง) ในนั้น
.bat
Windows นี้หรือไม่
สำหรับLinuxและmacOSสามารถทำได้ในหนึ่งบรรทัดโดยใช้การขยายพารามิเตอร์เพื่อเปลี่ยนนามสกุลไฟล์ของไฟล์เอาต์พุต:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
ffmpeg
ไม่สามารถอินพุตและเอาต์พุตไปยังไฟล์เดียวกัน 2) ฉันไม่แน่ใจว่าคำสั่ง Bash ทำงานบน Windows 10 หรือไม่ บางทีฉันควรเพิ่มคำตอบที่มีการกำหนดเป้าหมายไปยังระบบที่สามารถใช้ Bash เช่น Linux และ macOS lxs ให้คำตอบกับ Windows สำหรับคำถามนี้
for f in *.mkv; do ffmpeg -i "$f" -map 0 -movflags faststart -c:v libx264 -c:a copy -c:s copy "${f/x265/x264}"; done
และบน Windows:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
FOR /F "tokens=*" %G IN ('dir /b *.mp3') DO ffmpeg -i "%G" -map_metadata -1 -c:v copy -c:a copy "%~nG .mp3"
สคริปต์ทุบตีแบบบรรทัดเดียวทำได้ง่าย - แทนที่*.avi
ด้วยประเภทไฟล์ของคุณ:
for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov ; done
-qscale
แต่เข้ารหัสละเว้นนี้ ลบออกและใช้การตั้งค่าเริ่มต้นหรือใช้-crf
แทน (ค่าเริ่มต้นคือ-crf 23
)
basename
ไม่มีการอ้างถึง subshell ย่อย นี่คือเหตุผลที่ bash มีการขยายเชลล์แทน: สำหรับ i ใน * .avi; ทำ ffmpeg -i "$ i" -qscale 0 "$ (ชื่อฐาน" $ i ".avi)" mov; เสร็จแล้ว
หากต้องการแปลงด้วยไดเรกทอรีย่อยให้ใช้เช่น
find . -exec ffmpeg -i {} {}.mp3 \;
find -name "*.vtt" -exec ffmpeg -i {} {}.srt \;
find *.mp4 -exec ffmpeg -i {} {}.mp3 \;
find . -name *.ogg -or -name *.wma -exec ffmpeg -i {} {}.mp3 \;
find . -name *.wma -exec ffmpeg -i {} {}.mp3 \; -exec rm {} \;
สำหรับ Windows:
ที่นี่ฉันกำลังแปลงไฟล์ (.mp4) เป็นไฟล์ (.mp3) ทั้งหมด
เพียงแค่เปิด cmd ไปที่โฟลเดอร์ที่ต้องการแล้วพิมพ์คำสั่ง
ทางลัด: (ตัวเลือกเสริม)
1. ไปที่โฟลเดอร์ที่มีไฟล์ (.mp4)
2. กด Shift และคลิกซ้ายแล้วเลือก "เปิดหน้าต่าง PowerShell ที่นี่"
หรือ "เปิดหน้าต่างพร้อมรับคำสั่งที่นี่"
3. พิมพ์ "cmd" [NOTE : ข้ามขั้นตอนนี้หากเปิดโดยตรง cmd แทน PowerShell]
4. เรียกใช้คำสั่ง
for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"
หากคุณต้องการใส่สิ่งนี้ลงในไฟล์แบตช์บน Windows 10 คุณต้องใช้ %% i
สำหรับผู้ที่ต้องการแปลงชุดด้วย ffmpeg แต่ต้องการมีส่วนต่อประสาน Windows ที่สะดวกฉันก็พัฒนาส่วนหน้านี้:
https://sourceforge.net/projects/ffmpeg-batch
มันเพิ่ม ffmpeg อินเทอร์เฟซแบบหน้าต่าง, แถบความคืบหน้าและข้อมูลเวลาที่เหลืออยู่, คุณสมบัติที่ฉันพลาดเสมอเมื่อใช้ ffmpeg
หากคุณมี GNU แบบขนานคุณสามารถแปลงไฟล์. avi ทั้งหมดด้านล่างvid_dir
เป็น mp4 แบบขนานโดยใช้ทั้งหมดยกเว้นหนึ่งในคอร์ CPU ของคุณด้วย
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
ในการแปลงจาก / เป็นรูปแบบที่แตกต่างกันให้เปลี่ยน'*.avi'
หรือ.mp4
จำเป็น GNU parallel
ขนานแสดงอยู่ในที่เก็บของลินุกซ์มากที่สุดในแพคเกจซึ่งมักจะเรียกว่า
!
ในส่วนท้ายของ bash one-liners?
ฉันรู้ว่านี่อาจซ้ำซ้อน แต่ฉันใช้สคริปต์นี้เพื่อแปลงไฟล์เป็นชุด
old_extension=$1
new_extension=$2
for i in *."$old_extension";
do ffmpeg -i "$i" "${i%.*}.$new_extension";
done
ใช้เวลา 2 ข้อโต้แย้งเพื่อให้มีความยืดหยุ่นมากขึ้น:
ฉันสร้างนามแฝงสำหรับมัน แต่คุณสามารถใช้มันด้วยตนเองเช่นนี้:
sh batch_convert.sh mkv mp4
นี่จะแปลงmkv
ไฟล์ทั้งหมดเป็นmp4
ไฟล์
อย่างที่คุณเห็นมันอเนกประสงค์มากกว่าเล็กน้อย ตราบใดที่ffmpeg
สามารถแปลงได้คุณสามารถระบุสองส่วนขยายได้
รับบิตเช่นโค้ดกอล์ฟที่นี่ แต่เนื่องจากเกือบคำตอบทั้งหมดจะถูกทุบตี (ยกเว้นหนึ่ง cmd โดดเดี่ยวหนึ่ง) นี่เป็นคำสั่งข้ามแพลตฟอร์มwindows ที่ใช้ powershell (เพราะน่ากลัว):
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
คุณสามารถเปลี่ยน * .avi เป็นอะไรก็ได้ที่ตรงกับวิดีโอต้นฉบับของคุณ
แน่นอนว่าตอนนี้มี PowerShell มาพร้อมการออกแบบมาโดยเฉพาะเพื่อให้บางสิ่งบางอย่างที่ว่าเช่นนี้มากง่าย
และใช่ PowerShell ยังมีอยู่ในระบบปฏิบัติการอื่นที่ไม่ใช่แค่ Windows แต่มาพร้อมกับการติดตั้งล่วงหน้าบน Windows ดังนั้นสิ่งนี้จะเป็นประโยชน์กับทุกคน
ขั้นแรกคุณจะต้องการแสดงรายการไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันดังนั้นเราจะเริ่มด้วย:
ls
คุณสามารถใช้ls -Recurse
หากคุณต้องการแปลงไฟล์ทั้งหมดซ้ำในไดเรกทอรีย่อยด้วยซ้ำ
จากนั้นเราจะกรองเฉพาะไฟล์ประเภทที่เราต้องการแปลงเช่น "avi"
ls | Where { $_.Extension -eq ".avi" }
หลังจากนั้นเราจะส่งผ่านข้อมูลที่ FFmpeg ForEach
ผ่าน
สำหรับอินพุตของ FFmpeg เราจะใช้FullName
- นั่นคือเส้นทางทั้งหมดไปยังไฟล์ และสำหรับการส่งออก FFmpeg ของเราจะใช้Name
- แต่แทนที่ในตอนท้ายด้วย.avi
.mp3
ดังนั้นจะมีลักษณะดังนี้:
$_.Name.Replace(".avi", ".mp3")
ดังนั้นมารวมทั้งหมดเข้าด้วยกันและนี่คือผลลัพธ์:
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
ที่จะแปลงไฟล์ ".avi" ทั้งหมดเป็นไฟล์ ".mp3" ผ่าน FFmpeg เพียงแค่แทนที่สามสิ่งในเครื่องหมายคำพูดเพื่อเลือกประเภทของการแปลงที่คุณต้องการและForEach
อย่าลังเลที่จะเพิ่มอาร์กิวเมนต์อื่น ๆ ลงใน FFmpeg
คุณสามารถทำขั้นตอนนี้ต่อไปและเพิ่มRemove-Item
ไปยังจุดสิ้นสุดเพื่อลบไฟล์เก่าโดยอัตโนมัติ
หากffmpeg
ไม่ได้อยู่ในเส้นทางของคุณและจริง ๆ แล้วอยู่ในไดเรกทอรีที่คุณอยู่ให้เขียน./ffmpeg
ตรงffmpeg
นั้น
หวังว่านี่จะช่วยทุกคน
.ps1
ไฟล์ไม่ใช่.bat
ไฟล์ คุณจะต้องเรียกใช้Set-ExecutionPolicy RemoteSigned
ในฐานะผู้ดูแลระบบหากคุณไม่เคยเรียกใช้สคริปต์ PS มาก่อน
หน้าต่าง:
@echo off
for /r %%d in (*.wav) do (
ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%
%~nd.2.mp3"
)
นี่คือตัวแปรบิตเรตของคุณภาพ 2 คุณสามารถตั้งค่าเป็น 0 ถ้าคุณต้องการ แต่ถ้าคุณไม่มีระบบลำโพงที่ดีจริงๆมันไร้ค่า
ถ้าคุณต้องการติดต่อแบบกราฟิกที่จะดำเนินการกับชุด ffmpegX ลองด่วน Batcher ฟรีและจะใช้การตั้งค่า ffmpegX สุดท้ายของคุณเพื่อแปลงไฟล์ที่คุณปล่อย
โปรดทราบว่าคุณไม่สามารถลากโฟลเดอร์ไปยัง Quick Batcher ได้ ดังนั้นเลือกไฟล์แล้ววางผ่าน Quick Batcher
เฉพาะอันนี้ใช้ได้สำหรับฉันเท่านั้นโปรดสังเกตว่าคุณต้องสร้างโฟลเดอร์ "newfiles" ด้วยตนเองที่ไฟล์ ffmpeg.exe ตั้งอยู่
แปลง ไฟล์เป็น. wav รหัสเสียง:
for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause
เช่นถ้าคุณต้องการแปลงไฟล์ .mp3 ทุกการเปลี่ยนแปลง .wav ไป("*.*")
("*.mp3")
ผู้เขียนสคริปต์นี้คือ:
https://forum.videohelp.com/threads/356314-How-to-batch-convert-multiplex-any-files-with-ffmpeg
หวังว่ามันจะช่วย🙏
จะเป็นการสร้างวิดีโอ mp4 จากไฟล์ jpg ทั้งหมดจากไดเรกทอรีปัจจุบัน
echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");
และสำหรับ Windows สิ่งนี้ใช้ไม่ได้
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
%
แม้ว่าผมจะทำสองเท่าของผู้ที่
ฉันอยากจะแนะนำ:
-acodec ***libmp3lame***
เพิ่มเติม:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec libmp3lame "%~nG.mp3"
นี่คือสิ่งที่ฉันใช้ในการแปลงชุด avi เป็น 1280x mp4
FOR /F "tokens=*" %%G IN ('dir /b *.avi') DO "D:\Downloads\ffmpeg.exe" -hide_banner -i "%%G" -threads 8 -acodec mp3 -b:a 128k -ac 2 -strict -2 -c:v libx264 -crf 23 -filter:v "scale=1280:-2,unsharp=5:5:1.0:5:5:0.0" -sws_flags lanczos -b:v 1024k -profile:v main -preset medium -tune film -async 1 -vsync 1 "%%~nG.mp4"
ทำงานได้ดีเช่นเดียวกับไฟล์ cmd เรียกใช้ลูปจะค้นหาไฟล์ avi ทั้งหมดในโฟลเดอร์นั้น
เรียก MY (เปลี่ยนเพื่อคุณ) ffmpeg, ผ่านชื่ออินพุต, การตั้งค่าสำหรับการปรับขนาดด้วยการลับภาพ ฉันไม่จำเป็นต้องใช้ CRF และ " -b:v 1024k
" ...
ไฟล์เอาต์พุตเป็นไฟล์อินพุตลบส่วนขยายโดย mp4 เป็นส่วนขยายใหม่
ฉันใช้หนึ่งซับใน linux เพื่อแปลงไฟล์ (ปกติคือ H265) เป็นสิ่งที่ฉันสามารถเล่นบน Kodi ได้โดยไม่มีปัญหา:
for f in *.mkv; do ffmpeg -i "$f" -c:v libx264 -crf 28 -c:a aac -b:a 128k output.mkv; mv -f output.mkv "$f"; done
สิ่งนี้จะแปลงเป็นไฟล์ชั่วคราวจากนั้นแทนที่ต้นฉบับเพื่อให้ชื่อยังคงเหมือนเดิมหลังจากการแปลง
นอกจากนี้หากคุณต้องการแปลงเดียวกันในโฟลเดอร์ย่อย นี่คือรหัสซ้ำ
for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
ffmpeg.exe -i "%%~f" "%%~f.mp4"
)
สคริปต์ PHP เล็กน้อยที่จะทำ:
#!/usr/bin/env php
<?php
declare(strict_types = 1);
if ($argc !== 2) {
fprintf ( STDERR, "usage: %s dir\n", $argv [0] );
die ( 1 );
}
$dir = rtrim ( $argv [1], DIRECTORY_SEPARATOR );
if (! is_readable ( $dir )) {
fprintf ( STDERR, "supplied path is not readable! (try running as an administrator?)" );
die(1);
}
if (! is_dir ( $dir )) {
fprintf ( STDERR, "supplied path is not a directory!" );
die(1);
}
$files = glob ( $dir . DIRECTORY_SEPARATOR . '*.avi' );
foreach ( $files as $file ) {
system ( "ffmpeg -i " . escapeshellarg ( $file ) . ' ' . escapeshellarg ( $file . '.mp4' ) );
}
escapeshellarg()
และใช้งานได้ทั้งบน windows และ linux ฉันเห็นด้วยมันเป็นกรณีที่ขอบ
อีกวิธีง่ายๆที่ยังไม่ได้รับการแนะนำจะใช้xargs
:
ls *.avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"
หนึ่งหลุมพรางเล็ก ๆ น้อย ๆ คือการตั้งชื่อที่น่าอึดอัดใจของไฟล์ที่ส่งออก (เช่น input.avi.mp4
) วิธีแก้ปัญหาที่เป็นไปได้สำหรับสิ่งนี้อาจเป็น:
ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4"
"