เพิ่มความเงียบในตอนท้ายของ MP3


12

คุณรู้วิธีเพิ่มความเงียบในช่วงเวลาที่กำหนดไปยังจุดสิ้นสุดของ MP3 ใน Linux หรือไม่? เช่นใช้ MEncoder, FFmpeg เป็นต้น

ต้องเป็นบรรทัดคำสั่งเนื่องจากจะมีสคริปต์และทำงานบนเซิร์ฟเวอร์ของเรา

ฉันไปรอบ ๆ สิ่งนี้และสิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือการใช้padฟังก์ชั่นในSoXแต่นั่นไม่ได้ผลกับ MP3

ฉันสามารถแปลงเป็น WAV ใช้ SoX แล้วแปลงกลับเป็น MP3 อีกครั้งและคัดลอกข้อมูลเมตา (ลบระยะเวลา) จากต้นฉบับไปเป็น MP3 ใหม่ แต่ก่อนที่ฉันจะเขียนสคริปต์สำหรับสิ่งที่ฉันคิดว่าฉันจะดูว่ามีวิธีการหนึ่งที่ฮิต


2
ฉันคิดว่าคุณสามารถทำสิ่งนี้ได้ด้วยmp3DirectCut (Windows เท่านั้น แต่พวกเขาบอกว่ามันเข้ากันได้กับ Linux ภายใต้ Wine) ซึ่งหลีกเลี่ยงการบีบอัดข้อมูลเสียงอีกครั้ง หากคุณต้องไปที่ MP3 -> WAV -> MP3 คุณจะต้องบีบอัดสตรีมข้อมูล MP3 ที่ถูกบีบอัดใหม่แล้วซึ่งจะสูญเสียคุณภาพไปมากมาย
Breakthrough

ขอบคุณ คุณสามารถรันซอฟต์แวร์ windows ผ่าน Wine จากบรรทัดคำสั่งได้หรือไม่ ฉันต้องการหลีกเลี่ยงการแก้ปัญหาไวน์ถ้าเป็นไปได้เพราะฉันลังเลที่จะติดตั้งไวน์บนเซิร์ฟเวอร์ของเรา
Max Williams

อืมคุณอาจต้องการหลีกเลี่ยงเส้นทางไวน์หากคุณยังไม่มีเส้นทางนี้ Wine นั้นเป็นการดาวน์โหลดที่ค่อนข้างใหญ่เหนือเมกะไบต์หรือสองตัวสำหรับเครื่องมือตัด / รวม MP3 อย่างง่าย ฉันแน่ใจว่ามีวิธีแก้ปัญหาเทียบเท่า Linux พื้นเมือง หากฉันพบเครื่องมือเพิ่มเติมใด ๆ ฉันจะแจ้งให้คุณทราบ
พัฒนา

คำตอบ:


9

คุณสามารถทำได้อย่างง่ายดายด้วยpadอาร์กิวเมนต์ของ SoX และไวยากรณ์ต่อไปนี้:

sox <oldfile> <newfile> pad <silence at beginning of file> <silence at end of file>

ตัวอย่าง:

sox mp3.mp3 mp3withsilence.mp3 pad 0 1

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


ฉันควรสังเกตว่าฉันทดสอบมันตกลงกับไฟล์ MP3 (ที่ติดตั้ง libmad-0.dll และ libmp3lame-0.dll ตามลำดับสำหรับการถอดรหัสและเข้ารหัส MP3s) มากที่สุดที่เป็นไปได้ฉันขอแนะนำให้ทำงานกับรูปแบบ lossless และแปลงเป็น MP3 ที่ท้ายเท่านั้น
Fabien Snauwaert

มันเจ๋งจริงๆ - ขอบคุณ Fabien!
Max Williams

สิ่งนี้ไม่สูญเสียหรือไม่?
Geremia

อัปเดต: ฉันอ่าน manpage ของ sox ที่มันแปลงเป็นรูปแบบภายในแล้วเข้ารหัสอีกครั้ง ...
Geremia

