Как стать автором
Обновить

Дайте музыку. Секретные материалы

Время на прочтение 4 мин
Количество просмотров 1.3K
Когда несколько дней назад я начал подготовку к написанию новой статьи к обучающей серии, мне захотелось написать простой урок по воспроизведению мультимедиа-файлов. Взяв за основу материал MSDN, я перевел его (он не слишком сложный), но хотелось чего-то поинтереснее. И тут на глаза мне попадается статья Windows Phone tip of the day: MediaLibrary can be tested in the emulator with built-in songs, которая привлекла мое внимание.
При попытке воспроизвести музыку описанным способом, я столкнулся с неработающим примером. Случайным образом мне удалось заставить пример работать. Ниже представлен вольный перевод статьи с решением моей проблемы.

Вероятно, не все разработчики знают, что в системе, поставляемой в эмуляторе Windows 7, кроме картинок есть также несколько встроенных файлов с музыкой. Точнее их три:

  • Another Melody Song (00:00:31.3930000) by Windows Phone Artist [Pop]
  • Melody Song (00:00:30.4640000) by Windows Phone Artist [Rock]
  • Rhythm Variation (00:00:15.3710000) by Windows Phone Artist [R&B]


Небольшое отступление

Так как я пользуюсь разлоченным вариантом эмулятора, то мне не составляет труда убедиться в справедливости данного утверждения. Достаточно выбрать хаб Music + Video и прослушать все мелодии. У меня в планах подготовить статью о возможностях, которые предоставляет разлоченный вариант, включая навигацию по папкам и реестру системы.

Получить список песен

Но вернемся к музыке. Мы можем самостоятельно получить список музыки, которая находится в библиотеке, а также дополнительную информацию (продолжительность песни, автор и т.п.). Для этого сначала добавим ссылку на Microsoft.Xna.Framework и затем пишем следующий код:
<code>
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Media;

private void buttonGetSongs_Click(object sender, RoutedEventArgs e)
{
     FrameworkDispatcher.Update();
     MediaLibrary lib = new MediaLibrary();

     foreach (Song s in lib.Songs)
     {
         Debug.WriteLine(s.Name + " " + s.Duration + " " + s.Artist);
     }
}
</code>


Запустив проект и нажав кнопку, мы получаем список песен, содержащихся в библиотеке, который приведен выше. Тут проблем не возникло. Идем дальше.

Воспроизведение

Просто получить список музыки не интересно, хочется ее послушать. Воспользуемся экземпляром класса MediaPlayer
<code>
// 1 вариант
// Фоновая музыка
MediaPlayer.Play(lib.Songs[0]);
</code>


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

Воспроизведение. Способ второй

Автор оригинальной статьи также привел полные пути к файлам, которые находятся в библиотеке.
  • My Documents\Zune\Content\0100\00\11.wma (Melody Song)
  • My Documents\Zune\Content\0100\00\15.wma (Another Melody Song)
  • My Documents\Zune\Content\0100\00\17.wma (Rhythm Variation)


Дальше я решил провести самостоятельные исследования и воспроизвести музыку по именам файлов. Вот тут меня поджидали другие неожиданности. Сначала код, который выглядел правильно для меня.
<code>
// 2 вариант
// Список доступной музыки
//My Documents\Zune\Content\0100\00\11.wma (Melody Song)
//My Documents\Zune\Content\0100\00\15.wma (Another Melody Song)
//My Documents\Zune\Content\0100\00\17.wma (Rhythm Variation) 
MediaPlayerLauncher playerlauncher = new MediaPlayerLauncher();
playerlauncher.Media = new Uri(@"\My Documents\Zune\Content\0100\00\17.wma",   UriKind.RelativeOrAbsolute);
playerlauncher.Location = MediaLocationType.Install;
playerlauncher.Controls = MediaPlaybackControls.Pause | MediaPlaybackControls.Stop;
playerlauncher.Show();
</code>


Пример очень простой. Я хотел вызвать встроенный плеер через MediaPlayerLauncheer (о задачах выполнения писал здесь) и передать ему готовый путь к файлу. Первое, что меня смутило, отсутствие обратного слэша в начале пути у автора статьи. Имея опыт разработки под Windows Mobile, я помнил, что все пути начинались с символа слэша (\). Моя догадка оказалась верной. Без слэша программа вываливалась с ошибкой. Впрочем, со слэшем ситуация выглядела не намного лучше. Ошибка не появлялась, но музыка не воспроизводилась. Немного расстроившись, я вышел из программы и стал просто щелкать по значкам программ, установленных в эмуляторе. И случайно нажал на значок своей программы, а затем и на кнопку воспроизведения. И, о чудо, музыка зазвучала! Таким образом, я впервые встретился с ситуацией разного поведения программы, запущенного с Visual Studio или с эмулятора.

Тогда я вернулся к первому примеру и попробовал тот же способ. Сначала я запустил программу через Visual Studio и сразу его закрыл. А затем в эмуляторе запустил свою программу еще раз. Все работало.

Напоследок, я хотел еще попробовать вариант воспроизведения музыки через MediaElement. Увы, безрезультатно. Привожу код на всякий случай. Может кто-то из профессионалов сможет разобраться в этой проблеме.
<code>
//Uri u = new Uri(@"\My Documents\Zune\Content\0100\00\15.wma");
//MediaElement mymedia = new MediaElement();
//mymedia.Source = u;
//mymedia.Play();
</code>


Удачного вам программирования!

P.S. Картинок не будет, так как нечего показывать.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+2
Комментарии 5
Комментарии Комментарии 5

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн