bezstratna konkatenacja plików ogg vorbis


12

Mam kilka plików ogg vorbis, wszystkie zakodowane z dokładnie tymi samymi właściwościami, które chcę połączyć w jeden plik.

Wiem, że format ogg vorbis obsługuje prostą łączenie wielu plików, takich jak:

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

Ale niestety nie wszystkie odtwarzacze są w stanie zrozumieć pliki utworzone w ten sposób, na przykład mój mobilny odtwarzacz audio i unikałbym zakupu nowego. Inne programy, które tego nie rozumieją, to gstreamer. Ta metoda również nie działa, jeśli wszystkie wejściowe pliki ogg mają ten sam identyfikator strumienia.

Dodatkowo, ponieważ chciałbym wyrzucić oryginalne pliki i zachować tylko skonkatenowaną wersję, chciałbym, aby konkatenacja została wykonana bezstratnie, podobnie jak catrozwiązanie.

Chcę również uniknąć łączenia plików w bezstratny format, taki jak flac, ponieważ niepotrzebnie zwiększyłoby to rozmiar pliku. Gdyby to było w porządku, mógłbym zachować oryginalne pliki ogg i zająłbym mniej miejsca.

Wygląda na to, że ffmpeg czasami potrafi to zrobić za pomocą demuxera concat :

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

Jeśli spojrzę na surowy zrzut heksowy moich plików wejściowych, to mogę znaleźć pakiety vorbis dokładnie reprezentowane w pliku wyjściowym. Myślę, że tak naprawdę nie dzieje się ponowne kodowanie.

Ale to nie wydaje się działać na wszystkich plikach wejściowych. Czasami (nie jestem pewien, co to powoduje) ffmpeg ostrzega:

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.

I wtedy usłyszałbym bardzo słabą „przerwę” między dwoma plikami. Dlatego z pewnością nie jest to rozwiązanie globalne.

Ponieważ nie mogłem go znaleźć, próbowałem napisać własne narzędzie w tym pytaniu dotyczącym przepełnienia stosu .

Czy istnieje sposób na połączenie wielu plików ogg vorbis, ale bez ich ponownego kodowania i tylko z jednym strumieniem na wyjście? Które narzędzie jest w stanie wykonać tę pracę?



@JoshRumbut tak i cierpi z powodu słyszalnych luk, w których pliki są łączone w celu uzyskania pewnych danych wejściowych
josch

Możesz spróbować użyć PiTiVi i umieścić klipy sekwencyjnie na osi czasu.
harrymc

1
OP (i ja też) chcą programowego rozwiązania, które nie wymaga interakcji użytkownika po zebraniu wymaganych plików.
Villermen

2
@ RalphRönnquist Sox ponownie koduje dane wejściowe.
josch

Odpowiedzi:


2

ffmpeg -i "concat:ogg1.ogg|ogg2.ogg|ogg3.ogg" -c copy out.oggtworzy w moim systemie skonkatowany plik ogg, tylko trochę mniejszy niż oddzielne pliki razem (prawdopodobnie z powodu udostępnionych metadanych). Brzmi dla mnie tak samo, więc konkatenacja powinna być bezstratna. Nie powoduje to jednak niewielkiej luki między plikami.

ffmpeg -f concat -safe 0 -i ogg1.ogg -i ogg2.ogg -c copy out.ogg ma działać, ale daje ten błąd na moim Homebrew (macOS) ffmpeg od 3.3.2.

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

Źródło: https://trac.ffmpeg.org/wiki/Concatenate


Otrzymuję ten sam błąd
Housemd

0

Możesz rzucić okiem na FFmpeg . Ma wiele narzędzi, których nie do końca rozumiem, ale pamiętam z dokumentacji, że istnieje narzędzie do tego dokładnie. W przeciwnym razie, myślę, że można użyć VLC Media Player „s wiersza poleceń .


1
Czy możesz trochę rozszerzyć swoją odpowiedź? Samo wskazanie produktu i jego dokumentacji tak naprawdę nie wyjaśnia, jak osiągnąć rozwiązanie. Lepiej jest dołączyć tutaj instrukcje dotyczące używania produktu do rozwiązania problemu. Dobre prowadzenie na polecenia oprogramowania tutaj: meta.superuser.com/questions/5329/... . Dzięki.
fixer1234,

Samo używanie ffmpeg -f concat -i inputs.txt -c copy out.oggnie działa. Jestem ciekawy, jak myślisz, że można to rozwiązać za pomocą ffmpeg.
josch
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.