none
Работа с звуковыми файлами в C# RRS feed

  • Вопрос

  • Попробовал используя пример из интернета (http://www.codeproject.com/KB/audio-video/WaveEdit.aspx) определить параметры WAV файла. В примере не использовались библиотеки, просто считывался файл. Основные параметры считываются правильно, но неправильно считываются параметры формата (dwBitsPerSample=1633943568 вместо 16) и не находятся секции WAV файла "fact" и "data" (и в примере и в моем проекте). Проект можно скачать по http://zalil.ru/33660365. Помогите, пожалуйста, разобраться.

    Alex

    9 августа 2012 г. 10:03

Ответы

  • Да с точки зрения программы у Вас всё правильно работает. Смотрите

    позиция в потоке 34, а это значит, что метод прочитает байты 35-38, а они равны

    10 00 64 61 в шестнадцатеричном формате, что в переводе на UInt32 и даёт ваше число 1633943568. Т.е. у Вас либо формат файла неверный, либо алгоритм. Ищите ошибки в них. А то всё верно работает.

    • Помечено в качестве ответа Abolmasov Dmitry 30 августа 2012 г. 12:59
    9 августа 2012 г. 18:47
    Модератор

Все ответы

  • Да с точки зрения программы у Вас всё правильно работает. Смотрите

    позиция в потоке 34, а это значит, что метод прочитает байты 35-38, а они равны

    10 00 64 61 в шестнадцатеричном формате, что в переводе на UInt32 и даёт ваше число 1633943568. Т.е. у Вас либо формат файла неверный, либо алгоритм. Ищите ошибки в них. А то всё верно работает.

    • Помечено в качестве ответа Abolmasov Dmitry 30 августа 2012 г. 12:59
    9 августа 2012 г. 18:47
    Модератор
  • Спасибо большое за ответ. В исходном коде была ошибка: вместо format.dwBitsPerSample = reader.ReadUInt32() нужно взять 2 байта вместо четырех. После исправления и изменения в некоторых местах кода параметры файла определяются правильно. Хотел теперь научиться записывать файл. Попробовал считать строку до отсчетов, записать эту строку в новый файл как заголовок файла, потом записать немного измененные данные. Не получилось. При таком подходе почему-то вместо файла 21 кб (исходный файл) получается 16 кб, файл звуковым редактором не открывается (ошибка формата). Подскажите, пожалуйста, как правильно файл с измененными отчетами и тем же их количеством.  Новый проект разместил на http://zalil.ru/33666014

    Alex

    10 августа 2012 г. 14:41
  • Непонятно, что там у Вас последняя функцияя химичит

    public int WaveMake()
        {
          reader.BaseStream.Seek(0, SeekOrigin.Begin);
          writer.Write(reader.ReadChars(data.lFilePosition));
          long nWrPos = writer.BaseStream.Position;
          writer.BaseStream.Seek(data.lFilePosition, SeekOrigin.Begin);
          for(int i = 0; i < data.dwNumSamples; i++)
          {
            writer.Write(reader.ReadInt16() + 10);
          }
          reader.Close();
          writer.Close();
          return 0;
        }

    явно делает не то, но в конечном счёте получается файл больше 21кб, у меня вышло 34кб. Ну алгоритм работы с waw файлом я не знаю, и времени нет изучить его, но основная идея такова. У Вас уже есть файл, и Вы знаете в какой секции какие данные содержатся. Вы умеете их читать и знаете порядок. Чтобы сделать запись, нужно собрать весь этот массив байт в обратном порядке и записать их в файл. Т.е. первые n  байт относятся к этому , добавили к ним m байт того, мотом k байт другого и т.д., конечный массив готов. Нужно писать на диск и всё.

    10 августа 2012 г. 18:49
    Модератор
  • Функция считывает всю службную информацию до первого отсчета, которую потом записывает в файл. Но делает это, видимо, неправильно. Буду разбираться дальше.


    Alex

    11 августа 2012 г. 11:58
  • Попробовал записать считанные заголовки файла, а затем записать в новый файл считанные из исходного файла данные. Ошибка формата исчезла, но файлы отличаются заголовками:
    RIFF&W..WAVEfmt ........D¬..€X........data.C..¬яКя•.В.`.’я // Исходный файл
    .RIFF.W...WAVE.fmt ........D¬..€X.......dataЃ!..¬яКя•.В.`.’я  // Записанный файл
    и размером - почему то файл исходный 21 кб, записанный - 16 кб, однако в записанном файле появился лишний небольшой участок вначале. Подскажите, пожалуйста, в чем ошибка и почему файлы так сильно отличаются размерами.  Новый проект разместил на http://zalil.ru/33669374

    Alex

    11 августа 2012 г. 18:31
  • Чтото у вас не так с считаванием/записью. Если вы читаете в байты, а потом записываете эти байты в том же порядке - то файлы (заголовки) должны быть идентичны. Проверяйте позиции откуда начинаете считывать тот или иной массив байт и размер массива. Сверяйте их hex значения с данными в файле, который смотрите через hex редактор.


    Для связи [mail]

    20 августа 2012 г. 12:03
  • Ошибку нашел, всем спасибо


    Alex

    30 августа 2012 г. 18:56