Статьи

Поправился при интеграции с Music и Video Hub в WP7


Если вы создаете приложение для Windows Phone 7, которое может или должно интегрироваться с хабом Music & Video, Microsoft предоставила некоторые инструкции по этому вопросу:

http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010 /11/04/integrating-your-app-into-the-music-videos-hub.aspx

и

http://msdn.microsoft.com/en-us/library/ff769558(VS.92).aspx

Однако есть несколько моментов, которые в настоящее время (хорошо) не документированы (пока):

MediaHistoryItem.Source

Для интеграции с
M + V Hub необходимо использовать
MediaHistoryItem .

MediaHistoryItem имеет
свойство
Source, которое Intellisense в Visual Studio говорит нам не использовать:

Если мы не установим его, мы получим ошибку. Да, хотя нам сказали не использовать его.

Infact, мы должны установить его в пустую строку.

Если мы покопаемся в комментариях к свойству в
MSDN, то найдем примечание об этом:


«Хотя это свойство не поддерживается, вы должны установить его значение равным« », то есть пустой строкой, всякий раз, когда вы создаете новый MediaHistoryItem.»

MediaHistoryItem.Title

Еще одно свойство MediaHistoryItem —
заголовок . Это обязательное свойство.

На данный момент следует отметить, что есть 3 случая использования MediaHistoryItem:
при добавлении нового элемента ;
При обновлении элемента «Сейчас исполняется» ; и
при обновлении недавно воспроизведенного списка .

Для всех этих сценариев вы должны установить заголовок на что-то, но он фактически используется только при установке элемента «NowPlaying».

MediaHistoryItem.ImageStream

При указании потока изображения для использования для тайла в
концентраторе
M + V имеется документация о
требованиях сертификации приложений в отношении используемых изображений, но несколько бесполезно легко пропустить, что поток должен быть меньше, чем недокументированный
MaxImageSize .

Этот размер составляет всего
16 КБ .


System.ArgumentException: размер потока изображения больше максимально допустимого 16384

Это может показаться довольно большим для изображения размером всего 358×358 или 173×173 пикселей. (Ваше изображение будет изменено и / или обрезано, если не указаны указанные размеры, но вы можете не пройти сертификацию Marketplace, если полагаетесь на это.)

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

Если у вас есть эта проблема, вы можете рассмотреть возможность использования цветовой границы спайки вокруг изображения, чтобы позволить вам поддерживать более высокое качество изображения (то есть требуется более низкое сжатие JPEG).

MediaPlayerLauncher & WMDRM

MediaPlayerLauncher позволяет легко воспроизводить файлы WMV из IsolatedStorage:

var mpl = new MediaPlayerLauncher
                {
                    Controls = MediaPlaybackControls.All,
                    Location = MediaLocationType.Data,
                    Media = new Uri("filename.wmv", UriKind.Relative)
                };
 
mpl.Show();

Но если ваш файл WMV использует WMDRM, а не PlayReady DRM, то все становится сложнее.

К сожалению , Silverlight не поддерживает WMDRM, только PlayReady DRM.

К счастью , Silverlight предоставляет возможность переопределить использование WMDRM и использовать вместо этого сервер лицензий PlayReady.

К сожалению , MediaPlayerLauncher не поддерживает это.

К счастью , одной из особенностей Silverlight 4, которая была включена в Silverlight на WP7, была возможность поддержки постоянных лицензий PlayReady DRM.

Так что мы можем сделать?

Предполагая, что мы можем выпустить постоянные лицензии PlayReady (отдельная проблема, которую я не буду обсуждать сейчас), мы можем объединить использование MediaPlayerLauncher с использованием
MediaElement .

Мы можем использовать MediaElement (который включает в себя
LicenseAcquirer и, в свою очередь,
свойство
LicenseServerUriOverride ), чтобы получить лицензию PlayReady.

<mediaelement name="forLicenseAcquisition" height="0" width="0" autoplay="False" mediafailed="forLicenseAcquisition_MediaFailed" mediaopened="forLicenseAcquisition_MediaOpened">
</mediaelement>
forLicenseAcquisition.LicenseAcquirer.LicenseServerUriOverride =
    new Uri(AppResources._RightManagerAddress + urlGetParams, UriKind.Absolute);
 
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
    var movieFileStream = store.OpenFile("filename.wmv", FileMode.Open, FileAccess.Read);
    forLicenseAcquisition.SetSource(movieFileStream);
 
    forLicenseAcquisition.Play();
}

После получения лицензии MediaElement начнет воспроизводиться. Затем мы можем обработать событие, возникшее, когда MediaElement начинает воспроизводиться.

В этом обработчике мы прекращаем воспроизведение через MediaElement, а затем запускаем его в MediaPlayerLauncher.

private void forLicenseAcquisition_MediaOpened(object sender, RoutedEventArgs e)
{
    forLicenseAcquisition.Stop();
 
    // record that license acquired
 
    var mediaHistoryItem = new MediaHistoryItem();
    mediaHistoryItem.Title = "My Movie";
    mediaHistoryItem.Source = string.Empty; // Must be set but unused
 
    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
    {
        mediaHistoryItem.ImageStream = store.OpenFile("tile_image.jpg", FileMode.Open, FileAccess.Read);
    }
 
    mediaHistoryItem.PlayerContext.Add("Movie_Title", "My Movie");
 
    MediaHistory.Instance.NowPlaying = mediaHistoryItem;
 
    var mpl = new MediaPlayerLauncher
    {
        Controls = MediaPlaybackControls.All,
        Location = MediaLocationType.Data,
        Media = new Uri("filename.wmv", UriKind.Relative)
    };
 
    mpl.Show();
}

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

Если вы это сделаете, также целесообразно обработать событие MediaElement Failed на случай, если возникла проблема с получением лицензии.

Также целесообразно отслеживать, для какого контента была приобретена лицензия. Это означает, что вы можете пропустить необходимость использовать MediaElement при последующих попытках воспроизведения контента. Это означает, что контент может быть загружен и, следовательно, начать играть быстрее в последующие времена.

Я надеюсь, что кто-то найдет вышеупомянутое полезным. 😉