Ses dosyalarını birleştirmek ve ogg çıktısı Linux komutu


10

Birkaç ses dosyasını birleştirmek ve bunları bir ogg (ve / veya mp3) olarak çıkarmak için hangi komut satırı araçlarına ihtiyacım var?

Eğer bitirmek ve ogg çıktısını tamamlamak için tam komut sağlayabilir, bu harika olurdu.

Düzenleme : Giriş dosyaları (benim durumumda, şu anda) wmabiçimindedir, ancak ideal olarak çok çeşitli popüler formatları destekleyecek kadar esnek olmalıdır.

Edit2 : Sadece açıklığa kavuşturmak için, belirli bir dizindeki tüm wma s birleştirmek istemiyorum , ben sadece 2 veya 3 dosyaları bir içine birleştirmek istiyorum.

Önerilen çözümler için teşekkürler, ancak hepsi geçici dosyalar oluşturmayı gerektiriyor gibi görünüyor, mümkünse bundan kaçınmak istiyorum.


1
hangi girdi biçimleri için desteğe ihtiyacınız var?
John T

Prensip olarak, tüm bu komutları birbirleri arasında boru çıkışına ayarlayabilirsiniz. Ancak pratik olarak, çalışmasını sağlamak için bir acı ve başarısız olduğunda hata ayıklamak için bir acı. Geçici dosyalar yapmanın pratik yolları vardır. Tercih mktemp -d /tmp/descriptive_name.XXXXXXettiğim yöntem, bilgilendirici bir adla geçici bir dizin oluşturmak, sonra tüm geçici dosyalarımı orada işlemek, sonra rm -r.
Ryan C. Thompson

sadece açıklığa kavuşturmak gerekirse, bir komut satırında belirterek bir dizindeki tüm wma'lar için çalışan her şey, bunları *.wmalisteleyerek 1.wma 2.wma 3.wma 4.wma(5.wma, 6.wma ve 7.wma'yı bırakarak) gibi daha küçük bir liste için kesinlikle işe yarayacaktır. bunun gibi (kullanmak yerine *.wma).
quack quixote

Yanıtlar:


9

İşte benim önerim: Adlandırılmış bir boru ile bağlı mplayer ve oggenc kullanın .

  • mplayerSesi deşifre etmek için kullanın . Çok çeşitli ses (ve video) formatlarını oynatabilir ve ayrıca birden fazla dosyayı oynatabilir.

  • oggencSesi Ogg Vorbis'e kodlamak için kullanın .

  • Geçici bir dosyaya olan ihtiyacı ortadan kaldırmak için, kodlayıcı ve kod çözücü arasında veri aktarmak için adlandırılmış bir kanal kullanın.

Bunu bir senaryoya koymak:

#!/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"

Açıklaması:

  1. İlk komut satırı parametresinden hedef dosya adını alın.
  2. Yalnızca kaynak dosya adlarını bırakarak ilk komut satırı parametresini kaldırın.
  3. Oggenc'in okuyacağı bir kanal için bir ad oluşturun.
  4. Mplayer'ın yazacağı bir kanal için bir ad oluşturun
  5. Boruları oluşturun.
  6. Writepipe'i sürekli olarak okuma borusuna dökmek için kedi kullanın (bu, mplayer'ın sonlanabileceği sorunlardan kaçınmaya yardımcı olur, ancak oggenc'in bu olduğunda bittiğini düşünmesini önler)
  7. Kaynak dosyalardan gelen sesi mplayer kullanarak çözün. Seçenekler -really-quiet -slave -nolircdevre dışı iletilere vardır ve klavye veya uzaktan okuyamaz hale getirmek için. -vc null -vo nullVideo kodlamasını ve çıkışını devre dışı bırakmak için seçenekler vardır. -aoOpsiyon çıkışına adlandırılmış yazma boruya WAV formatında ses onu yönlendirir.
  8. Önceki komut çalışırken, aynı anda adlandırılmış okuma borusundan oggenc kullanarak Ogg'e kodlayın.
  9. Adlandırılmış boruları çıkarın.

İyileştirilecek şeyler: Komutlardan biri başarısız olursa (kullan set -e) komut dosyasını erken sonlandırma , ancak yine de fifo'yu düzgün bir şekilde temizleme (gerekli sinyalleri yakalama).


Tek "hafif" sorun dosyalar arasında bir tıklama sesi var
hasen

@hasen j: mükemmel istiyorsanız, Audacity veya başka bir wav-editörü kullanın. tıklamanın kaynağını izleyebiliyorsanız, suçluya bir hata raporu gönderebilirsiniz.
quack quixote

15

SoX , hangi kitaplıklara karşı derlendiğine bağlı olarak çok sayıda ses formatını işleyebilir ve dosyaları basit bir komut satırı ile birleştirebilir

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

Bu sadece kaynak ses dosyalarının hepsi aynı sayıda kanala sahipse çalışır, ancak bunu test etmedim.

Bildiğim kadarıyla SoX, .wma dosyaları için sıfır desteğe sahip, bu nedenle en azından ffmpeg gibi bir şeyle bu dosyaları dönüştürmek muhtemelen kaçınılmaz.

ffmpeg -i infile.wma outfile.wav

2
AFAIK sox yalnızca tüm dosyalar aynı kanallara, örnekleme hızına ve bit derinliğine sahipse; aksi takdirde herkes için belirtmeniz gerekir. kodlanmış formatları da çözeceğini fark etmedim, ama sanırım ben buna yetişmedim.
quack quixote

3

