Perintah Linux untuk menggabungkan file audio dan outputnya ke ogg

10

Alat baris perintah apa yang saya perlukan untuk menggabungkan beberapa file audio dan mengeluarkannya sebagai satu ogg (dan / atau mp3)?

Jika Anda dapat memberikan perintah lengkap untuk menyatukan dan output ke ogg, itu akan luar biasa.

Sunting : File input (dalam kasus saya, saat ini) dalam wmaformat, tetapi idealnya harus cukup fleksibel untuk mendukung berbagai format populer.

Sunting2 : Hanya untuk memperjelas, saya tidak ingin menggabungkan semua wma dalam direktori tertentu, saya hanya ingin menggabungkan 2 atau 3 file menjadi satu.

Terima kasih atas solusi yang diusulkan, tetapi mereka semua tampaknya memerlukan membuat file sementara, jika mungkin sama sekali, saya ingin menghindari itu.

Hasen
sumber
1
format input apa yang perlu Anda dukung?
John T
Pada prinsipnya, Anda dapat mengubah semua perintah ini untuk menyalurkan output antara satu sama lain. Namun secara praktis, itu menyebalkan untuk membuatnya bekerja, dan rasa sakit untuk men-debug ketika gagal. Ada cara praktis untuk melakukan file temp. Metode pilihan saya adalah menggunakan mktemp -d /tmp/descriptive_name.XXXXXXuntuk membuat direktori sementara dengan nama yang informatif, kemudian memproses semua file temp saya di sana, kemudian rm -r direktori temp sesudahnya.
Ryan C. Thompson
hanya untuk memperjelas, apa pun yang bekerja untuk semua wma dalam direktori, dengan menentukan *.wmadalam commandline, pasti akan bekerja untuk daftar yang lebih kecil seperti 1.wma 2.wma 3.wma 4.wma(meninggalkan 5.wma, 6.wma, & 7.wma), hanya dengan mendaftar mereka keluar seperti itu (bukannya menggunakan *.wma).
quack quixote

Jawaban:

9

Inilah saran saya: Gunakan mplayer dan oggenc terhubung dengan pipa bernama.

  • Gunakan mplayeruntuk memecahkan kode audio. Ia dapat memutar ulang beragam format audio (dan video), dan juga dapat memutar banyak file.

  • Gunakan oggencuntuk menyandikan audio ke Ogg Vorbis.

  • Untuk menghilangkan kebutuhan file sementara, gunakan pipa bernama untuk mentransfer data antara encoder dan decoder.

Masukkan itu ke dalam skrip:

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

Dijelaskan:

  1. Ambil nama file tujuan dari parameter baris perintah pertama.
  2. Hapus parameter baris perintah pertama, hanya menyisakan nama file sumber.
  3. Buat nama untuk pipa untuk dibaca oggenc.
  4. Buat nama untuk pipa untuk mplayer untuk menulis
  5. Buat pipa.
  6. Gunakan cat untuk terus-menerus membuang writepipe ke readpipe (ini membantu menghindari masalah di mana mplayer dapat berhenti, tetapi mencegah oggenc dari berpikir itu dilakukan ketika ini terjadi)
  7. Dekode audio dari file sumber menggunakan mplayer. Opsi -really-quiet -slave -nolircada untuk menonaktifkan pesan dan membuatnya tidak membaca keyboard atau remote. Opsi -vc null -vo nullada untuk menonaktifkan encoding dan output video. The -aopilihan mengarahkan ke output audio dalam format WAV ke bernama tulis pipa.
  8. Ketika perintah sebelumnya sedang berjalan, secara bersamaan enkode dari pipa baca bernama ke Ogg menggunakan oggenc.
  9. Hapus pipa bernama.

Hal-hal yang harus ditingkatkan: Menghentikan skrip lebih awal jika salah satu perintah gagal (gunakan set -e), tetapi masih membersihkan fifo dengan baik (menjebak sinyal yang diperlukan).

Jukka Matilainen
sumber
Satu-satunya "sedikit" masalah adalah ada bunyi klik di antara file
hasen
@ telah j: jika Anda ingin sempurna, gunakan Audacity atau wav-editor lainnya. jika Anda dapat melacak sumber klik, Anda dapat mengajukan laporan bug pada pelaku.
quack quixote
15

SoX dapat menangani sejumlah besar format audio, tergantung pada perpustakaan apa yang dikompilasinya, dan dapat menggabungkan file dengan baris perintah sederhana

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

Saya percaya ini hanya berfungsi jika semua file audio sumber memiliki jumlah saluran yang sama, tetapi saya belum mengujinya.

Sejauh yang saya tahu, SoX tidak memiliki dukungan untuk file .wma, jadi mengkonversi setidaknya file-file dengan sesuatu seperti ffmpeg terlebih dahulu mungkin tidak dapat dihindari.

ffmpeg -i infile.wma outfile.wav
goldpseudo
sumber
2
AFAIK sox hanya berfungsi seperti itu jika semua file memiliki saluran, laju sampel, & kedalaman bit yang sama; jika tidak, Anda harus menentukan untuk semua. Saya tidak menyadari itu akan memecahkan kode format yang dikodekan juga, tapi saya kira saya belum mengikuti itu.
quack quixote
3

Saya akan menggunakan ffmpeg . Untuk mengonversi wma ke ogg vorbis coba:

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

atau mp3:

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

Anda harus lumpuh diinstal untuk mengkonversi mp3. sudo apt-get install lame libmp3lame0

