Открытие аудиофайла (wav) из MemoryStream для определения продолжительности - PullRequest
4 голосов
/ 17 августа 2010

Есть ли способ, либо в рамках Framework или с помощью P / Invoke, чтобы определить продолжительность файла WAV, который хранится в MemoryStream?

Я уже рассмотрел Управляемый DirectX и еще один аналогичный вопрос , но, похоже, все работает с путями, а не предоставляет какой-либо способ передачи впоток.Одна из ссылок в вопросе, на которую я ссылался ( Простой редактор C # Wave ....), дает понять, что я могу разобрать MemoryStream, чтобы определить продолжительностьфайла WAV.В идеале я бы не хотел изобретать велосипед.

Ответы [ 3 ]

6 голосов
/ 09 ноября 2010

Я согласен с Алексом. Я нашел время, чтобы собрать небольшую программу с тремя строками кода, которая печатает длительность wav-файла.

        var stream=new MemoryStream(File.ReadAllBytes("test.wav"));
        var wave = new WaveFileReader(stream);
        Console.WriteLine(wave.TotalTime); // wave.TotalTime -> TimeSpan

Скачать Библиотека NAudio : вы найдете файл NAudio.dll в пакете.

Просто укажите ссылку NAudio.dll в вашем проекте.

На момент написания статьи это релиз 1.3.

Как пишет автор в своем блоге, WaveFileReader также принимает Stream ; не просто путь к файлу.

Помните, что версия 1.3 создана для x86. Если вы хотите, чтобы он работал на x64, вам нужно принудительно установить ваш проект на x86. Если вы хотите NAudio.dll для x64 (как я), вам нужно перекомпилировать с любым процессором. Для меня оба решения работали как шарм.

0 голосов
/ 20 октября 2010

Проверьте это:

http://www.sonicspot.com/guide/wavefiles.html

и это

typedef struct {
  WORD wFormatTag; 
  WORD nChannels; 
  DWORD nSamplesPerSec; 
  DWORD nAvgBytesPerSec; 
  WORD nBlockAlign; 
  WORD wBitsPerSample; 
  WORD cbSize;} WAVEFORMATEX; 

Итак, у вас есть поток памяти ... Найдите 0x10 (чтобы пропустить заголовок Riff)+ 0x08 (для заголовка формата) = 24

И вы находитесь в приведенной выше структуре.

Используйте stream.ReadInt16() и stream.ReadInt32() для чтения требуемых элементов структуры.

Тогдаищите 54, прочитайте один DWORD, и это число байтов будет вашими выборочными данными.

Затем вычислите вашу продолжительность из этих переменных.

ПРИМЕЧАНИЕ: это будет работать ТОЛЬКО ДЛЯ ПРОСТОГОВолновые файлы PCM хранятся в вашем потоке памяти.Для других вам придется соблюдать заголовки и правильно их анализировать, находя блок данных и вычисляя длительность в соответствии с его размером.

0 голосов
/ 01 сентября 2010

Попробуйте выполнить следующий расчет

streamSize == headerSizeIfAny + playTime * sampling * singleSampleSize ->

playTime = (streamSize [в байтах] - headerSizeIfAny) / (выборка [выборок в секунду] *singleSampleSize [байт])

...