Polecenie Linuxa do łączenia plików audio i wysyłania ich do ogg

10

Jakie narzędzia wiersza polecenia są potrzebne, aby połączyć kilka plików audio i wyprowadzić je jako jeden plik ogg (i / lub mp3)?

Jeśli możesz podać kompletne polecenie konkatenacji i wyjścia do ogg, byłoby to niesamowite.

Edycja : Pliki wejściowe (w moim przypadku obecnie) są w wmaformacie, ale idealnie powinny być wystarczająco elastyczne, aby obsługiwać szeroką gamę popularnych formatów.

Edycja2 : Aby wyjaśnić, nie chcę scalać wszystkich wma s w określonym katalogu, chcę tylko połączyć 2 lub 3 pliki w jeden.

Dzięki za proponowane rozwiązania, ale wszystkie wydają się wymagać utworzenia plików tymczasowych, jeśli to w ogóle możliwe, chciałbym tego uniknąć.

hasen
źródło
1
dla jakich formatów wejściowych potrzebujesz wsparcia?
John T
Zasadniczo możesz dostosować wszystkie te polecenia, aby przesyłać dane wyjściowe między sobą. Ale praktycznie jest to bólem sprawić, aby działało, i bólem debugować, gdy zawiedzie. Istnieją praktyczne sposoby wykonywania plików tymczasowych. Moją preferowaną metodą jest mktemp -d /tmp/descriptive_name.XXXXXXutworzenie katalogu tymczasowego z informacyjną nazwą, następnie przetworzenie tam wszystkich plików tymczasowych, a następnie rm -r katalog tymczasowy.
Ryan C. Thompson
dla wyjaśnienia, wszystko, co działa dla wszystkich plików wma w katalogu, poprzez podanie *.wmaw 1.wma 2.wma 3.wma 4.wmawierszu poleceń, z pewnością będzie działać na mniejszej liście, takiej jak (pomijając 5.wma, 6.wma i 7.wma), po prostu przez ich wypisanie w ten sposób (zamiast używać *.wma).
quack quixote

Odpowiedzi:

9

Oto moja sugestia: użyj mplayer i oggenc połączonych z nazwaną potokiem.

  • Służy mplayerdo dekodowania dźwięku. Może odtwarzać wiele różnych formatów audio (i wideo), a także może odtwarzać wiele plików.

  • Służy oggencdo kodowania dźwięku w Ogg Vorbis.

  • Aby wyeliminować potrzebę pliku tymczasowego, użyj nazwanego potoku do przesłania danych między koderem a dekoderem.

Umieszczenie tego w skrypcie:

#!/bin/sh
# Usage: ./combine2ogg destination.ogg source1.wma source2.wma ...
# Requires: mplayer, oggenc
destination="$1"
shift
readpipe="$destination.tmpr"
writepipe="$destination.tmpw"
mkfifo "$readpipe"
mkfifo "$writepipe"
cat "$writepipe" > "$readpipe" &
mplayer -really-quiet -slave -nolirc -vc null -vo null -ao "pcm:fast:file=$writepipe" "$@" &
oggenc --quiet -o "$destination" "$readpipe"
rm -f "$readpipe"
rm -f "$writepipe"

Wyjaśnione:

  1. Weź nazwę pliku docelowego z pierwszego parametru wiersza poleceń.
  2. Usuń pierwszy parametr wiersza poleceń, pozostawiając tylko nazwy plików źródłowych.
  3. Utwórz nazwę dla potoku, z którego oggenc będzie czytać.
  4. Utwórz nazwę dla potoku, do którego mplayer będzie pisać
  5. Utwórz rury.
  6. Użyj cat, aby w sposób ciągły zrzucać rurkę zapisującą na rurkę odczytową (pomaga to uniknąć problemów, w których mplayer może się zakończyć, ale uniemożliwia oggencowi myślenie, że to zrobione, gdy to się stanie)
  7. Dekoduj dźwięk z plików źródłowych za pomocą mplayera. Dostępne -really-quiet -slave -nolircsą opcje, aby wyłączyć wiadomości i uniemożliwić odczytanie klawiatury lub pilota. Dostępne -vc null -vo nullsą opcje, aby wyłączyć kodowanie i wyjście wideo. -aoOpcja kieruje je do wyjścia audio w formacie WAV do nazwanego potoku zapisu.
  8. Gdy poprzednie polecenie jest uruchomione, jednocześnie koduj z nazwanego potoku odczytu do Ogg za pomocą oggenc.
  9. Usuń nazwane rury.

