Rangkaian file ogg vorbis yang tidak hilang

12

Saya punya beberapa file ogg vorbis, semua dikodekan dengan properti yang sama persis yang ingin saya gabungkan menjadi satu file.

Saya tahu bahwa format ogg vorbis mendukung penggabungan beberapa file seperti:

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

Tetapi sayangnya tidak semua pemain dapat memahami file yang dibuat seperti itu, misalnya pemutar audio ponsel saya dan saya akan menghindari untuk membeli yang baru. Program lain yang tidak memahaminya adalah gstreamer. Metode itu juga tidak berfungsi jika file ogg input kebetulan semua memiliki id aliran yang sama.

Selain itu, karena saya ingin membuang file asli dan hanya menyimpan versi yang disatukan, saya ingin penggabungan dilakukan tanpa kehilangan, seperti catsolusinya.

Saya juga ingin menghindari menyatukan file ke dalam format lossless seperti flac karena ini tidak perlu meledakkan ukuran file. Jika itu akan baik-baik saja, maka saya bisa menyimpan file ogg asli dan akan menggunakan lebih sedikit ruang.

Tampaknya ffmpeg kadang-kadang dapat melakukannya dengan menggunakan concat demuxer :

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

Jika saya melihat hexdump mentah dari file input saya, maka saya dapat menemukan paket vorbis persis diwakili dalam file output. Jadi saya kira benar-benar tidak ada pengkodean ulang yang terjadi.

Tapi ini sepertinya tidak berfungsi pada semua file input. Terkadang (tidak yakin apa yang memicu ini), ffmpeg akan memberikan peringatan:

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.

Dan kemudian saya akan mendengar "celah" yang sangat samar antara dua file. Jadi ini tentu bukan solusi global.

Karena saya tidak dapat menemukannya, saya mencoba menulis alat saya sendiri di pertanyaan stackoverflow ini .

Apakah ada cara untuk menggabungkan beberapa file ogg vorbis tetapi tanpa melakukan encoding ulang dan hanya dengan satu aliran per output? Alat mana yang bisa melakukan pekerjaan itu?

josch
sumber
Sudahkah Anda melihat oggCat? en.flossmanuals.net/ogg-theora/command-line-editing/cat-files
Josh Rumbut
@JoshRumbut ya dan itu menderita mengandung celah yang dapat didengar di mana file bergabung untuk beberapa input
josch
Anda dapat mencoba menggunakan PiTiVi dan menempatkan klip secara berurutan di timeline.
harrymc
1
OP (dan saya juga) menginginkan solusi terprogram yang tidak melibatkan interaksi pengguna setelah mengumpulkan file yang diperlukan.
Villermen
2
@ RalphRönnquist Sox mengkodekan ulang input.
josch

Jawaban:

2

ffmpeg -i "concat:ogg1.ogg|ogg2.ogg|ogg3.ogg" -c copy out.oggmembuat file ogg gabungan pada sistem saya, hanya sedikit lebih kecil dari gabungan file yang terpisah (mungkin karena metadata bersama). Kedengarannya sama bagi saya, jadi penggabungan harus tanpa kerugian. Namun, ini tidak menambah celah kecil di antara file.

ffmpeg -f concat -safe 0 -i ogg1.ogg -i ogg2.ogg -c copy out.ogg seharusnya berfungsi tetapi memberikan kesalahan ini pada ffmpeg Homebrew (macOS) saya pada 3.3.2.

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

Sumber: https://trac.ffmpeg.org/wiki/Concatenate


sumber
Saya mendapatkan kesalahan yang sama
Housemd
0

Anda mungkin ingin melihat FFmpeg . Ini memiliki banyak alat yang saya tidak begitu mengerti, tetapi saya ingat dari dokumentasi bahwa ada alat untuk melakukan hal ini. Jika tidak, saya berpikir bahwa Anda dapat menggunakan VLC Media Player 's Command Line .

NatoBoram
sumber
1
Bisakah Anda sedikit memperluas jawaban? Hanya menunjuk ke suatu produk dan dokumentasinya tidak benar-benar menjelaskan cara menyelesaikan solusi. Lebih baik untuk memasukkan beberapa instruksi di sini tentang cara menggunakan produk untuk menyelesaikan masalah. Panduan bagus untuk merekomendasikan perangkat lunak di sini: meta.superuser.com/questions/5329/… . Terima kasih.
fixer1234
Hanya menggunakan ffmpeg -f concat -i inputs.txt -c copy out.oggtidak berhasil. Saya ingin tahu bagaimana Anda berpikir ini bisa diselesaikan dengan ffmpeg.
josch