Comando Linux para concatenar arquivos de áudio e enviá-los para ogg

10

De que ferramentas de linha de comando eu preciso para concatenar vários arquivos de áudio e produzi-los como um ogg (e / ou mp3)?

Se você puder fornecer o comando completo para concatenar e enviar para ogg, isso seria incrível.

Editar : os arquivos de entrada (no meu caso, atualmente) estão em wmaformato, mas, idealmente, deve ser flexível o suficiente para suportar uma ampla variedade de formatos populares.

Edit2 : Apenas para esclarecer, não quero mesclar todos os wma s em um determinado diretório, apenas concatenar 2 ou 3 arquivos em um.

Obrigado pelas soluções propostas, mas todas parecem exigir a criação de arquivos temporários, se possível, eu gostaria de evitar isso.

hasen
fonte
1
para quais formatos de entrada você precisa de suporte?
John T
Em princípio, você pode ajustar todos esses comandos para canalizar a saída entre si. Mas, na prática, é difícil fazê-lo funcionar e é difícil depurar quando falha. Existem maneiras práticas de fazer arquivos temporários. Meu método preferido é usar mktemp -d /tmp/descriptive_name.XXXXXXpara criar um diretório temporário com um nome informativo, processar todos os meus arquivos temporários lá e depois rm -r o diretório temporário.
Ryan C. Thompson
apenas para esclarecer, qualquer coisa que funcione para todas as wma's em um diretório, especificando *.wmaem uma linha de comando, certamente funcionará para uma lista menor como 1.wma 2.wma 3.wma 4.wma(deixando de fora 5.wma, 6.wma & 7.wma), simplesmente listando-as assim (em vez de usar *.wma).
quack quixote

Respostas:

9

Aqui está minha sugestão: Use mplayer e oggenc conectado a um pipe nomeado.

  • Use mplayerpara decodificar o áudio. Ele pode reproduzir uma ampla variedade de formatos de áudio (e vídeo) e também pode reproduzir vários arquivos.

  • Use oggencpara codificar o áudio para Ogg Vorbis.

  • Para eliminar a necessidade de um arquivo temporário, use um canal nomeado para transferir os dados entre o codificador e o decodificador.

Colocando isso em um script:

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

Explicado:

  1. Pegue o nome do arquivo de destino no primeiro parâmetro da linha de comandos.
  2. Remova o primeiro parâmetro da linha de comandos, deixando apenas os nomes dos arquivos de origem.
  3. Crie um nome para um canal para o oggenc ler.
  4. Crie um nome para um canal para o mplayer gravar
  5. Crie os tubos.
  6. Use cat para despejar continuamente o tubo de gravação no tubo de leitura (isso ajuda a evitar problemas nos quais o mplayer pode terminar, mas impede que o oggenc pense que isso é feito quando isso acontece)
  7. Decodifique o áudio dos arquivos de origem usando o mplayer. -really-quiet -slave -nolircExistem opções para desativar as mensagens e impedir que ele leia o teclado ou o controle remoto. -vc null -vo nullExistem opções para desativar a codificação e saída de vídeo. A -aoopção direciona a saída do áudio no formato WAV para o canal de gravação nomeado.
  8. Enquanto o comando anterior estiver em execução, codifique simultaneamente do pipe de leitura nomeado para o Ogg usando oggenc.
  9. Remova os tubos nomeados.

Itens a serem deixados para melhorar: finalizar o script mais cedo se um dos comandos falhar (usar set -e), mas ainda assim limpar adequadamente o fifo (prender os sinais necessários).

Jukka Matilainen
fonte
O único problema "ligeiro" é que há um som de clique entre arquivos
Hasen
@ hasen j: se você quiser perfeito, use o Audacity ou outro editor de wav. se você puder rastrear a origem do clique, poderá registrar um relatório de bug no infrator.
quack quixote
15

O SoX pode lidar com um grande número de formatos de áudio, dependendo de quais bibliotecas são compiladas, e pode concatenar arquivos com uma linha de comando simples

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

Acredito que isso funcione apenas se os arquivos de áudio de origem tiverem o mesmo número de canais, mas não testei isso.

Até onde eu sei, o SoX não oferece suporte a arquivos .wma, portanto, converter pelo menos esses arquivos com algo como ffmpeg primeiro é provavelmente inevitável.

ffmpeg -i infile.wma outfile.wav
goldPseudo
fonte
2
O AFAIK sox só funciona assim se todos os arquivos tiverem os mesmos canais, taxa de amostragem e profundidade de bits; caso contrário, você deve especificar para todos. não sabia que decodificaria os formatos codificados também, mas acho que não o acompanhei.
quack quixote
3

Eu usaria ffmpeg . Para converter wma para ogg vorbis, tente:

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

ou mp3:

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

você precisará de um lame instalado para o mp3 convert. sudo apt-get install lame libmp3lame0

