รับความยาว MP3 ใน Linux / FreeBSD


27

ฉันมีไฟล์ mp3 มากมายที่มีความยาวต่างกัน ฉันต้องการลดความยาวลงเหลือ 50% -60% กล่าวว่าจาก 1 นาทีถึง 30 วินาที ควรใช้ ffmpeg เล็กน้อย แต่ฉันไม่รู้วิธีกำหนดความยาวดั้งเดิมของมันเป็นฐานสำหรับการประมวลผลโดยใช้ ffmpeg

ใครมีความคิด?

คำตอบ:


31

ด้วย ffmpeg ไม่มีทางที่ฉันรู้ว่าจะได้รับความยาวเป็นตัวแปรที่คุณสามารถใช้กับสคริปต์ได้ แต่mp3infoทำ

mp3info -p "%S" sample.mp3   // total time in seconds

ใช่ไม่มีวิธีรับข้อมูลความยาวใน ffmpeg ฉันระบุไว้ที่นั่นแล้วฉันใช้ ffmpeg หลังจากได้รับความยาวเท่านั้น อย่างไรก็ตามขอขอบคุณสำหรับหัวขึ้น
ariefbayu

4
น่าสังเกตว่านี่ให้ความยาวเป็นจำนวนเต็มเท่านั้น ดังนั้นอาจไม่แม่นยำพอสำหรับบางกรณีการใช้งาน
Ross

คำตอบที่ดีที่สุดในขณะที่ใช้งานได้กับ MP3 เฉลี่ยหรือบิตเรตตัวแปร!
KrisWebDev

1
เพิ่ม\nเพื่อพิมพ์บรรทัดใหม่ด้วย > mp3info -p "%S\n" sample.mp3 // เวลาทั้งหมดเป็นวินาที
nexayq

22

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

3
$ ffmpeg -i foo.mp3 2> & 1 | awk '/ Duration / {print substr ($ 2,0, length ($ 2) -1)}' เพียงส่วนเวลา
Craig Tataryn

หากต้องการหาผลรวมความยาวของชุดไฟล์ MP3 คุณสามารถใช้สิ่งที่ต้องการ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% แต่ดีพอสำหรับความต้องการของฉันอีกครั้ง)
CVn

ระวังแฟล็ก -analyzeduration ของ ffmpeg โดยทั่วไปตัวเลขที่รายงานนั้นเป็นค่าประมาณหลังจากถึงจุดหนึ่งเพื่อประหยัด CPU
mlissner

เมื่อใช้บิตเรต MP3 เฉลี่ย ffmpeg จะรายงานระยะเวลาที่ไม่ถูกต้องพร้อมกับคำเตือนEstimating duration from bitrate, this may be inaccurateนี้ ฉันคิดว่าคำตอบนี้ใช้ได้เฉพาะกับConstant Bitrate MP3 เท่านั้น
KrisWebDev

9

ที่น่าสนใจแอพพลิเคชั่น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 (โดยประมาณ)

3

อีกวิธีหนึ่งในการรับระยะเวลาใช้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

2

โซลูชันที่ใช้การffmpegนัดหยุดงานของฉันมีความเปราะบางเล็กน้อยเนื่องจากมีการแยกวิเคราะห์เอาต์พุตที่ไม่ได้รับการออกแบบให้เป็นส่วนต่อประสาน ที่กล่าวว่าพวกเขาอาจจะยังคงทำงานเป็นเวลาหลายปีโดยไม่คำนึงถึง

ffmpegมาพร้อมกับเครื่องมือffprobeในการรับข้อมูลเกี่ยวกับไฟล์เสียง (หลายรูปแบบรวมถึง mp3) และสามารถสร้างเอาต์พุตที่เครื่องอ่านได้ คำสั่งดังต่อไปนี้จะได้รับระยะเวลาเพลง

ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'

2
คุณสามารถทำได้ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Gyan

1

ฉันใช้Mplayerเป็นการส่วนตัวเพื่อดึงข้อมูลส่วนใหญ่เป็นเพราะฉันได้ทำการติดตั้งไปแล้วและไม่สามารถติดตั้งซอฟต์แวร์ใหม่ได้โดยไม่จำเป็น ข้อดีของการทำเช่นนี้คือไม่ จำกัด เฉพาะไฟล์ mp3 และควรทำงานกับไฟล์สื่อใด ๆ ที่ Mplayer สามารถจัดการได้ หนึ่งซับต่อไปนี้จะคืนความยาวของแทร็กในไม่กี่วินาที

mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2


0

ฉันมีปัญหาเดียวกันและพบว่าคำสั่ง mplayer (goldPseudo) ทำงานได้ดี แต่ต่อมาฉันค้นพบว่าถ้าคุณเปิดอัลบั้มใน RhythmBox คุณจะเห็นบรรทัดสถานะให้จำนวนแทร็กเวลาเล่นทั้งหมดและขนาดแผ่นดิสก์


-1

นี่คือความเรียบง่ายของฉันโดยใช้การอ้างอิงด้านบน

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

ขอบคุณคนข้างต้น! ฉันใช้ความคิดและความรู้ของคุณขอบคุณสำหรับการอ่านขอให้มีความสุขมาก ๆ ในวันนี้! ;)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.