Przejdź do lewej, aby poprawić: Wcześniejsze zakończenie skryptu, jeśli jedno z poleceń nie powiedzie się (użyj set -e), ale nadal poprawnie wyczyścisz fifo (przechwytuje niezbędne sygnały).

Jukka Matilainen
źródło
Jedynym „niewielkim” problemem jest dźwięk kliknięcia między plikami
hasen
@hasen j: jeśli chcesz perfekcyjnie, użyj Audacity lub innego edytora wav. jeśli możesz wyśledzić źródło kliknięcia, możesz zgłosić raport o błędzie sprawcy.
quack quixote
15

SoX może obsługiwać wiele formatów audio, w zależności od bibliotek, z którymi jest skompilowany, i może łączyć pliki za pomocą prostego wiersza poleceń

sox file1.wav file2.mp3 file3.flac outfile.ogg

Wierzę, że to działa tylko wtedy, gdy wszystkie źródłowe pliki audio mają tę samą liczbę kanałów, ale nie przetestowałem tego.

O ile mi wiadomo, SoX nie ma obsługi plików .wma, więc konwersja przynajmniej tych plików za pomocą czegoś takiego jak ffmpeg jest prawdopodobnie nieunikniona.

ffmpeg -i infile.wma outfile.wav
goldPseudo
źródło
2
AFAIK sox działa tak tylko wtedy, gdy wszystkie pliki mają te same kanały, częstotliwość próbkowania i głębokość bitów; w przeciwnym razie musisz określić dla wszystkich. nie zdawałem sobie sprawy, że to też dekoduje formaty zakodowane, ale chyba nie nadążałem.
quack quixote
3

Chciałbym użyć ffmpeg . Aby przekonwertować wma na ogg vorbis, spróbuj:

ffmpeg -i sample.wma -acodec vorbis -aq 100 sample.ogg

lub mp3:

ffmpeg -i input.wma -acodec libmp3lame output.mp3

będziesz musiał zainstalować Lame do konwersji mp3. sudo apt-get install lame libmp3lame0

Cat, a następnie konwersja nie działa dobrze, chociaż można znaleźć wiele odnośników w Internecie, które mówią, że możesz zrobić coś takiego cat *.wma | ffmpeg -i - -acodec ...- to nie działa na moim komputerze - przetwarzany jest tylko pierwszy plik. Istnieje kodek „kopiuj” dla ffmpeg, ale nie robi to dużej różnicy.

Najpierw konwersja za pomocą ffmpeg, a potem cat * .ogg> output.ogg.

DaveParillo
źródło
1
ok, a co z konkatenacją?
hasen
przepraszam za to! Przeczytaj moje dodatki.
DaveParillo,
nie jestem pewien co do ffmpeg ... w porządku jako dekodera WMA, ale wiele skarg na koder OGG. przynajmniej użyj, -acodec libvorbisaby uniknąć wbudowanego kodera ffmpeg.
quack quixote
3

Aby połączyć i transkodować pliki audio, należy wykonać następujące czynności:

  1. Dekoduj wejściowe pliki audio na dane WAV / PCM,
  2. Concatenate WAV,
  3. Zakoduj WAV, aby wyprowadzić plik kodeka audio.

Przetwarzanie w tych krokach wykonuje konkatenację danych WAV, która jest najłatwiejsza w obsłudze i najmniej stratna. A ponieważ i tak chcesz transkodować, będziesz musiał zdekodować do WAV gdzieś w tym procesie; równie dobrze może z tego skorzystać.

Oto kroki, które polecam. Użyjemy ffmpegdo dekodowania, soxkonkatenacji i oggenckodowania. Możesz zastąpić inne narzędzia dowolnym krokiem - mencodera inne działają dobrze jako dekoder, a każde narzędzie, które koduje Ogg, może być użyte jako koder - chociaż myślę, że ciężko będzie ci znaleźć lepsze narzędzie niż soxdla powiązanie.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (działa ffmpeg -i infile.wma outfile.infile.wmana każdym pliku WMA w bieżącym katalogu)

  2. sox outfile* all.wav
    (uwaga outfilejest tym samym prefiksem, który podaliśmy w plikach wyjściowych w kroku 1)

  3. oggenc all.wav all.ogg prawdopodobnie chcesz tutaj jakieś ustawienia jakości, ale zapewni to przyzwoitą jakość domyślną. Nie uzyskałem wyników, które mi się podobają ffmpeg, ale możesz go preferować, dlatego poniżej podałem przykład z ffmpeg.

