เชื่อมต่อไฟล์ WAV หลายไฟล์โดยใช้คำสั่งเดียวโดยไม่มีไฟล์เพิ่มเติม


32

ฉันต้องการเชื่อมต่อไฟล์ WAV หลายไฟล์เป็นไฟล์ WAV เดียวโดยใช้ FFMPEG

ฉันใช้คำสั่งต่อไปนี้และสร้างไฟล์ที่ต้องการ

คำสั่ง:

ffmpeg -f concat -i mylist.txt -c copy output.wav

ไฟล์:

#mylist.txt
file '1.wav'
file '2.wav'
file '3.wav'
file '4.wav'

แต่อย่างที่คุณเห็นปัญหาคือฉันต้องสร้างไฟล์ข้อความเพื่อระบุรายการของไฟล์ WAV ที่จะต่อกัน

ฉันสามารถทำงานเหล่านี้ได้ทั้งหมด แต่ฉันต้องการคำสั่งเดียวที่ดูเหมือน

ffmpeg -i 1.wav -i 2.wav -i 3.wav -i 4.wav output.wav 

หรือ

ffmpeg -i "concat:1.wav|2.wav|3.wav|4.wav" -c copy output.wav

ฉันลองคำสั่งง่ายๆสองคำนี้ แต่พวกเขากลับมาเพียงแค่เสียงของ1.wav โปรดช่วยฉันเขียนคำสั่งเดียว (หรือแก้ไขคำสั่ง 2 ข้อด้านบน) ที่ได้ผลลัพธ์ตามที่ต้องการ

โปรดอย่าแนะนำ Media Encoders / Editors อื่น ๆ ฉันต้องการใช้ FFMPEG เท่านั้นเนื่องจากติดตั้งและใช้งานในที่อื่นแล้ว

คำตอบ:


34

คุณอาจจะลองใช้concat กรอง ; มันต้องมีการเข้ารหัสซ้ำอีกครั้งและจะใช้ทรัพยากรของระบบมากขึ้น (จำนวนเล็กน้อยในคอมพิวเตอร์สมัยใหม่ใด ๆ ในกรณีนี้) แต่ PCM -> เสียง PCM ควรสูญเสียทางคณิตศาสตร์ ในกรณีของคุณคุณจะใช้สิ่งที่ชอบ:

ffmpeg -i input1.wav -i input2.wav -i input3.wav -i input4.wav \
-filter_complex '[0:0][1:0][2:0][3:0]concat=n=4:v=0:a=1[out]' \
-map '[out]' output.wav

n=5หากคุณมีแฟ้มใส่ห้าใช้


4
หมายเหตุ: อย่าปรับแต่ง[0:0][1:0][2:0][3:0]ให้ตรงกับจำนวนไฟล์ ใช้ตรงตามที่บอกไว้ n=4สิ่งเดียวที่คุณควรเปลี่ยนเป็นไฟล์ข้อมูลและ
Keavon

8
@ Keavon: คุณแน่ใจเหรอ? นี่คือ ffmpeg (รุ่น N-49352-gc46943e x64) บ่นToo many inputs specified for the "concat" filter.เมื่อฉันพยายามประมวลผลเพียง 2 อินพุตด้วยรหัสต้นฉบับ มันทำงานได้ แต่เมื่อฉันลบ[2:0][3:0]... ซึ่งทำให้ความรู้สึกที่ฉันตั้งแต่ในกรณีนี้จะไม่มีสิ่งต่างๆเช่นลำธาร2:0และ3:0...
Bigue Nique

ฉันเห็นด้วยกับ @BigueNique ฉันก็วิ่งเข้าไปในข้อผิดพลาดเดียวกันและแม้ว่ามันให้ความรู้สึกเล็ก ๆ น้อย ๆ nโง่เขียนโค้ดบางส่วนในการสร้างลำดับที่เหมาะสมที่กำหนด
Ryan DuVal

19

ฉันคิดว่าตัวเลือกที่ดีที่สุดคือใช้ sox ไม่ใช่ ffmpeg:

$ sox short1.wav short2.wav short3.wav long.wav

วิธีแก้ปัญหามาจากฉันจะผนวกไฟล์. wav เข้าด้วยกันอย่างไรในขณะที่ยังคงสั่งซื้อตัวเลข