Cat, lalu konversi tampaknya tidak berfungsi dengan baik, meskipun Anda dapat menemukan banyak referensi di web yang mengatakan Anda dapat melakukan sesuatu seperti cat *.wma | ffmpeg -i - -acodec ...- ini tidak bekerja pada mesin saya - hanya file pertama yang diproses. Ada 'copy' codec untuk ffmpeg, tetapi tidak membuat banyak perbedaan.

Pertama-tama lakukan konversi dengan ffmpeg, kemudian cat * .ogg> output.ogg bekerja untuk saya.

DaveParillo
sumber
1
ok, bagaimana dengan penggabungan?
hasen
maaf soal itu! Baca tambahan saya.
DaveParillo
tidak begitu yakin tentang ffmpeg ... baik sebagai decoder WMA, tetapi banyak keluhan tentang encoder OGG. setidaknya gunakan -acodec libvorbisuntuk menghindari built-in ffmpeg's encoder.
quack quixote
3

Untuk menggabungkan dan mentranskode file audio, ini adalah alur kerja yang ingin Anda ikuti:

  1. Mendekode input file audio ke data WAV / PCM,
  2. WAV gabungan,
  3. Encode WAV untuk menampilkan file codec audio.

Pemrosesan dalam langkah-langkah ini melakukan penggabungan pada data WAV, yang paling mudah untuk ditangani dan paling tidak lossy. Dan karena Anda tetap ingin transcode, Anda harus mendekode ke WAV di suatu tempat dalam proses; lebih baik memanfaatkannya.

Berikut langkah-langkah yang saya rekomendasikan. Kami akan gunakan ffmpeguntuk decoding, soxuntuk concatenation, dan oggencuntuk encoding. Anda dapat mengganti alat lain untuk langkah apa pun - mencoderdan yang lain berfungsi dengan baik sebagai dekoder, dan alat apa pun yang menyandikan Ogg dapat digunakan sebagai penyandi - meskipun saya pikir Anda akan kesulitan menemukan alat yang lebih baik daripada soxuntuk rangkaian.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (ini berjalan ffmpeg -i infile.wma outfile.infile.wmapada setiap file WMA di direktori saat ini)

  2. sox outfile* all.wav
    (note outfileadalah awalan yang sama dengan yang kita berikan pada file output pada langkah 1)

  3. oggenc all.wav all.ogg Anda mungkin ingin beberapa pengaturan kualitas di sini, tetapi ini akan memberikan standar kualitas yang layak. Saya tidak mendapatkan hasil yang saya sukai ffmpeg, tetapi Anda mungkin lebih suka, jadi saya telah menyertakan contoh dengan ffmpeg di bawah ini.

Perhatikan bahwa soxperintah tidak akan berfungsi dengan baik kecuali semua file WAV memiliki format yang sama - jika ada yang 22kHz dan ada yang 44.1kHz, misalnya, Anda perlu mengidentifikasi mereka soxmelalui sakelar baris perintah, dan tentukan format mana yang Anda inginkan. output in. Saya tidak tahu alat commandline yang mampu soxuntuk langkah penggabungan. Anda mungkin dapat menampilkan ke format PCM mentah di langkah 1 dan gunakan catuntuk langkah 2, tetapi itu hanya akan berfungsi jika mereka berada dalam format yang sama, dan Anda harus sangat spesifik untuk dekoder dan enkoder Anda seperti apa format yang seharusnya mereka harapkan.

Pengkodean dengan ffmpeg: Banyak posting di sekitar 'mengeluh bahwa ffmpeg builtin Vorbis encoder tidak terlalu baik. Jika versi Anda dibuat dengan dukungan libvorbis, gunakan -acodec libvorbissaja. Contoh perintah:

ffmpeg -i all.wav -acodec libvorbis -ac 2 -ab 128k all.ogg
quack quixote
sumber
1

Tidak akan berfungsi untuk file .ogg, tetapi mp3wrap dapat menggabungkan beberapa file .mp3 ke dalam satu file. Jadi dari baris perintah, Anda bisa melakukan sesuatu seperti ini

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

Ini akan menggunakan ffmpeg untuk mengonversi semua file .wma Anda menjadi .mp3, dan kemudian menggabungkan semua file .mp3 menjadi satu file.

goldpseudo
sumber
1

Mencoder dapat menggabungkan dan mentranskode video tanpa file temp ( contoh sepele di sini ). Ada skrip melayang di suatu tempat yang disebut aconvert yang trik mencoder untuk melakukan audio saja (yang biasanya menolak untuk melakukan). Gabungan dua hal ini sepertinya memenuhi kebutuhan Anda.

Sunting: Saya menemukan aconvert.sh. Sayangnya, ini hanya dirancang untuk mengonversi satu file audio. Tapi begini kodenya, kalau-kalau ada yang mau menggunakannya untuk membuat baris perintah yang mengubah banyak file 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
sumber
0

Saya pikir saya akan memasukkan jawaban saya. Ini mungkin bukan cara yang paling elegan, tapi itu melakukan apa yang saya inginkan.

Langkah 1: konversikan ke ogg (menggunakan mplayer, pacpldan ruby, semua tersedia dari repo Debian gratis. 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

Langkah 2: menyatukan file ogg

cat *ogg > big-file.ogg
Inaimathi
sumber
0

cat file list… | ffmpeg -f mp3 -i – -acodec copy outfile.mp3bekerja dengan baik untuk saya dengan MP3: Saya membayangkan itu akan bekerja dengan format lain juga. Kredit diberikan ke Lindylex .

Tomislav Nakic-Alfirevic
sumber