Почему SoundPlayer Windows не воспроизводит WAV-файлы RF64?

Я использую System.Media.SoundPlayer API для воспроизведения звуковых файлов в своем приложении.

using System.Media;

public class MySoundPlayer
{
     private SoundPlayer player = new SoundPlayer();

     public PlayFile(string file)
     {
          try 
          {
              player.SoundLocation = fileName;
              player.Load();
              player.Play();
          }
          catch (Exception e) { Debug.WriteLine(e.Message); }
     }
}

Это отлично работает практически для всех файлов WAV. Однако я обнаружил, что существует один тип файла wav, RF64 type (у которого есть дополнительный (но в моем случае всегда пустой) фрагмент «JUNK» на тот случай, если размер файла может превысить 4 ГБ. SoundPlayer загружает этот файл просто отлично, не выдает никаких исключений, но не воспроизводится. Проигрыватель Windows Media, с другой стороны, воспроизводит его просто отлично, поэтому файл кажется правильным.

В качестве альтернативы я попробовал другой способ воспроизведения файла:

[DllImport("winmm.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
static extern bool PlaySound(string pszSound,IntPtr hMod,SoundFlags sf);

public PlayFile(string file)
{
    // (These flags have been defined as 0x00020000 and 0x0001)
    PlaySound(filename, IntPtr.Zero, SoundFlags.SOUND_FILENAME | SoundFlags.SOUND_ASYNC); 
}

Опять же, это отлично воспроизводит обычные файлы WAV, но выдает ошибку «Динь!» когда он получает файл RF64.

Есть ли способ заставить эти API воспроизводить мои файлы? Или есть еще один Windows API, который воспроизводит WAV-файл RF64?


person Yellow    schedule 24.10.2013    source источник


Ответы (1)


SoundPlayer крайне ограничен в своих возможностях. Он воспроизводит только стандартные файлы WAV, не предлагает возможности изменить положение или установить громкость. Вы можете попробовать и посмотреть, будет ли MediaElement из WPF воспроизводить ваш файл WAV.

Если это не сработает, один из вариантов — NAudio, библиотека с открытым исходным кодом, которую я поддерживаю, и класс WaveFileReader может читать файлы RF64.

person Mark Heath    schedule 24.10.2013
comment
Хорошее предложение, MediaElement играет. Я не пробовал NAudio, так как это, вероятно, потребовало бы немного больше работы, но я уверен, что это тоже сработает. - person Yellow; 25.10.2013