ฉันมีไฟล์ mp3 มากมายที่มีความยาวต่างกัน ฉันต้องการลดความยาวลงเหลือ 50% -60% กล่าวว่าจาก 1 นาทีถึง 30 วินาที ควรใช้ ffmpeg เล็กน้อย แต่ฉันไม่รู้วิธีกำหนดความยาวดั้งเดิมของมันเป็นฐานสำหรับการประมวลผลโดยใช้ ffmpeg
ใครมีความคิด?
ฉันมีไฟล์ mp3 มากมายที่มีความยาวต่างกัน ฉันต้องการลดความยาวลงเหลือ 50% -60% กล่าวว่าจาก 1 นาทีถึง 30 วินาที ควรใช้ ffmpeg เล็กน้อย แต่ฉันไม่รู้วิธีกำหนดความยาวดั้งเดิมของมันเป็นฐานสำหรับการประมวลผลโดยใช้ ffmpeg
ใครมีความคิด?
คำตอบ:
ด้วย ffmpeg ไม่มีทางที่ฉันรู้ว่าจะได้รับความยาวเป็นตัวแปรที่คุณสามารถใช้กับสคริปต์ได้ แต่mp3infoทำ
mp3info -p "%S" sample.mp3 // total time in seconds
\n
เพื่อพิมพ์บรรทัดใหม่ด้วย > mp3info -p "%S\n" sample.mp3
// เวลาทั้งหมดเป็นวินาที
ffmpeg
จะพิมพ์ทุกอย่างที่รู้เกี่ยวกับไฟล์หากคุณไม่ได้ให้ข้อโต้แย้งอื่น ๆ ใช้grep
เพื่อตัดออกทุกอย่างยกเว้น "ระยะเวลา":
$ ffmpeg -i foo.mp3 2>&1 | grep Duration
Duration: 01:02:20.20, start: 0.000000, bitrate: 128 kb/s
mplayer
นอกจากนี้คุณยังสามารถใช้ Grep สำหรับบรรทัด "ID_LENGTH =":
$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00
TOTLENGTH=0; for f in *.mp3; do LENGTH=$(mplayer -ao null -identify -frames 0 "$f" 2>&1 | awk -F= '/ID_LENGTH/ {print $2}' | awk -F. '{print $1}'); TOTLENGTH=$(($TOTLENGTH + $LENGTH)); done; echo $TOTLENGTH
พิมพ์ความยาวรวมของเสียงในไฟล์ทั้งหมดในไม่กี่วินาที มันสามารถทำได้อย่างมีประสิทธิภาพมากขึ้น แต่เมื่อฉันเขียนเป็นครั้งเดียวมันก็ดีพอสำหรับความต้องการของฉัน (การร้องขอ awk ครั้งที่สองตัดทศนิยมดังนั้นผลลัพธ์จึงไม่แม่นยำ 100% แต่ดีพอสำหรับความต้องการของฉันอีกครั้ง)
Estimating duration from bitrate, this may be inaccurate
นี้ ฉันคิดว่าคำตอบนี้ใช้ได้เฉพาะกับConstant Bitrate MP3 เท่านั้น
ที่น่าสนใจแอพพลิเคชั่นEXIFToolให้ระยะเวลา MP3 เป็นบรรทัดสุดท้าย!
$ exiftool somefile.mp3 หมายเลขรุ่น ExifTool: 7.98 ชื่อไฟล์: somefile.mp3 ไดเรกทอรี: ขนาดไฟล์: 49 MB วันที่ / เวลาที่แก้ไขไฟล์: 2009: 09: 10 11: 04: 54 + 05: 30 ประเภทไฟล์: MP3 ประเภท MIME: audio / mpeg MPEG Audio เวอร์ชั่น: 2.5 เลเยอร์เสียง: 3 บิตเรตเสียง: 64000 อัตราตัวอย่าง: 8000 โหมดช่อง: ช่องเดียว MS สเตอริโอ: ปิด สเตอริโอความเข้ม: ปิด ธงลิขสิทธิ์: เท็จ สื่อต้นฉบับ: จริง เน้น: ไม่มี ขนาด ID3: 26 ประเภท: เพลงบลูส ระยะเวลา: 1:47:46 (โดยประมาณ)
อีกวิธีหนึ่งในการรับระยะเวลาใช้ffmpeg
และgrep
:
# ffmpeg -i rara.mp3 2>&1 |grep -oP "[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{2}"
00:03:49.12
โซลูชันที่ใช้การffmpeg
นัดหยุดงานของฉันมีความเปราะบางเล็กน้อยเนื่องจากมีการแยกวิเคราะห์เอาต์พุตที่ไม่ได้รับการออกแบบให้เป็นส่วนต่อประสาน ที่กล่าวว่าพวกเขาอาจจะยังคงทำงานเป็นเวลาหลายปีโดยไม่คำนึงถึง
ffmpeg
มาพร้อมกับเครื่องมือffprobe
ในการรับข้อมูลเกี่ยวกับไฟล์เสียง (หลายรูปแบบรวมถึง mp3) และสามารถสร้างเอาต์พุตที่เครื่องอ่านได้ คำสั่งดังต่อไปนี้จะได้รับระยะเวลาเพลง
ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'
ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
ฉันใช้Mplayerเป็นการส่วนตัวเพื่อดึงข้อมูลส่วนใหญ่เป็นเพราะฉันได้ทำการติดตั้งไปแล้วและไม่สามารถติดตั้งซอฟต์แวร์ใหม่ได้โดยไม่จำเป็น ข้อดีของการทำเช่นนี้คือไม่ จำกัด เฉพาะไฟล์ mp3 และควรทำงานกับไฟล์สื่อใด ๆ ที่ Mplayer สามารถจัดการได้ หนึ่งซับต่อไปนี้จะคืนความยาวของแทร็กในไม่กี่วินาที
mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2
คุณสามารถใช้ ffmpeg เพื่อรับช่วงเวลาของไฟล์ เพียงใช้:
ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//
ฉันมีปัญหาเดียวกันและพบว่าคำสั่ง mplayer (goldPseudo) ทำงานได้ดี แต่ต่อมาฉันค้นพบว่าถ้าคุณเปิดอัลบั้มใน RhythmBox คุณจะเห็นบรรทัดสถานะให้จำนวนแทร็กเวลาเล่นทั้งหมดและขนาดแผ่นดิสก์
นี่คือความเรียบง่ายของฉันโดยใช้การอ้างอิงด้านบน
mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'
10:47:15
ฉันส่งค่านั้นไปยังตัวแปร mp3_full_length
mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
read -r mp3_full_length <<< `ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'`
# I can use this variable for my own purpose!
echo $mp3_full_length
10:47:15
ขอบคุณคนข้างต้น! ฉันใช้ความคิดและความรู้ของคุณขอบคุณสำหรับการอ่านขอให้มีความสุขมาก ๆ ในวันนี้! ;)