Pergunta

Estou escrevendo um aplicativo em C# que gravará arquivos de áudio (*.wav) e marcará e nomeará automaticamente -os. Os arquivos de onda são arquivos de riff (como o AVI) que podem conter meta -dados, além dos pedaços de dados da forma de onda. Então agora estou tentando descobrir como ler e escrever os meta -dados do riff para e a partir de arquivos de onda gravados.

Estou usando Naudio para gravar os arquivos e perguntado em seus fóruns Como Bem, assim Para uma maneira de ler e escrever tags de riff. Enquanto eu recebi várias boas respostas, nenhuma das soluções permitiu a leitura e Escrever riff pedaços tão facilmente quanto eu gostaria.

Mais importante, porém, tenho muito pouca experiência em lidar com arquivos em um nível de bytes, e acho que essa pode ser uma boa oportunidade para aprender. Então agora quero tentar escrever minhas próprias classes que possam ler em um arquivo riff e permitir que os meta dados sejam lidos e escritos no arquivo.

Eu usei fluxos em C#, mas sempre com o fluxo inteiro de uma só vez. Então agora estou pouco perdido que tenho que considerar um byte de arquivo por byte. Especificamente, como eu iria remover ou inserir bytes para e para o meio de um arquivo? Tentei ler um arquivo através de um Filestream em uma matriz de bytes (byte []), como mostrado no código abaixo.

System.IO.FileStream waveFileStream = System.IO.File.OpenRead(@"C:\sound.wav");
byte[] waveBytes = new byte[waveFileStream.Length];
waveFileStream.Read(waveBytes, 0, waveBytes.Length);

E pude ver através do depurador do Visual Studio que os quatro primeiros bytes são o cabeçalho do riff do arquivo.alt text

Mas as matrizes são uma dor de lidar ao realizar ações que mudam seu tamanho, como inserção ou remoção de valores. Então, eu estava pensando que podia para o byte [] em uma lista como essa.

List<byte> list = waveBytes.ToList<byte>();

O que facilitaria muito a manipulação do byte do arquivo por byte, mas estou preocupado que eu possa estar perdendo algo como uma aula no System.io-nomes-space que tornaria tudo isso ainda mais fácil. Estou no caminho certo ou existe uma maneira melhor de fazer isso? Eu também devo mencionar que não estou muito preocupado com o desempenho e preferiria não lidar com ponteiros ou blocos de código inseguros como esse cara.

Se isso ajuda aqui é um bom artigo no formato do arquivo riff/wav.

Foi útil?

Solução

Não escrevi em C#, mas posso apontar em alguns lugares que são ruins do meu ponto de vista:

1) Não leia os arquivos WAV inteiros na memória, a menos que os arquivos sejam seus próprios arquivos e conscientemente tenham tamanho pequeno.

2) Não há necessidade de inserir dados na memória. Você pode simplesmente fazer o seguinte: Analisar o arquivo de origem, armazenar compensações de pedaços e ler metadados na memória; apresentar os metadados para editar em uma caixa de diálogo; Enquanto salva o cabeçalho Write Riff-WAV, FMT Chunk, transfira dados de áudio do arquivo de origem (lendo e escrevendo blocos), adicione metadados; Atualize o cabeçalho do RIFF-WAV.

3) Tente salvar metadados na cauda do arquivo. Isso resultará em uma tag alternada que apenas a tag não exigirá reescrita de todo o arquivo.

Parece que algumas fontes sobre o trabalho com arquivos de riff em c# estão presentes aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top