Cat, então converter parece não funcionar bem, embora você possa encontrar muitas referências na web dizendo que pode fazer algo como cat *.wma | ffmpeg -i - -acodec ...- isso não funciona na minha máquina - apenas o primeiro arquivo é processado. Existe um codec de 'cópia' para ffmpeg, mas não faz muita diferença.

Fazendo a conversão com ffmpeg primeiro, então cat * .ogg> output.ogg funcionou para mim.

DaveParillo
fonte
1
ok, e quanto à concatenação?
hasen
me desculpe por isso! Leia minhas adições.
31410 DaveParillo
não tenho tanta certeza sobre ffmpeg ... bom como um decodificador WMA, mas muitas reclamações sobre o codificador OGG. pelo menos use -acodec libvorbispara evitar o codificador interno do ffmpeg.
quack quixote
3

Para concatenar e transcodificar arquivos de áudio, este é o fluxo de trabalho que você deseja seguir:

  1. Decodifique os arquivos de áudio de entrada para dados WAV / PCM,
  2. Concatenar WAV,
  3. Codifique o WAV para emitir o arquivo de codec de áudio.

O processamento nessas etapas realiza a concatenação nos dados WAV, que é o mais fácil de lidar e o menos com perdas. E como você deseja transcodificar de qualquer maneira, precisará decodificar para WAV em algum lugar do processo; pode muito bem tirar proveito disso.

Aqui estão os passos que eu recomendo. Usaremos ffmpegpara decodificação, soxconcatenação e oggenccodificação. Você pode substituir outras ferramentas por qualquer etapa - mencodere outras funcionam bem como decodificador, e qualquer ferramenta que codifique Ogg pode ser usada como codificador - embora eu ache que você será pressionado a encontrar uma ferramenta melhor do que soxa concatenação.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (isso é executado ffmpeg -i infile.wma outfile.infile.wmaem cada arquivo WMA no diretório atual)

  2. sox outfile* all.wav
    (note que outfileé o mesmo prefixo que fornecemos aos arquivos de saída na etapa 1)

  3. oggenc all.wav all.ogg você provavelmente deseja algumas configurações de qualidade aqui, mas isso fornecerá padrões de qualidade decentes. Não obtive resultados de que gostei ffmpeg, mas você pode preferir, por isso incluí um exemplo com o ffmpeg abaixo.

Observe que o soxcomando não funcionará corretamente, a menos que todos os arquivos WAV tenham o mesmo formato - se alguns tiverem 22kHz e 44.1kHz, por exemplo, você precisará identificá-los por soxmeio de opções da linha de comando e especificar qual formato deseja output in. Não conheço nenhuma ferramenta de linha de comando capaz soxde executar a etapa de concatenação. Você poderia enviar para um formato PCM bruto na etapa 1 e usá-la catna etapa 2, mas isso só funcionaria se eles estivessem no mesmo formato e você precisaria ser extremamente específico para o seu decodificador e codificador. formato que eles deveriam esperar.

Codificação com ffmpeg: Muitas postagens na rede reclamam que o codificador Vorbis interno do ffmpeg não é muito bom. Se sua versão for criada com suporte a libvorbis, use-o -acodec libvorbis. Exemplo de linha de comando:

ffmpeg -i all.wav -acodec libvorbis -ac 2 -ab 128k all.ogg
charlatão quixote
fonte
1

Não funciona para arquivos .ogg, mas o mp3wrap pode concatenar vários arquivos .mp3 em um único arquivo. Então, na linha de comando, você poderia fazer algo assim

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

Isso usará o ffmpeg para converter todos os arquivos .wma em .mp3 e mesclar todos os arquivos .mp3 em um único arquivo.

goldPseudo
fonte
1

O Mencoder pode concatenar e transcodificar vídeos sem arquivos temporários ( exemplo trivial aqui ). Há um script flutuando em algum lugar chamado aconvert que engana o mencoder para fazer somente áudio (o que normalmente se recusa a fazer). Essas duas coisas combinadas parecem satisfazer suas necessidades.

Edit: Encontrei aconvert.sh. Infelizmente, ele foi projetado apenas para converter um arquivo de áudio. Mas aqui está o código de qualquer maneira, caso alguém queira usá-lo para criar uma linha de comando que converta vários arquivos de áudio.

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

Pensei em dar minha resposta. Essa provavelmente não é a maneira mais elegante, mas fez o que eu queria.

Etapa 1: converter para ogg (usos mplayer, pacple ruby, todos disponíveis nos repositórios Debian gratuitos. 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

Etapa 2: concatenar arquivos ogg

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

cat file list… | ffmpeg -f mp3 -i – -acodec copy outfile.mp3funcionou muito bem para mim com MP3s: imagino que funcionaria com outros formatos também. Os créditos vão para Lindylex .

Tomislav Nakic-Alfirevic
fonte