Lame - วิธีเข้ารหัส mp3 320kbps ทั้งหมดอีกครั้งเป็น 192kbps mp3


9

ตามชื่อเรื่อง ฉันมี MP3 จำนวนมากในรูปแบบ 320kbps ที่ฉันต้องแปลงเป็น 192kbps ขณะนี้ฉันกำลังใช้lame --mp3input -b 192ซึ่งสร้างไฟล์ชื่อเดียวกัน แต่มีนามสกุล. mp3 พิเศษ foo.mp3.mp3ดังนั้นผมจึงจบลงด้วย

ฉันต้องสามารถเข้าสู่ไดเรกทอรีสแกนไดเรกทอรีย่อยสำหรับ 320kbps ใด ๆ และแปลงเป็น 192kbps และเขียนทับหากพบ Lame เป็นเครื่องมือที่ดีที่สุดสำหรับสิ่งนี้หรือไม่?

ขอบคุณ

คำตอบ:


12

lameเหมาะอย่างยิ่งกับงานนี้ แต่ฉันจะใช้ffmpegและffprobeสำหรับคำตอบนี้เพราะฉันรู้ว่าพวกเขาชอบด้านหลังมือของฉันและเพราะพวกเขาสามารถพูดได้มากกว่า MP3 เพียงอย่างเดียว ก่อนอื่น:

sudo apt-get install ffmpeg

ไม่มีเครื่องมือที่ฉันรู้ว่าสามารถอ่านไฟล์สื่อแล้วเขียนทับอินพุตได้ทันที: คุณต้องใช้ไฟล์ระดับกลาง สำหรับไฟล์เดียวคุณสามารถทำได้:

ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3
mv temp.mp3 file.mp3

คุณสามารถรวมสิ่งเหล่านี้เป็นบรรทัดเดียว:

ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3

&&มีหมายความว่าmvคำสั่งจะไม่ถูกดำเนินการเว้นแต่ffmpegทางออกที่มีสถานะเป็น 0 (ซึ่งหมายถึงความสำเร็จ)

ในการตรวจสอบว่าไฟล์มีอัตราบิตเท่าใดคุณสามารถใช้ffprobe:

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000'

-show_streamsบอกffprobeให้แสดงข้อมูลเกี่ยวกับสตรีมแต่ละรายการ -select_streamsบอกมันซึ่งคนที่จะเลือกและa:0หมายถึง 'สตรีมเสียงครั้งแรก (ซึ่งเป็นสิ่งสำคัญสำหรับไฟล์ MP3 ในกรณีของปกซึ่งถูกเก็บไว้เป็นสตรีมวิดีโอ) ท่อ ( |) ใช้เวลามาตรฐานการออกและฟีดมันffprobe จะพิมพ์บรรทัดที่ตรงกับรูปแบบที่กำหนด - ในกรณีนี้เส้นที่มีสตริง หากคุณใช้งานกับ MP3 ขนาด 320k kbps คุณจะได้รับสายเช่นนี้:grepgrepbit_rate=320000

bit_rate=32000

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

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' && ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3

หรืออ่านง่ายขึ้นอีกเล็กน้อย:

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' &&
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 &&
mv temp.mp3 file.mp3

ที่จะทำงานบน MP3 ขนาด 320 kbps เท่านั้น ลองใช้กับไฟล์ทดสอบสองสามไฟล์

ขั้นตอนต่อไปคือการทำให้ไฟล์หลายไฟล์ทำงานได้ มีสองวิธีมาตรฐานในการทำเช่นนี้: forห่วงและfindคำสั่ง ต่อไปนี้จะทำงานกับทุก MP3 ในไดเรกทอรี:

for f in *.mp3; do 
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done

สิ่งนี้จะไม่เข้าไปในไดเรกทอรีย่อย ในการทำเช่นนั้นคุณต้องตั้งค่าglobstarตัวเลือกเชลล์:

shopt -s globstar
for f in **/*.mp3; do
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done

ด้วยfind:

find . -name '*.mp3' -exec sh -c 'ffprobe -show_streams -select_streams a:0 "$0" | grep -F "bit_rate=320000" &&
ffmpeg -y -i "$0" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$0"' '{}' \;

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

sudo apt-get install parallel
shopt -s globstar
parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}' ::: **/*.mp3

หรือ:

find . -name '*.mp3' | parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}' 

คำตอบที่งดงาม ฉันเคยปูทางด้วยกันโดยใช้ง่อย แต่ฉันจะให้ที่ผ่านมา จะรายงานกลับ
Moif Murphy

ฉันได้รับข้อผิดพลาดนี้: Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
Moif Murphy

ด้วย avconv ให้แทนที่เป็น:avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}
lepe

2

Lame เป็นหนึ่งในดีที่สุดที่คุณสามารถค้นหาเพื่อทำงานนี้

คุณสามารถใช้คำสั่ง lame -b 192 input.mp3 output.mp3

ฉันไม่ดีกับคำสั่ง piping แต่คุณสามารถใช้exiftoolเพื่อรับอัตราบิตของไฟล์ mp3

exiftool -AudioBitrate File.mp3 

แต่คุณยังคงต้องการวิธีในการไพพ์คำสั่งในการค้นหาไฟล์ mp3, ตรวจสอบบิตเรตและการแปลง ...


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