Ffmpeg kullanırdım . Wma'yı ogg vorbis'e dönüştürmek için şunu deneyin:

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

veya mp3:

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

mp3 dönüştürmek için topal yüklü gerekir. sudo apt-get install lame libmp3lame0

Cat, o zaman dönüştürmek iyi çalışmıyor gibi görünüyor, ancak web'de böyle bir şey yapabileceğinizi söyleyen çok sayıda referans bulabilirsiniz cat *.wma | ffmpeg -i - -acodec ...- bu benim makinemde çalışmıyor - sadece ilk dosya işlenir. Ffmpeg için bir 'kopya' kodek var, ama fazla bir fark yaratmıyor.

Önce ffmpeg ile dönüştürmeyi yaptıktan sonra cat * .ogg> output.ogg benim için çalıştı.


1
tamam, birleştirme ne olacak?
hasen

bunun için üzgünüm! Eklemelerimi okuyun.
DaveParillo

ffmpeg hakkında çok emin değilim ... bir WMA kod çözücü kadar iyi, ama OGG kodlayıcı hakkında birçok şikayet. en azından -acodec libvorbisffmpeg'in yerleşik kodlayıcısından kaçınmak için kullanın .
quack quixote

3

Ses dosyalarını birleştirmek ve kod dönüştürmek için, takip etmek istediğiniz iş akışı budur:

  1. Giriş ses dosyalarını WAV / PCM verilerine kodlama,
  2. WAV'ı birleştir,
  3. Ses codec'inin çıktısını almak için WAV kodlayın.

Bu adımlarda işlem yapılması, WAV verisi üzerinde birleştirme gerçekleştirir; Yine de kod dönüştürmek istediğiniz için, işlemin herhangi bir yerinde WAV'a kod çözmeniz gerekir; bundan da faydalanabilir.

İşte önerdiğim adımlar. ffmpegKod çözme, soxbirleştirme ve oggenckodlama için kullanacağız . Sen herhangi bir adım için diğer araçları yerine olabilir - mencoderve diğerleri dekoderi ve kodlar Ogg kodlayıcı olarak kullanılabileceğini herhangi aracı olarak cezayı çalışmak - Sana daha iyi bir araç bulmak zor preslenmiş olacak düşünüyorum rağmen soxiçin birleştirme.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (bu ffmpeg -i infile.wma outfile.infile.wma, geçerli dizindeki her WMA dosyasında çalışır )

  2. sox outfile* all.wav
    (not outfile, 1. adımda çıktı dosyalarını verdiğimiz önektir)

  3. oggenc all.wav all.ogg muhtemelen burada bazı kalite ayarları istiyorsunuz, ancak bu iyi kalite varsayılanları verecektir. Sevdiğim sonuçları almadım ffmpeg, ama bunu tercih edebilirsiniz, bu yüzden aşağıda ffmpeg ile bir örnek ekledim.

soxTüm WAV dosyaları aynı formatta olmadığı sürece komutun düzgün çalışmadığını unutmayın - bazıları 22kHz ve bazıları 44.1kHz ise, bunları soxkomut satırı anahtarları aracılığıyla tanımlamanız ve hangi formatı istediğinizi belirtmeniz gerekir. soxBirleştirme adımında olduğu gibi herhangi bir komut satırı aracı bilmiyorum . Sen olabilir 1. adımda ve kullanımında bir ham PCM formatına muhtemelen çıkış cataynı formatta aşama 2 için, ama bu olur sadece işi iseniz ve size gibi kod çözücü ve kodlayıcı hem son derece spesifik olması gerekiyordu neler beklemeniz gerekir.

Ffmpeg ile kodlama: 'net' etrafında birçok yazı ffmpeg'in yerleşik Vorbis kodlayıcısının çok iyi olmadığından şikayet ediyor. Sürümünüz libvorbis desteği ile oluşturulmuşsa -acodec libvorbisbunun yerine kullanın. Örnek komut satırı:

ffmpeg -i all.wav -acodec libvorbis -ac 2 -ab 128k all.ogg

1

.Ogg dosyaları için çalışmaz, ancak mp3wrap birden çok .mp3 dosyasını tek bir dosyada birleştirebilir. Yani komut satırından böyle bir şey yapabilirsiniz

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

Bu, tüm .wma dosyalarınızı .mp3'e dönüştürmek için ffmpeg'i kullanır ve tüm .mp3 dosyalarını tek bir dosyada birleştirir.


1

Mencoder, geçici dosyalar olmadan videoları birleştirebilir ve kodlarını dönüştürebilir ( burada önemsiz örnek ). Aconvert adında bir yerde yüzen, mencoder'ı sadece ses yapmaya yönlendiren bir komut dosyası var (normalde yapmayı reddediyor). Birleştirilen bu iki şey, gereksinimlerinizi karşılayacak gibi görünüyor.

Düzenleme: aconvert.sh buldum. Ne yazık ki, sadece bir ses dosyasını dönüştürmek için tasarlanmıştır. Ama yine de kod, herkesin birden fazla ses dosyasını dönüştüren bir komut satırı oluşturmak için kullanmak istemesi durumunda.

#!/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


0

Cevabımı vereceğimi düşündüm. Bu muhtemelen en zarif yol değil, ama istediğimi yaptı.

Adım 1: OGG'ye dönüştürün ( ücretsiz Debian depolarından kullanılabilir ve kullanır mplayer, I)pacplruby

#! /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

2.Adım: OGG dosyalarını birleştirin

cat *ogg > big-file.ogg

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.