Como extrair um fluxo Vorbis de um arquivo WAVE?

3

Eu gostaria de mover o fluxo Vorbis para um contêiner ogg, mas o ffmpeg não parece reconhecer o fluxo.

Apesar de MPlayer fornecer essa saída na reprodução:

Opening audio decoder: [acm] Win32/ACM decoders
Loading codec DLL: 'vorbis.acm'
Loaded DLL driver vorbis.acm at 10000000
Warning! ACM codec reports srcsize=0
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)
Selected audio codec: [vorbisacm] afm: acm (OggVorbis ACM)

ffmpeg:

ffmpeg -i Source.wav -acodec copy Target.ogg
Input #0, wav, from 'Source.wav':
  Duration: 00:02:15.17, bitrate: 128 kb/s
    Stream #0.0: Audio: qg[0][0] / 0x6771, 44100 Hz, 2 channels, 128 kb/s
[ogg @ 00000000003096C0] Unsupported codec id in stream 0
Output #0, ogg, to 'Target.ogg':
  Metadata:
    encoder         : Lavf53.6.0
    Stream #0.0: Audio: qg[0][0] / 0x6771, 44100 Hz, 2 channels, 128 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
Could not write header for output file #0 (incorrect codec parameters ?)

Claro que isso não precisa necessariamente ser feito via ffmpeg, qualquer método que seja viável seria ótimo ...

Reduzi um dos arquivos para 512 KB: sample.wav
(Alterado dois campos de tamanho de bloco no cabeçalho da onda para contabilizar isso, o fluxo incorporado é cortado "sem aviso prévio")

    
por H.B. 24.08.2012 / 22:01

2 respostas

3

O contêiner WAV é basicamente apenas um cabeçalho de arquivo. Não suporta frames de tamanho variável, exigidos pela Vorbis. "OggVorbis ACM" é, na verdade, Vorbis dentro de um contêiner Ogg (para fornecer o enquadramento), para que possa ser usado na estrutura de áudio herdada do Windows ACM, que não suporta o enquadramento necessário. Isso também permite que ele seja usado em arquivos WAV, embora isso não faça muito sentido, já que você pode salvar um arquivo .ogg.

O ffmpeg não implementa nem reconhece este codec WAV "OggVorbis ACM" não padrão. Você pode usar um programa que reconheça isso, como o Audacity , ou você pode tentar apenas retirar o cabeçalho WAV para extrair o Ogg Vorbis que está dentro.

Os fluxos Ogg válidos começam com OggS , que marca o início de cada Página Ogg no arquivo. No arquivo fornecido, há 66 bytes antes do primeiro OggS . Pelo menos no Mac / Linux / Unix você pode retirar os primeiros 66 bytes com o comando:

tail -c +67 sample.wav > sample.ogg

No seu arquivo, o Ogg embutido na verdade contém dois fluxos, o que parece ser uma tentativa de preenchê-lo com uma taxa de bits fixa. O segundo fluxo tem um codec desconhecido e parece confundir alguns jogadores. Por exemplo, o Firefox reproduz o primeiro fluxo (ignorando o segundo), mas o Chrome pára quando encontra o segundo fluxo. Ele também tem outras violações de especificação, incluindo nenhum eos (final de fluxo) (talvez porque você não postou o arquivo completo).

Se você extrair o primeiro bitstream (o vorbis one), parece tocar corretamente. Aqui estão algumas ferramentas que devem ser capazes de extrair o primeiro bitstream:

  • oggsplit (funciona nos arquivos wav ou ogg)
  • oggSplit de Ogg Video Tools (funciona no arquivo ogg)
  • oggz-rip (no entanto, este programa não gosta do seu arquivo, provavelmente devido a outras violações de especificação)

Pode ser melhor apenas ler o arquivo WAV com um programa como o Audacity e recodificá-lo para garantir que ele não contenha nenhuma outra estranheza.

    
por 28.08.2012 / 03:24
0

Eu encontrei o mesmo problema, com apenas a diferença que eu precisava para processar um grande número de arquivos WAV Ogg Vorbis. O Audacity não pôde abrir muitos deles (atualmente o Audacity não tem suporte para arquivos WAV Ogg Vorbis com codec ID 6771 ), sem mencionar que ele não pode processar arquivos em lote de forma recursiva (seu recurso Apply Chain é limitado a arquivos em um único diretório).

Acabei escrevendo o script ogg_wav para converter o Ogg Vorbis WAV em um formato mais utilizável. O script tem muitas opções e tratamento de erros. Ele pode converter WAV Ogg Vorbis para WAV descompactado ( -c opção), ou extrair fluxo OGG primário ( -e opção, o padrão se nenhuma opção for fornecida), entre outras coisas. Ele ignora arquivos sem fluxos Ogg. Com a opção -d , o arquivo .wav original será excluído.

É assim que funciona no caso mais simples: verifica se o arquivo tem o fluxo Ogg com ogginfo, verifica se temos permissões de gravação necessárias, depois procura a primeira marca "OggS" e usa o moggsplit para tentar extrair o (s) fluxo (s) Ogg , e se houver mais de um, ele assume que o maior fluxo Ogg jogável é o que queremos. O script também pode lidar com alguns casos mais complicados e tem muitas opções, execute ogg_wav -h para ver todas elas.

Aqui estão alguns exemplos de como usá-lo. Primeiro, é necessário instalar o script: faça o download do ogg_wav (requer o Bash shell e testei apenas no Linux), faça isso executável (com chmod +x ) e coloque-o em /usr/local/bin/ .

Para converter o Ogg Vorbis WAV em OGG (é possível especificar mais de um arquivo ou usar o shell globbing como *.wav ):

ogg_wav ogg-vorbis.wav

O comando acima criará ogg-vorbis.ogg extraindo o maior fluxo OGG reproduzível do arquivo WAV.

Para um grande número de arquivos, é melhor usar o GNU paralelo. Este é o comando para converter o WAV Ogg Vorbis para o WAV não-recursivo (remova a opção -d se você quiser manter o backup dos arquivos WAV originais alterando a extensão .wav para .bak):

find DIRECTORY -type f -iname '*.wav' | parallel ogg_wav -cd '{}'

O script pula arquivos WAV sem fluxo Ogg dentro, para que possa ser usado até você ter WAV descompactado e Ogg Vorbis WAV na mesma pasta.

    
por 17.11.2014 / 05:16