Использование Silverlight 2 для короткого аудио кэширования - PullRequest
1 голос
/ 26 мая 2009

Я пытаюсь использовать большое количество коротких звуковых сэмплов в игре, которую создаю в Silverlight 2. Сэмплы имеют длину менее 2 секунд.

Я бы предпочел загрузить все аудио образцы на холст во время инициализации. Я добавил медиа-элемент на холст и общий список для управления им. Пока что похоже на работу.

Когда я играю семпл в первый раз, он воспроизводится идеально. Если он закончил играть, и я хочу повторно использовать тот же элемент, он обрезает первую часть звука. Чтобы воспроизвести семпл снова, я останавливаюсь и играю медиа-элемент.

Есть ли другой способ, с помощью которого я должен использовать сэмплы, чтобы звук не был обрезан и чтобы была достигнута хорошая производительность?

Ответы [ 3 ]

1 голос
/ 17 июня 2009

Также, возможно, неплохо бы убедиться, что все ваши аудиосэмплы изначально передаются на клиентскую сторону. В зависимости от того, как вы его настроили, возможно, что MediaElements использует свои функции прогрессивной загрузки для получения медиа-файлов с сервера. Хотя в этом нет ничего плохого (кеширование браузера должно помогать вам после начальной загрузки), это означает, что вам приходится иметь дело с кешем браузера, и там есть некоторые потенциальные проблемы.

Возможные шаги:

  1. Пометить ваши аудиофайлы как «Контент». Это заставит их свернуться в .xap.
  2. Загрузите ваши аудиофайлы в MemoryStreams (см. Метод Application.GetResourceStream) и вызовите MediaElement.SetSource ().

НТН, Erik

1 голос
/ 14 июня 2009

Некоторые комментарии:

С MSDN : Попробуйте ограничить количество объектов MediaElement, которые вы имеете в своем приложении одновременно. Если в вашем дереве приложений имеется более ста объектов MediaElement, независимо от того, воспроизводятся ли они одновременно или нет, события MediaFailed могут вызываться. Чтобы обойти это, добавьте объекты MediaElement в дерево по мере необходимости и удалите их, когда они не нужны.

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

mediaelement.Position = new TimeSpan();

См. Также MSDN MediaElement.Position .

0 голосов
/ 18 июня 2009

Одна из техник, которую вы можете использовать, хотя я не уверен, насколько хорошо она будет работать в Silverlight, - это создать один большой файл со всеми вашими сэмплами, соединенными вместе (вероятно, с половиной секунды или около того молчания между каждым). Определите тайм-код для каждого семпла и найдите медиа-элемент в этой позиции и начните воспроизведение. Вам понадобится только столько медиа-элементов, сколько одновременных звуков, которые вы хотите воспроизвести.

...