การต่อหลายไฟล์. mp3 เป็นไฟล์. mp3 เดียว


45

ตามที่แนะนำไว้ที่นี่ฉันกำลังใช้catคำสั่งเพื่อต่อเชื่อมไฟล์. mp3 หลายไฟล์เป็นไฟล์. mp3 ไฟล์เดียว

ลองนึกภาพฉันมีไฟล์. mp3 ต่อไปนี้ในโฟลเดอร์ปัจจุบัน:

001001.mp3 001002.mp3 001003.mp3 001004.mp3 001005.mp3

หรือเช่นนี้

096001.mp3 096002.mp3 096003.mp3 096004.mp3

ฉันต้องการเชื่อมไฟล์. mp3 เหล่านี้เข้าด้วยกันตามลำดับจากน้อยไปมากเช่น 001001.mp3+001002.mp3+001003.mp3+etc.

ในการเข้าร่วมไฟล์. mp3 เหล่านี้เป็นไฟล์เดียวฉันกำลังใช้งานคำสั่งต่อไปนี้ในโฟลเดอร์ปัจจุบัน:

cat *.mp3 > final.mp3

ฉันทดสอบไฟล์. mp3 ขั้นสุดท้ายและเป็นสิ่งที่ฉันคาดหวัง แต่ฉันต้องแน่ใจว่าคำสั่งด้านบนเลือกไฟล์ที่มีลำดับจากน้อยไปหามาก

ฉันแน่ใจได้หรือไม่ว่าคำสั่งด้านบนเชื่อมไฟล์ต่าง ๆ ตามลำดับจากน้อยไปมากเสมอ?

ขอบคุณครับ !

คำตอบ:


46

catไม่ใช่เครื่องมือที่เหมาะสมสำหรับงานนี้ รูปแบบ MP3 มีขยะทุกประเภทที่สามารถแฝงตัวอยู่ที่ด้านหน้าและส่วนท้ายของไฟล์และสิ่งนี้จะต้องถูกลอกออก mp3wrapคือสิ่งที่คุณต้องการ มันจะไม่รวมข้อมูลเมตาใด ๆ ในไฟล์และรวมเสียงเข้าด้วยกัน

sudo apt-get install mp3wrap
mp3wrap output.mp3 *.mp3

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

คุณอาจจำเป็นต้องเปลี่ยนชื่อไฟล์ถ้าตัวอย่างเช่นพวกเขาจะมีหมายเลข แต่ไม่เป็นศูนย์เบาะจะเรียงตาม{1-11}.mp3 นี้สามารถแก้ไขได้อย่างง่ายดาย1 10 11 2 3 4 5 6 7 8 9


2
ขวา - cat จะทำให้รูปแบบไฟล์ MP3 ยุ่งเหยิงโดย "สร้างอาร์เรย์" (เหมือนเดิม) ของไฟล์ mp3 ภายในไฟล์ mp3 ไฟล์เดียว แต่ดูเหมือนว่าจะใช้งานได้หากซอฟต์แวร์เครื่องเล่นนั้นฉลาดพอ

นี้ทำงานที่ดีสำหรับฉันเพราะมันจัดการไฟล์ MP3 ที่มีช่องว่างในชื่อไฟล์:find . -maxdepth 1 -iname '*.mp3' -print0 | sort -z | xargs -0 mp3wrap output.mp3
bmaupin

@bmaupin จุดยุติธรรม แต่ฉันไม่แน่ใจว่าทำไมฉันจึงไม่ได้ใช้สัญลักษณ์เสริมของ Bash *.mp3ควรพอเพียง (และทำงานกับช่องว่าง)
Oli

พร้อมใช้งานสำหรับ mac จากผู้จัดการแพ็คเกจชง ! $ brew install mp3wrap.
รูเบนส์

1
ในทุบตี*.mp3มีการประกันเพื่อรักษาลำดับตัวอักษร หากไฟล์ของคุณจะถูกตั้งชื่อ09.mp3, 10.mp3, 11.mp3ที่อาจสิ่งที่คุณต้องการ หากไฟล์ของคุณจะถูกตั้งชื่อ9.mp3, 10.mp3, 11.mp3ที่อาจไม่ใช่สิ่งที่คุณต้องการ `ls *.mp3 | sort -n`แต่คุณสามารถทำได้
Jo Liss

26

mp3wrapดูเหมือนจะเป็นทางออกที่ดีพอ แต่เมื่อฉันเล่นไฟล์ผลลัพธ์การประทับเวลาไม่ถูกต้อง ดูเหมือนว่า mp3wrap จะใช้ดีที่สุดเมื่อคุณเข้าร่วม mp3 เป็นไฟล์ที่คุณรู้ว่าคุณจะต้องแยกภายหลัง

ฉันแค่อยากจะรวม mp3s เข้าด้วยกันอย่างถาวร ฉันลงเอยด้วยการใช้ ffmpeg เพื่อต่อไฟล์:

  1. ก่อนอื่นให้ติดตั้ง ffmpeg

    • Ubuntu 15.04+

      sudo apt install ffmpeg
    • Ubuntu 14.10 ขึ้นไป
      ไปที่http://ffmpeg.org/download.htmlดาวน์โหลดหนึ่งในบิลด์สแตติก untar มันและคัดลอกไปยัง / usr / local / bin

  2. ffmpeg -i "concat:file1.mp3|file2.mp3" -acodec copy output.mp3

ข้อมูลเพิ่มเติม: https://trac.ffmpeg.org/wiki/Concatenate#protocol
https://superuser.com/a/314245


ffmpegหายไป แต่avconvแทนที่มัน: askubuntu.com/questions/432542/…
muru

