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

10

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

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

Editar : Arquivos de entrada (no meu caso, atualmente) estão no formato wma , mas idealmente ele deve ser flexível o suficiente para suportar uma ampla gama de formatos populares.

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

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

    
por hasen 02.11.2009 / 02:14

8 respostas

9

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

  • Use mplayer para decodificar o áudio. Pode reproduzir uma grande variedade de formatos de áudio (e vídeo), e também pode reproduzir vários arquivos.

  • Use oggenc para codificar o áudio para Ogg Vorbis.

  • Para eliminar a necessidade de um arquivo temporário, use um chamado tubo para transferir os dados entre o codificador e 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 do primeiro parâmetro da linha de comando.
  2. Remova o primeiro parâmetro da linha de comando, 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 escrever para
  5. Crie os canais.
  6. Use o cat para descarregar continuamente o writepipe para o readpipe (isso ajuda a evitar problemas em que 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. Opções -really-quiet -slave -nolirc estão lá para desativar mensagens e para não ler o teclado ou o controle remoto. As opções -vc null -vo null estão lá para desativar a codificação e a saída de vídeo. A opção -ao direciona a saída do áudio em formato WAV para o pipe de gravação nomeado.
  8. Enquanto o comando anterior está em execução, codifique simultaneamente o canal de leitura nomeado em Ogg usando oggenc.
  9. Remover os pipes nomeados.

Coisas para a esquerda para melhorar: Terminar o script mais cedo se um dos comandos falhar (usar set -e ), mas ainda assim limpar corretamente o fifo (capturar os sinais necessários).

    
por 02.11.2009 / 13:23
15
O

SoX pode manipular um grande número de formatos de áudio, dependendo de com quais bibliotecas ele é compilado, e pode concatenar arquivos com um comando simples linha

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

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

Até onde eu sei, o SoX tem zero de suporte para arquivos .wma, então converter pelo menos esses arquivos com algo como ffmpeg primeiro é provavelmente inevitável.

ffmpeg -i infile.wma outfile.wav
    
por 02.11.2009 / 07:41
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á do lame instalado para o mp3 convert. sudo apt-get install lame libmp3lame0

Gato, então converter não parece funcionar bem, embora você possa encontrar muitas referências na web dizendo que você 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 'copy' para o ffmpeg, mas não faz muita diferença.

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

    
por 02.11.2009 / 03:25
3

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

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

O processamento nessas etapas executa a concatenação nos dados WAV, que é o mais fácil de lidar e com menos perdas. E como você deseja transcodificar de qualquer forma, terá que decodificar para WAV em algum lugar no processo; também pode tirar proveito disso.

Aqui estão os passos que recomendo. Usaremos ffmpeg para decodificação, sox para concatenação e oggenc para codificação. Você pode substituir outras ferramentas por qualquer etapa - mencoder e outras funcionam bem como um decodificador, e qualquer ferramenta que codifique o Ogg pode ser usada como o codificador - embora eu ache que você tenha dificuldade em encontrar uma ferramenta melhor de sox para a concatenação.

  1. find *.wma -exec ffmpeg -i {} outfile.{}.wav \;
    (isso executa ffmpeg -i infile.wma outfile.infile.wma em 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 no passo 1)

  3. oggenc all.wav all.ogg Você provavelmente quer algumas configurações de qualidade aqui, mas isso vai dar padrões de qualidade decente. Eu não obtive resultados que eu gostei com ffmpeg , mas você pode preferir, então eu incluí um exemplo com ffmpeg abaixo.

Observe que o comando sox não funcionará corretamente, a menos que todos os arquivos WAV tenham o mesmo formato - se alguns forem 22kHz e outros forem 44.1kHz, por exemplo, você precisará identificá-los como sox via commandline switches e especifique em qual formato você deseja que a saída entre. Eu não conheço nenhuma ferramenta de linha de comando tão capaz quanto sox para a etapa de concatenação. Você poderia possivelmente produzir para um formato PCM bruto na etapa 1 e usar cat para a etapa 2, mas isso só funcionaria se estivessem no mesmo formato e você precisaria ser extremamente específico para o seu decodificador e codificador quanto ao formato que eles devem esperar.

Codificação com ffmpeg: Muitas postagens em torno da rede reclamam que o codificador Vorbis embutido do ffmpeg não é muito bom. Se sua versão é construída com suporte a libvorbis, use -acodec libvorbis . Exemplo de linha de comando:

ffmpeg -i all.wav -acodec libvorbis -ac 2 -ab 128k all.ogg
    
por 02.11.2009 / 05:58
1

Não funciona para arquivos .ogg, mas mp3wrap pode concatenar vários arquivos .mp3 em um único arquivo. Então, a partir da linha de comando, você poderia fazer algo parecido com isto

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

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

    
por 02.11.2009 / 06:11
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 a fazer somente áudio (o que normalmente se recusa a fazer). Essas duas coisas combinadas parecem satisfazer as suas necessidades.

Edit: Eu encontrei o aconvert.sh. Infelizmente, ele é projetado apenas para converter um arquivo de áudio. Mas aqui está o código, 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
    
por 02.11.2009 / 09:12
0

Isso pode não ser exatamente o que você precisa, mas deve ajudar link

    
por 02.11.2009 / 02:33
0

Pensei em lançar minha resposta. Esta provavelmente não é a maneira mais elegante, mas fez o que eu queria.

Passo 1: converta para ogg (usa mplayer , pacpl e ruby , todos disponíveis nos repositórios livres do Debian. 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

Passo 2: concatene arquivos ogg

cat *ogg > big-file.ogg
    
por 13.04.2012 / 15:17