Могу ли я использовать MediaPlayer для воспроизведения звуков из потока? Или я могу использовать URI для доступа к файловому потоку? - PullRequest
1 голос
/ 18 ноября 2008

Я использую System.Windows.Media.MediaPlayer для воспроизведения некоторых звуков, и я хотел бы загрузить эти звуки из ZIP-файла. Было бы неплохо иметь возможность загружать эти файлы в виде потока непосредственно из zip-файла, а не распаковывать их во временный каталог. Однако MediaPlayer.open принимает только URI.

Итак, есть ли способ создать URI, который будет ссылаться на содержимое потока? Что-то вроде локального хоста в памяти? Есть ли какой-нибудь соединитель от Stream до URI?

Ответы [ 3 ]

1 голос
/ 18 ноября 2008

Я использую MediaPlayer по двум основным причинам:

  1. Поддерживается одновременное воспроизведение потоковых данных (SoundPlayer не поддерживает это)
  2. Позволяет получить длину / продолжительность звукового файла.

Спасибо!

1 голос
/ 18 ноября 2008

System.Media.SoundPlayer должен делать то, что вам нужно (вы можете вообще пропустить MediaPlayer и URI). У него есть конструктор, который принимает поток.

0 голосов
/ 19 ноября 2008

Поскольку вам необходимо поддерживать полифонию, один из подходов заключается в PInvoke в API-интерфейсе Windows waveOutXXXX для воспроизведения звуков. Вот хороший пример того, как это сделать в C #:

https://www.codeproject.com/KB/audio-video/cswavplay.aspx

В этом примере также есть код для чтения информации, такой как длительность, частота дискретизации, биты на выборку и т. Д.

Если вы выполняете поиск, вы можете обнаружить, что API waveOutXXXX может воспроизводить только один звук за раз. Это было верно в Windows 95/98, но больше не верно.

Кстати, SoundPlayer, пожалуй, самый разочаровывающий класс .NET. Метод .Play () автоматически останавливает воспроизведение любого другого звука, воспроизводимого вашим процессом (это может быть любой другой звук, воспроизводимый любым приложением .NET) перед запуском, поэтому вы не можете использовать полифонию с ним. Худшему стажеру Microsoft потребовалось бы меньше минуты, чтобы добавить метод .DontStopJustPlay () или параметр bool StopFirst в метод .Play (). Возможно, ему понадобилось до обеда, чтобы добавить свойство Duration.

Хотя waveOutXXXX сложнее, чем хотелось бы от хорошо спроектированного современного API (и использование его в .NET создает дополнительные проблемы), его непревзойденное преимущество заключается в том, что он предустановлен на каждом компьютере с Windows начиная с Windows 95, включая устройства Windows Mobile. Любая другая опция (включая MediaPlayer) означает, что кому-то всегда придется что-то устанавливать.

...