Нужна помощь в манипулировании файлах WAV (RIFF) на байтовом уровне

StackOverflow https://stackoverflow.com/questions/2618861

Вопрос

Я пишу приложение в C #, который будет записывать аудиофайлы (* .WAV) и автоматически тег и называть их. Волны-файлы являются файлами Riff (например, AVI), которые могут содержать мета данных, в дополнение к кускам данных сигнала. Итак, теперь я пытаюсь выяснить, как прочитать и написать Diff Meta Data в и из записанных волновых файлов.

Я использую Naudio для записи файлов и на вопрос их форумы так как Ну на так Для прочитанного и записи риффа бирки. Пока я получил ряд хороших ответов, ни одно из решений не допускается для чтения а также Писать куски риффа так легко, как я бы хотел.

Но что более важно, у меня очень мало опыта, посвященного файлам на байтовом уровне, и думать, что это может быть хорошая возможность для изучения. Итак, теперь я хочу попробовать написание своего класса (ES), которые могут прочитать в файле Riff и разрешить чтение метадалей и записать из файла.

Я использовал ручьи в C #, но всегда со всем потоком сразу. Так что теперь я немного потерял, что должен рассмотреть файл байт байтом. В частности, как бы мне удалить или вставлять байты в середину файла? Я попробовал читать файл через FileStream в байтовый массив (байт []), как показано в коде ниже.

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

И я мог видеть через отладчик Visual Studio, что первые четыре байта являются заголовком рифа файла.alt text

Но массивы - это боль, чтобы иметь дело с выполнением действий, которые изменяют их размер, такие как вставка или удаление значений. Таким образом, я думал, что я мог бы затем в байт [] в список, как это.

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

Что сделало бы любые манипулирования файлами BYTE BYTE в целом намного проще, но я волнуюсь, я могу пропустить что-то вроде класса в имени System.io. Я на правильном пути, или есть лучший способ сделать это? Я также должен упомянуть, что я не беспокоюсь о производительности, и предпочел бы не иметь дело с указателями или небезопасными блоками кода, как этот парень.

Если это поможет вообще здесь Хорошая статья в формате файла RIFF / WAV.

Это было полезно?

Решение

Я не писал в C #, но может указать на некоторых местах, которые плохо с моей точки зрения:

1) Не читайте целые файлы WAV в памяти, если файлы не являются вашими собственными файлами и сознательно имеют небольшой размер.

2) Нет необходимости вставлять данные в память. Вы можете просто, например, сделать следующее: проанализировать исходный файл, хранить смещения кусков и прочитать метаданные в памяти; представить метаданные для редактирования в диалоговом окне; При условии сохранения заголовка RIFF-WAV, FMT Chank, перенесите аудиоданные данные из исходного файла (чтение и запись блоков), добавьте метаданные; Обновить заголовок RIFF-WAV.

3) Попробуйте сохранить метаданные в хвосте файла. Это приведет к тому, что в переменном теге не потребуется повторное написание всего файла.

Кажется, некоторые источники, касающиеся работы с файлами Riff в C # присутствуют здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top