2
ใช่ฉันใช้ avconv อยู่พักหนึ่งแล้วฉันก็ต้องการฟีเจอร์บางอย่างที่ ffmpeg ใช้และ avconv ไม่ได้ใช้และฉันก็ไม่ได้ใช้มันตั้งแต่นั้น วันนี้รู้สึกเหมือนเสียเวลาตรวจสอบเพื่อดูว่า avconv มีคุณสมบัติที่ฉันต้องการเมื่อฉันรู้อยู่แล้วว่า ffmpeg
bmaupin

โปรดเชิญให้เข้าร่วมนี้การอภิปรายรายงานข้อผิดพลาด
orschiro

ฉันได้ลองแล้ว แต่มันก็ใช้งานไม่ได้ ลองเรียกใช้output.mp3ผ่านmp3valและคุณจะเห็นข้อผิดพลาดทุกประเภทที่จะสร้างปัญหาการเล่นใน Chrome64 + (ดูbugs.chromium.org/p/chromium/issues/detail?id=794782และbugs.chromium.org/p/chromium/ ปัญหา / รายละเอียดหรือไม่ id = 806601 # c10 )
Nino Škopac

ทางออกที่ดีเลิศ แล้วจะทำให้เพลงเป็นปกติด้วยเช่นกัน?
ar2015

8

ตามคำแนะนำก่อนหน้าmp3wrapนี้เป็นทางออกที่ดี อาจใช้งานไม่ได้ตลอดเวลา เท่าที่ฉันรู้mp3wrapสมมติว่าไฟล์อินพุตทั้งหมดมีคุณสมบัติเหมือนกันเช่น VBR vs CBR บิตเรตและอื่น ๆ หากสมมติฐานนี้ไม่เป็นไปตามที่คาดไว้ก็มีแนวโน้มที่จะล้มเหลว ในกรณีนี้ทางออกเดียวที่จะถอดรหัส mp3files ทั้งหมดให้อยู่ในรูปแบบ raw เช่น.wavเชื่อมต่อกับโปรแกรมที่ชอบsoxและเสร็จสิ้นโดยการเข้ารหัสทั้งหมดเป็น mp3


โปรดทราบว่าการเข้ารหัสไฟล์ mp3 อีกครั้ง (หรือที่รู้จักกันว่า "การแปลงรหัส") จะส่งผลให้สูญเสียคุณภาพ ฉันจะไม่แนะนำที่นี่
Martin Tournoij

5

มันเรียงตามตัวอักษรตามตัวอักษรเดียว นั่นหมายความว่า "01" มาก่อน "1" เนื่องจากไม่มีค่าต่ำกว่าหนึ่ง

นี่คือตัวอย่าง ฉันมีไดเรกทอรีที่มีไฟล์ชื่อ 1, 2, 3, 04, 05, และ 06 พวกเขาเป็นไฟล์ข้อความที่มีชื่อไฟล์ของตัวเอง:

test$ cat *
04
05
06
1
2
3

ดังนั้นใช่มันจะ; แต่คุณต้องแน่ใจว่าไฟล์ทั้งหมดของคุณ 'บุ' อย่างถูกต้อง

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

for f in $(ls); do printf "%05s\n" "$f"; done

มันจะออกมาเป็นแบบนี้:

   04
   05
   06
    1
    2
    3

หากไม่มีคุณจะต้อง pad ชื่อไฟล์: Bash script เพื่อ pad ชื่อไฟล์ใน StackOverflow อธิบายวิธีการทำ


แก้ไข โหวตให้คำตอบของ Oli ดีกว่ามาก : P
ฉันจะจากไปแล้วเพราะมันเพิ่มบางอย่าง แต่คุณควรใช้วิธีแก้ปัญหาของเขา

mp3wrap output.mp3 `ls -1 *.mp3 | sort`

โปรดทราบว่าsortจะยังคงจัดเรียงสิ่งต่าง ๆ ตามที่ฉันอธิบายไว้ข้างต้นคุณจะยังคงต้องใส่ชื่อไฟล์หากความยาวไม่เท่ากัน


4

คนส่วนใหญ่กำลังแนะนำmp3wrapแต่มันมีข้อเสีย: ไฟล์ที่สร้างขึ้นไม่ได้รายงานความยาวเต็มของมันในผู้เล่นบางคนแล้วคุณจะไม่สามารถค้นหาผ่านจุดนั้นได้

mp3catทำงานได้เร็วและดีเท่าที่ฉันสามารถบอกได้ สามารถดาวน์โหลดได้ที่http://mulholland.xyz/dev/mp3cat/และใช้ดังนี้:

mp3cat file1.mp3 file2.mp3 file3.mp3

ความเป็นไปได้อีกอย่างก็คือ sox

sudo apt-get install sox libsox-fmt-mp3
sox file1.mp3 file2.mp3 target.mp3

แต่ดูเหมือนว่าช้ามาก (อาจเป็นไปได้ที่จะถอดรหัสและเข้ารหัสเสียงอีกครั้ง?)


3

ฉันพบผู้ให้บริการเสียงออนไลน์ทำงานได้ดีมากและรักษาการประทับเวลาที่ถูกต้อง (ตรงกันข้ามกับ mp3wrap)



0

ฉันชอบความคิดเห็นของ bmaupinแต่ก็สามารถสร้างหมายเลข (เวอร์ชัน) เรียงตามธรรมชาติโดยใช้sort -V:

find . -maxdepth 1 -iname '*.mp3' -print0 | sort -Vz | xargs -0 mp3wrap ../tmp.mp3

และคุณไม่ต้องจัดการกับตัวละครพิเศษเหมือน' " () [] {}ในชื่อไฟล์

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