MP3 เป็นรูปแบบที่สูญเสีย การเข้ารหัสและเข้ารหัสอีกครั้งในรูปแบบที่สูญเสียจะทำให้คุณภาพของเสียงลดลงอย่างค่อยเป็นค่อยไป (ไม่ว่าคุณจะได้ยินหรือไม่ก็ตาม) ดังนั้นจึงเป็นการดีที่สุดที่จะทำงานกับรูปแบบที่ไม่มีการสูญเสียและเข้ารหัสเป็นรูปแบบที่สูญหายเพียงครั้งเดียว สำหรับรายการตัวแปลงสัญญาณเสียงที่สูญเสีย: en.wikipedia.org/wiki/Lossy_compression#Audioและสำหรับรายการตัวแปลงสัญญาณเสียง lossless en.wikipedia.org/wiki/Lossless_compression#Audio
Fabien Snauwaert

15

ด้วย ffmpeg คุณสามารถใช้ตัวกรอง aevalsrc เพื่อสร้างความเงียบและจากนั้นในคำสั่งที่สองให้ใช้โปรโตคอล concat เพื่อรวมกันโดยไม่สูญเสีย:

ffmpeg -filter_complex aevalsrc=0 -t 10 10SecSilence.mp3
ffmpeg -i "concat:input.mp3|10SecSilence.mp3" -c copy output.mp3

คุณสามารถควบคุมระยะเวลาของความเงียบโดยเปลี่ยน-t 10เป็นเวลาใดก็ได้ในไม่กี่วินาทีที่คุณต้องการ แน่นอนว่าคุณจะต้องสร้างความเงียบเพียงครั้งเดียวจากนั้นคุณสามารถเก็บไฟล์ไว้รอบ ๆ และใช้เพื่อแยกไฟล์แต่ละไฟล์ที่คุณต้องการ คุณอาจต้องการค้นหาconcat demuxerซึ่งเป็นตัวประมวลผลที่เข้มข้นขึ้นเล็กน้อย แต่คุณอาจพบว่าง่ายกว่าที่จะวางลงในเชลล์สคริปต์

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

ffmpeg -i input.mp3 \
-filter_complex 'aevalsrc=0::d=10[silence];[0:a][silence]concat=n=2:v=0:a=1[out]' \
-map [out] -c:a libmp3lame -q:a 2 output.mp3

ควบคุมความยาวของความเงียบโดยเปลี่ยนd=10เป็นเวลาใดก็ได้ (เป็นวินาที) ที่คุณต้องการ หากคุณใช้วิธีนี้คุณอาจพบว่าคู่มือการเข้ารหัส FFmpeg MP3นี้มีประโยชน์


ขอบคุณ @evilsoup ฉันลองแล้วและได้สิ่งต่อไปนี้ - max-thinkpad-linux: ~ $ ffmpeg -filter_complex aevalsrc = 0 -t 4.61 silence.mp3ffmpeg version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers built on Nov 6 2012 16:51:33 with gcc 4.6.3 *** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead. Unrecognized option 'filter_complex' Failed to set value 'aevalsrc=0' for option 'filter_complex'
Max Williams

@max ก่อนอื่นคุณใช้ avconv จากโครงการ libav พวกมันเป็นส่วนหนึ่งของ FFmpeg ที่ Debian & Ubuntu ใช้แทนโครงการหลักและให้ ffmpeg รุ่นที่พิการ ลองใช้avconvแทน - ไวยากรณ์ควรจะเหมือนกันเพียงแทนที่ด้วยffmpeg avconv
evilsoup

หากวิธีนี้ใช้ไม่ได้ผลให้ลองอัปเกรดเป็น ffmpeg รุ่นที่ใหม่กว่า เนื่องจากคุณบน Ubuntu คุณควรจะสามารถที่จะใช้PPA นี้หรือสำหรับรุ่นล่าสุดมากคุณสามารถรวบรวมได้จากแหล่งที่มา
evilsoup

1
@ MaxWilliams หรือคุณสามารถดาวน์โหลดบิลด์แบบคงที่ซึ่งคุณไม่จำเป็นต้องคอมไพล์ก่อน เพียงดาวน์โหลดแยกใช้
slhck

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