การต่อข้อมูลแบบไม่สูญเสียของไฟล์ ogg vorbis


12

ฉันมีไฟล์ ogg vorbis สองไฟล์ทั้งหมดถูกเข้ารหัสด้วยคุณสมบัติเดียวกันที่ฉันต้องการต่อกันเป็นไฟล์เดียว

ฉันรู้ว่ารูปแบบ ogg vorbis รองรับการต่อข้อมูลไฟล์หลายไฟล์เช่น:

$ cat file1.ogg file2.ogg > output.ogg

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

นอกจากนี้เนื่องจากฉันต้องการทิ้งไฟล์ต้นฉบับและเก็บรุ่นที่ต่อกันเท่านั้นฉันจึงต้องการให้การเรียงต่อกันนั้นไม่สูญเสียเช่นเดียวกับcatวิธีแก้ปัญหา

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

ดูเหมือนว่า ffmpeg บางครั้งสามารถทำได้โดยใช้concat demuxer :

$ cat inputs.txt
file 'in1.ogg'
file 'in2.ogg'
$ ffmpeg -f concat -i inputs.txt -c copy out.ogg

ถ้าฉันดูเลขฐานสิบหกแบบดิบของไฟล์อินพุตของฉันดังนั้นฉันสามารถค้นหาแพ็กเก็ต vorbis ที่แสดงในไฟล์เอาต์พุตได้อย่างถูกต้อง ดังนั้นฉันเดาจริงๆไม่มีการเข้ารหัสเกิดขึ้นอีก

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

Non-monotonous DTS in output stream 0:0; previous: 5011328, current: 5011200; changing to 5011329. This may result in incorrect timestamps in the output file.

แล้วฉันจะได้ยิน "ช่องว่าง" จาง ๆ ระหว่างไฟล์สองไฟล์ ดังนั้นนี่ไม่ใช่ทางออกระดับโลกอย่างแน่นอน

เนื่องจากฉันหาไม่เจอฉันจึงพยายามเขียนเครื่องมือของตัวเองในคำถาม stackoverflowนี้

มีวิธีการเชื่อมไฟล์ ogg vorbis หลายไฟล์ แต่ไม่มีการเข้ารหัสใหม่และมีเพียงสตรีมเดียวต่อเอาต์พุตหรือไม่ เครื่องมือใดที่สามารถทำงานได้?



@JoshRumbut ใช่และมันก็ทนทุกข์ทรมานจากการมีช่องว่างที่สามารถได้ยินได้ที่ไฟล์จะเข้าร่วมสำหรับการป้อนข้อมูลบางอย่าง
josch

คุณสามารถลองใช้PiTiViและวางคลิปตามลำดับบนไทม์ไลน์
harrymc

1
OP (และฉันด้วย) ต้องการโซลูชันแบบเป็นโปรแกรมที่ไม่เกี่ยวข้องกับการโต้ตอบของผู้ใช้หลังจากรวบรวมไฟล์ที่ต้องการ
Villermen

2
@ RalphRönnquist Sox เข้ารหัสข้อมูลอีกครั้ง
josch

คำตอบ:


2

ffmpeg -i "concat:ogg1.ogg|ogg2.ogg|ogg3.ogg" -c copy out.oggสร้างไฟล์ ogg ที่ต่อกันบนระบบของฉันเล็กกว่าไฟล์ที่แยกกันเล็กน้อยซึ่งรวมกัน (อาจเป็นเพราะ metadata ที่แชร์) มันฟังดูเหมือนกันสำหรับฉันดังนั้นการต่อข้อมูลควรจะไม่มีความสูญเสีย อย่างไรก็ตามสิ่งนี้จะไม่เพิ่มช่องว่างเล็ก ๆ ระหว่างไฟล์

ffmpeg -f concat -safe 0 -i ogg1.ogg -i ogg2.ogg -c copy out.ogg ควรจะใช้งานได้ แต่ให้ข้อผิดพลาดนี้กับ Homebrew (macOS) ffmpeg ของฉันตั้งแต่ 3.3.2

[concat @ 0x7f91e8800400] Line 1: unknown keyword 'OggS'
ogg1.ogg: Invalid data found when processing input

ที่มา: https://trac.ffmpeg.org/wiki/Concatenate


ฉันได้รับข้อผิดพลาดเดียวกัน
Housemd

0

คุณอาจต้องการที่จะดูที่FFmpeg มันมีเครื่องมือมากมายที่ฉันไม่ค่อยเข้าใจ แต่ฉันจำได้จากเอกสารที่มีเครื่องมือในการทำสิ่งนี้ มิฉะนั้นผมคิดว่าคุณสามารถใช้VLC Media Player 's บรรทัดคำสั่ง


1
คุณช่วยขยายคำตอบให้หน่อยได้ไหม? เพียงชี้ไปที่ผลิตภัณฑ์และเอกสารประกอบของมันไม่ได้อธิบายวิธีการแก้ปัญหาให้สำเร็จ มันจะเป็นการดีกว่าถ้าคุณมีคำแนะนำในการใช้ผลิตภัณฑ์เพื่อแก้ไขปัญหา คำแนะนำที่ดีในการแนะนำซอฟต์แวร์ที่นี่: meta.superuser.com/questions/5329/... ขอบคุณ
fixer1234

แค่ใช้ffmpeg -f concat -i inputs.txt -c copy out.oggไม่ได้ผล ฉันอยากรู้ว่าคุณคิดว่าวิธีนี้สามารถแก้ไขได้ด้วย ffmpeg
josch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.