1
นี้อาจทำงาน.wavแต่ดูเหมือนจะไม่สนับสนุนsox .mp3
Aaron Franke

1
คำถามเกี่ยวกับ.wav
Héctor M. Monacci

1
ฉันรู้ว่าฉันแค่เพิ่มบันทึกสำหรับทุกคนที่พยายามใช้วิธีนี้กับไฟล์ที่ไม่ใช่ wav
Aaron Franke

คำถามระบุไว้อย่างชัดเจนว่าจำเป็นต้องมีวิธีการแก้ปัญหาโดยใช้ ffmpeg เท่านั้น!
มนู

sox สามารถรองรับไฟล์. mp3 ได้ด้วย
Benjamin

9

FFmpeg วิกิพีเดียระบุว่าใช้concatโปรโตคอลเป็นไปไม่ได้กับทุกประเภทไฟล์ มันทำงานได้ดีกับคอนเทนเนอร์ MPEG และบิตสตรีมส่วนใหญ่ แต่เห็นได้ชัดว่าไม่ใช่ไฟล์ WAV ที่มีเสียง PCM

คุณไม่จำเป็นต้องสร้างไฟล์ชั่วคราวและใช้ไฟล์นั้น ด้วย Bash (หรือเชลล์อื่น ๆ ที่สนับสนุนการทดแทนกระบวนการ ) คุณสามารถทำทุกอย่างในคำสั่งเดียว:

ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav

การทดแทนกระบวนการ<( )สร้างไฟล์ - หรือเพื่อให้แม่นยำตัวอธิบายไฟล์ - ได้ทันทีซึ่งffmpegสามารถอ่านได้ ไฟล์นี้จะมีเส้นทางไปยังทุก.wavไฟล์ในไดเรกทอรีปัจจุบัน เราต้องนำหน้าด้วย$(pwd)เพื่อให้ได้เส้นทางที่ถูกต้องซึ่งสัมพันธ์กับไดเรกทอรีปัจจุบันของคุณและไม่สัมพันธ์กับ file descriptor

แน่นอนคำสั่งภายในการทดแทนสามารถเปลี่ยนเป็นอย่างอื่น


2
ถ้าคุณได้รับUnsafe file nameข้อผิดพลาดที่คุณจะต้องตัวเลือกก่อน-safe 0 -iอ้าง stackoverflow.com/q/38996925/297679
Nobu

3

อีกทางเลือกหนึ่งคือการใช้concat

ffmpeg -i "concat: file1.mp3 | file2.mp3 | file3.mp3" -acodec คัดลอกออก. mp3


1
ยินดีต้อนรับสู่ superuser: แม้ว่าจะเป็นไปได้หรืออาจจะไม่ตอบคำถาม (ได้รับคำตอบแล้ว) มันจะเป็นคำตอบที่ดีกว่าถ้าคุณสามารถให้คำอธิบายได้ว่าทำไมโซลูชันของคุณถึงมีรายละเอียดและทำตามคำแนะนำได้ง่าย หากคุณรู้สึกว่าคำตอบของคุณถูกต้องให้ทำสิ่งเหล่านี้และแก้ไขใหม่ โปรดใช้เวลาสองสามนาทีและอ่าน: - superuser.com/help. คำตอบ: superuser.com/help/how-to-answerยินดีต้อนรับสู่ superuser อีกครั้ง
ขอบคุณมาก

ฉันทดสอบและดูเหมือนว่ามันจะไม่ทำงาน
Nick Long

1

ในสคริปต์ Cmd.EXE .BAT ของ Win8:

Rem Get number of source files
For /F %%A In ('Dir *.3gp /B /A-D ^| Find /C /V ""') Do      Set FilCnt=%%A

Rem Build list of source filenames
Set Lst=
For    %%A In (     *.3gp                          ) Do Call Set Lst=%%Lst%% -i %%A

Rem Concat and Convert sources to target
FFMPeg.EXE %Lst% -filter_complex concat=n=%FilCnt%:v=0:a=1 -vn Output.OGG

ด้วยวิธีนี้คุณไม่ต้องกังวลกับชื่อไฟล์ต้นฉบับหรือพารามิเตอร์ concat-count


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