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:
- Pegue o nome do arquivo de destino do primeiro parâmetro da linha de comando.
- Remova o primeiro parâmetro da linha de comando, deixando apenas os nomes dos arquivos de origem.
- Crie um nome para um canal para o oggenc ler.
- Crie um nome para um canal para o mplayer escrever para
- Crie os canais.
- 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)
- 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. - Enquanto o comando anterior está em execução, codifique simultaneamente o canal de leitura nomeado em Ogg usando oggenc.
- 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).