Domanda

Sto scrivendo un un'applicazione in C # in grado di registrare i file audio (* .wav) e automaticamente tag e assegnare loro un nome. I file wave sono file RIFF (come AVI) che possono contenere blocchi di dati meta oltre ai blocchi di dati della forma d'onda. Così ora sto cercando di capire come leggere e scrivere i dati RIFF meta da e verso file wave registrati.

Sto usando NAudio per registrare i file, e ha chiesto il loro forum come bene su SO per modo di leggere e tag RIFF scrittura. Mentre ho ricevuto un certo numero di buone risposte, nessuna delle soluzioni ha permesso per la lettura di e che scrivono pezzi RIFF facilmente come vorrei.

Ma ancora più importante che ho pochissima esperienza trattare con i file a livello di byte, e che questo potrebbe essere una buona occasione per imparare. Quindi ora voglio provare a scrivere la mia classe (i) in grado di leggere in un file RIFF e consentire i meta-dati da leggere, e scritto dal file.

Ho usato flussi in C #, ma sempre con l'intero flusso in una sola volta. Così ora sto po 'perso che devo prendere in considerazione un file byte per byte. In particolare come potrei fare per rimuovere o inserire byte da e verso la metà di un file? Ho provato a leggere un file tramite un FileStream in un array di byte (byte []), come mostrato nel seguente codice.

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

e ho potuto vedere attraverso il debugger di Visual Studio che i primi quattro byte sono l'intestazione RIFF del file. alt text

Ma gli array sono un dolore da affrontare quando si eseguono azioni che cambiano la loro dimensione come l'inserimento o la rimozione di valori. Così ho pensato che potevo poi al byte [] in una lista come questa.

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

Il che farebbe qualsiasi manipolazione del file byte per byte un bel po 'più facile, ma io sono preoccupato potrei mancare qualcosa di simile a una classe nel System.IO nome-spazio che avrebbe fatto tutto questo ancora più facile. Sono sulla strada giusta, o c'è un modo migliore per fare questo? Vorrei anche ricordare che non sto enormemente preoccupato con le prestazioni, e preferirei non trattare con puntatori o blocchi di codice non sicuri come questo ragazzo .

Se aiuta a tutti qui è un articolo di buona sul RIFF / formato di file WAV.

È stato utile?

Soluzione

Non ho scritto in C #, ma può puntare su alcuni luoghi che fanno male dal mio punto di vista:

1) non leggono i file WAV interi in memoria a meno che i file sono i propri file e consapevolmente hanno piccole dimensioni.

2) Non v'è alcuna necessità di inserire un dato in memoria. Si può semplicemente ad esempio fare al riguardo quanto segue: Analizzare il file di origine, negozio offset di pezzi, e leggere i metadati in memoria; presentare i metadati per la modifica in una finestra; mentre il risparmio di scrittura intestazione RIFF-WAV, pezzo fmt, di trasferimento dei dati audio da file sorgente (con la lettura e la scrittura di blocchi), aggiungere metadati; aggiornamento intestazione RIFF-WAV.

3) Prova salvare i metadati in coda di file. Questa volontà si traduce in alternata solo tag non sarà necessario ri-scrittura di tutto il file.

Sembra alcune fonti per quanto riguarda l'utilizzo di file RIFF in C # sono presenti qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top