Pamiętaj, że soxpolecenie nie będzie działać poprawnie, chyba że wszystkie pliki WAV mają ten sam format - jeśli na przykład niektóre mają 22 kHz, a inne 44,1 kHz, musisz je zidentyfikować soxza pomocą przełączników wiersza polecenia i określić, który format ma mieć dane wyjściowe. Nie znam żadnych narzędzi wiersza poleceń tak zdolnych jak soxna etapie konkatenacji. Państwo mogłoby ewentualnie wyjście do surowego formatu PCM w kroku 1 i wykorzystania catdo kroku 2, ale to tylko pracę, jeśli są w tym samym formacie, i że trzeba być bardzo specyficzne zarówno dekoder i enkoder, co format, którego powinni się spodziewać.

Kodowanie za pomocą ffmpeg: Wiele postów w sieci narzeka, że ​​wbudowany koder Vorbis ffmpeg nie jest zbyt dobry. Jeśli twoja wersja jest zbudowana z obsługą libvorbis, użyj -acodec libvorbiszamiast tego. Przykładowy wiersz poleceń:

ffmpeg -i all.wav -acodec libvorbis -ac 2 -ab 128k all.ogg
quack quixote
źródło
1

Nie będzie działać dla plików .ogg, ale mp3wrap może łączyć wiele plików .mp3 w jeden plik. Więc z linii poleceń możesz zrobić coś takiego

for FILE in *.wma; do ffmpeg -i "$FILE" "`basename "$FILE" .wma`.mp3"; done
mp3wrap bigmp3_MP3WRAP.mp3 *.mp3

Spowoduje to użycie ffmpeg do konwersji wszystkich plików .wma w .mp3, a następnie scalenia wszystkich plików .mp3 w jeden plik.

goldPseudo
źródło
1

Mencoder może łączyć i transkodować wideo bez plików tymczasowych ( prosty przykład tutaj ). Gdzieś nazywa się aconvert, skłaniający mencodera do robienia tylko audio (czego zwykle odmawia). Te dwie rzeczy razem wydają się spełniać twoje wymagania.

Edycja: Znalazłem aconvert.sh. Niestety jest przeznaczony tylko do konwersji jednego pliku audio. Ale i tak oto kod, na wypadek, gdyby ktoś chciał go użyć do stworzenia linii poleceń, która konwertuje wiele plików audio.

#!/bin/sh

# Author: Jonas Jermann
# Description: A hack to allow mencoder to encode from an audio only file

if [ "$1" = "" ]; then
    echo "Usage: $0 <\"input file\"> <\"output file\"> <\"options\">"
    exit 0
fi

options=${3:-"-oac mp3lame"}

mencoder -demuxer rawvideo -rawvideo w=1:h=1 -ovc copy -of rawaudio -endpos `mplayer -identify $1 -frames 0 2>&1 | grep ID_LENGTH | cut -d "=" -f 2` -audiofile $1 -o $2 $options $1
Ryan C. Thompson
źródło
0

Myślałem, że wrzucę swoją odpowiedź. To chyba nie jest najbardziej elegancki sposób, ale spełniło moje oczekiwania.

Etap 1: przeliczyć ogg (zastosowań mplayer, pacpla rubywszystkie dostępne są od wolnych repo Debiana I).

#! /usr/bin/ruby

ARGV.each do |target|
  file_ext = target.scan(/\.\w*$/)[0]
  name = target.sub(file_ext, "")

  `mplayer -novideo -ao pcm:file="tmp.wav" "#{target}"`
  `pacpl -t ogg --outfile "#{name}" tmp.wav`
  `rm tmp.wav`
end

Krok 2: Połącz pliki OGG

cat *ogg > big-file.ogg
Inaimathi
źródło
0

cat file list… | ffmpeg -f mp3 -i – -acodec copy outfile.mp3ładnie działało dla mnie z plikami MP3: wyobrażam sobie, że działałoby to również z innymi formatami. Kredyty trafiają do Lindylex .

Tomislav Nakic-Alfirevic
źródło