Когда несколько дней назад я начал подготовку к написанию новой статьи к обучающей серии, мне захотелось написать простой урок по воспроизведению мультимедиа-файлов. Взяв за основу материал MSDN, я перевел его (он не слишком сложный), но хотелось чего-то поинтереснее. И тут на глаза мне попадается статья Windows Phone tip of the day: MediaLibrary can be tested in the emulator with built-in songs, которая привлекла мое внимание.
При попытке воспроизвести музыку описанным способом, я столкнулся с неработающим примером. Случайным образом мне удалось заставить пример работать. Ниже представлен вольный перевод статьи с решением моей проблемы.
Вероятно, не все разработчики знают, что в системе, поставляемой в эмуляторе Windows 7, кроме картинок есть также несколько встроенных файлов с музыкой. Точнее их три:
Так как я пользуюсь разлоченным вариантом эмулятора, то мне не составляет труда убедиться в справедливости данного утверждения. Достаточно выбрать хаб Music + Video и прослушать все мелодии. У меня в планах подготовить статью о возможностях, которые предоставляет разлоченный вариант, включая навигацию по папкам и реестру системы.
Но вернемся к музыке. Мы можем самостоятельно получить список музыки, которая находится в библиотеке, а также дополнительную информацию (продолжительность песни, автор и т.п.). Для этого сначала добавим ссылку на Microsoft.Xna.Framework и затем пишем следующий код:
Запустив проект и нажав кнопку, мы получаем список песен, содержащихся в библиотеке, который приведен выше. Тут проблем не возникло. Идем дальше.
Просто получить список музыки не интересно, хочется ее послушать. Воспользуемся экземпляром класса MediaPlayer
Тут меня ждала первая неожиданность. Когда я нажимал на кнопку для воспроизведения, то программа закрывалась с ошибкой, но музыка при этом воспроизводилась и звучала сама по себе в фоновом режиме, не мешая переключаться между другими приложениями. Чуть позже вы поймете, как избежать появления ошибки.
Автор оригинальной статьи также привел полные пути к файлам, которые находятся в библиотеке.
Дальше я решил провести самостоятельные исследования и воспроизвести музыку по именам файлов. Вот тут меня поджидали другие неожиданности. Сначала код, который выглядел правильно для меня.
Пример очень простой. Я хотел вызвать встроенный плеер через MediaPlayerLauncheer (о задачах выполнения писал здесь) и передать ему готовый путь к файлу. Первое, что меня смутило, отсутствие обратного слэша в начале пути у автора статьи. Имея опыт разработки под Windows Mobile, я помнил, что все пути начинались с символа слэша (\). Моя догадка оказалась верной. Без слэша программа вываливалась с ошибкой. Впрочем, со слэшем ситуация выглядела не намного лучше. Ошибка не появлялась, но музыка не воспроизводилась. Немного расстроившись, я вышел из программы и стал просто щелкать по значкам программ, установленных в эмуляторе. И случайно нажал на значок своей программы, а затем и на кнопку воспроизведения. И, о чудо, музыка зазвучала! Таким образом, я впервые встретился с ситуацией разного поведения программы, запущенного с Visual Studio или с эмулятора.
Тогда я вернулся к первому примеру и попробовал тот же способ. Сначала я запустил программу через Visual Studio и сразу его закрыл. А затем в эмуляторе запустил свою программу еще раз. Все работало.
Напоследок, я хотел еще попробовать вариант воспроизведения музыки через MediaElement. Увы, безрезультатно. Привожу код на всякий случай. Может кто-то из профессионалов сможет разобраться в этой проблеме.
Удачного вам программирования!
P.S. Картинок не будет, так как нечего показывать.
При попытке воспроизвести музыку описанным способом, я столкнулся с неработающим примером. Случайным образом мне удалось заставить пример работать. Ниже представлен вольный перевод статьи с решением моей проблемы.
Вероятно, не все разработчики знают, что в системе, поставляемой в эмуляторе 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. Картинок не будет, так как нечего показывать.