MediaElement
MediaElement
— это элемент управления для воспроизведения видео и звука. Носители, поддерживаемые базовой платформой, можно воспроизводить из следующих источников:
- Веб-сайт с помощью URI (HTTP или HTTPS).
- Ресурс, внедренный в приложение платформы, с помощью
embed://
схемы URI. - Файлы, поступающие из локальной файловой системы приложения, с помощью
filesystem://
схемы URI.
MediaElement
можно использовать элементы управления воспроизведением платформы, которые называются элементами управления транспортировкой. Однако они отключены по умолчанию и могут быть заменены собственными элементами управления транспортом. На следующих снимках экрана показан MediaElement
воспроизведение видео с помощью элементов управления транспортировкой платформы:
Примечание.
MediaElement
доступна в iOS, Android, Windows, macOS и Tizen.
Использует MediaElement
следующие реализации платформы.
Платформа | Реализация проигрывателя мультимедиа платформы |
---|---|
Android | ExoPlayer, большое спасибо библиотекам Android поддержки! |
iOS и macOS | AVPlayer |
Windows | MediaPlayer |
Начало работы
Чтобы использовать функцию MediaElement
набора средств сообщества .NET MAUI, необходимо выполнить следующие действия.
Установка пакета NuGet
Прежде чем вы сможете использовать MediaElement
внутри приложения, необходимо установить CommunityToolkit.Maui.MediaElement
пакет NuGet и добавить строку инициализации в MauiProgram.cs. Следующим образом:
Имя пакета: CommunityToolkit.Maui.MediaElement
URL-адрес пакета:https://www.nuget.org/packages/CommunityToolkit.Maui.MediaElement
Инициализация пакета
Сначала необходимо добавить инструкцию using в начало файла MauiProgram.cs
using CommunityToolkit.Maui.MediaElement;
Чтобы правильно использовать MediaElement
метод, необходимо вызвать в UseMauiCommunityToolkitMediaElement
классе при загрузке приложения MauiAppBuilder
MauiProgram.cs-файл. В следующем примере показано, как это сделать.
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseMauiCommunityToolkitMediaElement()
Дополнительные сведения о том, как это сделать, см. на странице "Начало работы ".
Инициализация конкретной платформы
Для доступа к MediaElement
функциям требуется следующая настройка для конкретной платформы.
При использовании MediaElement
необходимо выполнить следующие действия.
1. Добавление ResizableActivity
и Launchmode
добавление в действие
[Activity(Theme = "@style/Maui.SplashTheme", ResizeableActivity = true, MainLauncher = true, LaunchMode = LaunchMode.SingleTask)]
public class MainActivity : MauiAppCompatActivity
{
}
2. Добавьте следующее AndroidManifest.xml
<application>
в тег.
<service android:name="communityToolkit.maui.media.services" android:stopWithTask="true" android:exported="false" android:enabled="true" android:foregroundServiceType="mediaPlayback">
<intent-filter>
<action android:name="androidx.media3.session.MediaSessionService"/>
</intent-filter>
</service>
3. Обновление минимальной версии API android
В файле .csproj
проекта обновите минимальную версию API android до 26.
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">26.0</SupportedOSPlatformVersion>
4. Добавьте следующие разрешения для AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
Ниже приведен пример обязательных параметров в AndroidManifest.xml
<service android:name="communityToolkit.maui.media.services" android:stopWithTask="true" android:exported="false" android:enabled="true" android:foregroundServiceType="mediaPlayback">
<intent-filter>
<action android:name="androidx.media3.session.MediaSessionService"/>
</intent-filter>
</service>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/>
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>
Примечание.
Это изменение манифеста Android позволяет отображать метаданные при воспроизведении видео. Она обеспечивает поддержку уведомлений и имеет важное значение для функций уведомлений во всех соответствующих API. Это изменение представляет службу и предоставляет необходимые разрешения.
Полный пример этого метода, включенный в приложение, см . в примере приложения .NET MAUI Community Toolkit
Поддерживаемые форматы
Поддерживаемые мультимедийные форматы могут отличаться на каждую платформу. В некоторых случаях это может даже зависеть от того, какие декодеры доступны или установлены в операционной системе, которая используется при запуске приложения. Дополнительные сведения о том, какие форматы поддерживаются на каждой платформе, см. в приведенных ниже ссылках.
Платформа | Ссылка | Примечания. |
---|---|---|
Android | Поддерживаемые форматы ExoPlayer | |
iOS и macOS | Поддерживаемые форматы iOS и macOS | Нет официальной документации по этой статье |
Windows | Поддерживаемые форматы Windows | В Windows поддерживаемые форматы очень зависят от того, какие кодеки установлены на компьютере пользователя |
Tizen | Поддерживаемые форматы Tizen |
Внимание
Если пользователь использует выпуск Windows N, воспроизведение видео по умолчанию не поддерживается. Выпуски Windows N не имеют форматов воспроизведения видео, установленных по дизайну.
Распространенные сценарии
В следующих разделах рассматриваются распространенные сценарии использования.MediaElement
Воспроизведение удаленного носителя
Можно MediaElement
воспроизводить удаленные файлы мультимедиа с помощью схем URI HTTP и HTTPS. Для этого необходимо задать для свойства универсальный Source
код ресурса (URI) файла мультимедиа:
<toolkit:MediaElement Source="https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
ShouldShowPlaybackControls="True" />
Внимание
При воспроизведении удаленных источников из конечных точек HTTP, скорее всего, потребуется отключить меры безопасности операционной системы, которые препятствуют доступу к небезопасным веб-конечным точкам. Это верно по крайней мере для iOS и Android.
По умолчанию носитель, определенный свойством Source
, не сразу начинает воспроизводиться после открытия носителя. Чтобы включить автоматическое воспроизведение мультимедиа, задайте ShouldAutoPlay
для true
свойства значение .
Предоставленные платформой элементы управления воспроизведением мультимедиа включены по умолчанию и могут быть отключены, задав ShouldShowPlaybackControls
для свойства значение false
.
Использование метаданных
Можно MediaElement
использовать метаданные для MediaElement.MetadataTitle
, MediaElement.MetadataArtist
а также MediaElement.MetadataArtworkUrl
. Вы можете задать название или художник, чтобы показать, что в настоящее время играет на элементах управления блокировки для Windows, Mac Catalyst, iOS и Android. Вы можете задать локальный или удаленный URL-адрес с рисунками для экрана блокировки. Оно должно быть не менее 1080P, чтобы лучшее качество отображалось. Это должен быть URL-адрес и быть либо .jpg
или .png
<toolkit:MediaElement
MetadataTitle="Title"
MetadataArtist="Artist"
MetadataArtworkUrl="http://www.myownpersonaldomain.com/image.jpg" />
MediaElement.MetadataTitle="Title";
MediaElement.MetadataArtist="Artist";
MediaElement.MetadataArtworkUrl="http://www.myownpersonaldomain.com/image.jpg";
Внимание
Метаданные можно задать в XAML или коде. Если вы задаете его в коде позади, необходимо задать исходный код в коде. Источник должен быть установлен последним. Если вы задаете метаданные в XAML или конструкторе, это примечание можно безопасно игнорировать.
Воспроизведение локального носителя
Локальный носитель можно воспроизводить из следующих источников:
- Ресурс, внедренный в приложение платформы, с помощью
embed://
схемы URI. - Файлы, поступающие из локальной файловой системы приложения, с помощью
filesystem://
схемы URI.
Примечание.
Сокращенная и embed://
filesystem://
только работа из XAML. В коде используйте MediaSource.FromResource()
и MediaSource.FromFile()
соответственно. С помощью этих методов можно опустить embed://
префиксы и filesystem://
префиксы. Остальная часть пути должна совпадать.
Воспроизведение мультимедиа, внедренного в пакет приложения
Файл MediaElement
мультимедиа, внедренный в пакет приложения, может воспроизводиться с помощью embed://
схемы URI. Файлы мультимедиа внедряются в пакет приложения, помещая их в проект платформы.
Чтобы включить воспроизведение файла мультимедиа из локальных ресурсов, добавьте файл в папку Resources/Raw
проекта .NET MAUI. При добавлении файла в корневой каталог URI будет embed://MyFile.mp4
.
Вы также можете поместить файлы в вложенные папки. Если MyFile.mp4
бы он был в Resources/Raw/MyVideos
этом случае, универсальный код ресурса (URI), с MediaElement
которым он будет использоваться, будет embed://MyVideos/MyFile.mp4
.
Ниже приведен пример использования этого синтаксиса в XAML.
<toolkit:MediaElement Source="embed://MyFile.mp4"
ShouldShowPlaybackControls="True" />
Общие сведения о типах MediaSource
Носитель MediaElement
может воспроизводиться, задав его Source
свойство удаленному или локальному файлу мультимедиа. Свойство имеет типSource
, и этот MediaSource
класс определяет три статических метода:
-
FromFile
, возвращаетFileMediaSource
экземпляр из аргументаstring
. -
FromUri
, возвращаетUriMediaSource
экземпляр из аргументаUri
. -
FromResource
, возвращаетResourceMediaSource
экземпляр из аргументаstring
.
Кроме того, класс MediaSource
также имеет неявные операторы, возвращающие MediaSource
экземпляры из string
и Uri
аргументов.
Примечание.
Source
При установке свойства в XAML вызывается преобразователь типов для возврата экземпляра MediaSource
из или string
Uri
.
Класс также имеет следующие производные MediaSource
классы:
-
FileMediaSource
, который используется для указания локальногоstring
файла мультимедиа из . Этот класс имеетPath
свойство, которое можно задатьstring
для параметра . Кроме того, этот класс имеет неявные операторы для преобразованияstring
FileMediaSource
объекта в объект иFileMediaSource
объекта вstring
объект. -
UriMediaSource
, который используется для указания удаленного файла мультимедиа из URI. Этот класс имеетUri
свойство, которое можно задатьUri
для параметра . -
ResourceMediaSource
— используется для указания внедренного файла, предоставленного с помощью файлов ресурсов приложения. Этот класс имеетPath
свойство, которое можно задатьstring
для параметра .
Примечание.
FileMediaSource
При создании объекта в XAML вызывается преобразователь типов для возврата FileMediaSource
экземпляра string
из объекта.
Изменение пропорций видео
Свойство Aspect
определяет, как будет масштабироваться видеомедий, чтобы соответствовать области отображения. По умолчанию это свойство присваивается элементу AspectFit
перечисления, но его можно задать любому из Aspect
элементов перечисления:
-
AspectFit
указывает, что видео будет отформатировано( при необходимости), чтобы поместиться в область отображения, сохраняя пропорции. -
AspectFill
указывает, что видео будет обрезано таким образом, чтобы оно заполняло область отображения, сохраняя пропорции. -
Fill
указывает, что видео будет растянуто для заполнения области отображения.
Определение MediaElement
состояния
Класс MediaElement
определяет привязываемое свойство только для чтения с именем CurrentState
типа MediaElementState
. Это свойство указывает текущее состояние элемента управления, например воспроизведение или приостановка носителя, или если оно еще не готово к воспроизведению мультимедиа.
Перечисление MediaElementState
определяет следующие члены:
-
None
указывает, что неMediaElement
содержит носителя. -
Opening
указывает, чтоMediaElement
проверка и попытка загрузить указанный источник. -
Buffering
указывает, чтоMediaElement
носитель загружается для воспроизведения. ЕгоPosition
свойство не выполняется во время этого состояния.MediaElement
Если видео воспроизводилось, он продолжает отображать последний отображаемый кадр. -
Playing
указывает, чтоMediaElement
воспроизведение источника мультимедиа. -
Paused
указывает, чтоMediaElement
свойствоPosition
не перемещается.MediaElement
Если видео воспроизводилось, он продолжает отображать текущий кадр. -
Stopped
указывает, чтоMediaElement
содержит носитель, но он не воспроизводится или не приостановлен. ЕгоPosition
свойство сбрасывается до 0 и не выполняется заранее. -
Failed
указывает, чтоMediaElement
не удалось загрузить или воспроизвести носитель. Это может произойти при попытке загрузить новый элемент мультимедиа, при попытке воспроизведения элемента мультимедиа или при прерывании воспроизведения мультимедиа из-за сбоя. Используйте событие для получения дополнительных сведенийMediaFailed
.
Обычно при использовании CurrentState
элементов управления транспортом не требуется проверять MediaElement
свойство. Однако это свойство становится важным при реализации собственных элементов управления транспортировкой.
Реализация пользовательских элементов управления транспортировкой
Элементы управления транспортом проигрывателя мультимедиа включают кнопки, выполняющие функции воспроизведения, приостановки и остановки. Эти кнопки обычно определяются по знакомым значкам, а не тексту. Как правило, функции Воспроизведение и Пауза объединены в одну кнопку.
По умолчанию MediaElement
элементы управления воспроизведением отключены. Это позволяет управлять MediaElement
программными средствами или предоставлять собственные элементы управления транспортом. В поддержку этого, MediaElement
включают Play
Pause
и Stop
методы.
В следующем примере XAML показана страница, содержащая элементы управления транспортом MediaElement
и настраиваемые элементы управления транспортировкой:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="MediaElementDemos.CustomTransportPage"
Title="Custom transport">
<Grid>
...
<toolkit:MediaElement x:Name="mediaElement"
ShouldAutoPlay="False"
... />
<HorizontalStackLayout BindingContext="{x:Reference mediaElement}"
...>
<Button Text="Play"
HorizontalOptions="Center"
Clicked="OnPlayPauseButtonClicked">
<Button.Triggers>
<DataTrigger TargetType="Button"
Binding="{Binding CurrentState}"
Value="{x:Static toolkit:MediaElementState.Playing}">
<Setter Property="Text"
Value="Pause" />
</DataTrigger>
<DataTrigger TargetType="Button"
Binding="{Binding CurrentState}"
Value="{x:Static toolkit:MediaElementState.Buffering}">
<Setter Property="IsEnabled"
Value="False" />
</DataTrigger>
</Button.Triggers>
</Button>
<Button Text="Stop"
HorizontalOptions="Center"
Clicked="OnStopButtonClicked">
<Button.Triggers>
<DataTrigger TargetType="Button"
Binding="{Binding CurrentState}"
Value="{x:Static toolkit:MediaElementState.Stopped}">
<Setter Property="IsEnabled"
Value="False" />
</DataTrigger>
</Button.Triggers>
</Button>
</HorizontalStackLayout>
</Grid>
</ContentPage>
В этом примере пользовательские элементы управления транспортом определяются как Button
объекты. Однако существует только два Button
объекта, причем первый Button
представляет воспроизведение и паузу, а второй Button
— stop.
DataTrigger
Объекты используются для включения и отключения кнопок, а также для переключения первой кнопки между воспроизведением и приостановкой. Дополнительные сведения об триггерах данных см. в статье .NET MAUI Triggers.
В файле кода программной части есть обработчики событий Clicked
:
void OnPlayPauseButtonClicked(object sender, EventArgs args)
{
if (mediaElement.CurrentState == MediaElementState.Stopped ||
mediaElement.CurrentState == MediaElementState.Paused)
{
mediaElement.Play();
}
else if (mediaElement.CurrentState == MediaElementState.Playing)
{
mediaElement.Pause();
}
}
void OnStopButtonClicked(object sender, EventArgs args)
{
mediaElement.Stop();
}
Кнопка воспроизведения может быть нажата, когда она станет включена, чтобы начать воспроизведение. Нажатие кнопки "Пауза" приводит к приостановке воспроизведения. Нажатие кнопки "Остановить " останавливает воспроизведение и возвращает положение файла мультимедиа в начало.
Реализация пользовательского элемента управления томом
Элементы управления воспроизведением мультимедиа, реализованные каждой платформой, включают панель томов. Эта панель похожа на ползунок и показывает объем носителя. Кроме того, можно управлять панелью томов, чтобы увеличить или уменьшить объем.
Пользовательская панель томов может быть реализована с помощью следующего Slider
примера:
<StackLayout>
<toolkit:MediaElement ShouldAutoPlay="False"
Source="{StaticResource AdvancedAsync}" />
<Slider Maximum="1.0"
Minimum="0.0"
Value="{Binding Volume}"
Rotation="270"
WidthRequest="100" />
</StackLayout>
В этом примере Slider
данные привязывают его Value
свойство к Volume
свойству объекта MediaElement
. Это возможно, так как Volume
свойство использует привязку TwoWay
. Поэтому изменение Value
свойства приведет к изменению Volume
свойства.
Примечание.
Свойство Volume
имеет обратный вызов проверки, который гарантирует, что его значение больше или равно 0,0 и меньше или равно 1,0.
Дополнительные сведения об использовании Slider
ползунка .NET MAUI
Очистка MediaElement
ресурсов
Чтобы предотвратить утечку памяти, вам придется освободить ресурсы MediaElement
. Это можно сделать, отключив обработчик.
Где это необходимо сделать, зависит от того, где и как вы используете MediaElement
в приложении, но обычно, если у вас есть MediaElement
на одной странице и не воспроизводится мультимедиа в фоновом режиме, вы хотите освободить ресурсы, когда пользователь переходит от страницы.
Ниже приведен фрагмент примера кода, в котором показано, как это сделать. Во-первых, обязательно подключите Unloaded
событие на странице.
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="MediaElementDemos.FreeResourcesPage"
Title="Free Resources"
Unloaded="ContentPage_Unloaded">
<toolkit:MediaElement x:Name="mediaElement"
ShouldAutoPlay="False"
... />
</ContentPage>
Затем в коде в программной части вызовите метод для отключения обработчика.
public partial class FreeResourcesPage : ContentPage
{
void ContentPage_Unloaded(object? sender, EventArgs e)
{
// Stop and cleanup MediaElement when we navigate away
mediaElement.Handler?.DisconnectHandler();
}
}
Дополнительные сведения о обработчиках см. в документации по .NET MAUI для обработчиков.
Свойства
Свойство | Type | Описание | Значение по умолчанию |
---|---|---|---|
Аспект | Аспект | Определяет режим масштабирования для загруженного (визуального) носителя. Это свойство может быть привязано. | Aspect.AspectFit |
CurrentState | MediaElementState |
Указывает текущее состояние элемента управления. Это свойство только для чтения, привязываемое свойство. | MediaElementState.None |
Duration | TimeSpan |
Указывает длительность текущего открытого носителя. Это свойство только для чтения, привязываемое свойство. | TimeSpan.Zero |
Position | TimeSpan |
Описывает текущий ход выполнения по времени воспроизведения мультимедиа. Это свойство только для чтения, привязываемое свойство. Если вы хотите задать Position метод.SeekTo() |
TimeSpan.Zero |
Значение ShouldAutoPlay | bool |
Указывает, начнется ли воспроизведение мультимедиа автоматически при Source установке свойства. Это свойство может быть привязано. |
false |
ShouldLoopPlayback | bool |
Описывает, должен ли текущий загруженный источник мультимедиа возобновить воспроизведение с начала после достижения конца. Это свойство может быть привязано. | false |
ShouldKeepScreenOn | bool |
Определяет, должен ли экран устройства оставаться на экране во время воспроизведения мультимедиа. Это свойство может быть привязано. | false |
ShouldMute | bool |
Определяет, отключен ли звук в данный момент. Это свойство может быть привязано. | false |
ShouldShowPlaybackControls | bool |
Определяет, отображаются ли элементы управления воспроизведением платформ. Это свойство может быть привязано. Обратите внимание, что в iOS и Windows элементы управления отображаются только в течение короткого периода после взаимодействия с экраном. Не существует способа постоянного отображения элементов управления. | true |
Исходный код | MediaSource? |
Источник носителя, загруженного в элемент управления. | null |
Скорость | double |
Определяет скорость воспроизведения носителя. Это привязываемое свойство | 1 |
MediaHeight | int |
Высота загруженного носителя в пикселях. Это свойство только для чтения, привязываемое свойство. Не сообщается для не визуальных носителей и не всегда заполняется в iOS/macOS для потокового содержимого. | 0 |
MediaWidth | int |
Ширина загруженного носителя в пикселях. Это свойство только для чтения, привязываемое свойство. Не сообщается для не визуальных носителей и не всегда заполняется в iOS/macOS для потокового содержимого. | 0 |
Громкость | double |
Определяет том носителя, который представлен в линейном масштабе от 0 до 1. Это свойство может быть привязано. | 1 |
События
Мероприятие | Описание |
---|---|
MediaOpened; | Происходит при проверке и открытии потока мультимедиа. |
MediaEnded; | Происходит после MediaElement завершения воспроизведения своего носителя. |
MediaFailed; | Возникает при возникновении ошибки, связанной с источником мультимедиа. |
PositionChanged | Происходит, если значение свойства Position было изменено. |
SeekCompleted | Происходит, когда точка поиска запрошенной операции поиска готова к воспроизведению. |
Методы
Мероприятие | Описание |
---|---|
Воспроизвести | Запускает воспроизведение загруженного носителя. |
Пауза | Приостанавливает воспроизведение текущего носителя. |
Остановить | Останавливает воспроизведение и сбрасывает положение текущего носителя. |
SeekTo |
TimeSpan Принимает значение для задания Position свойства и принимает значение CancellationToken для отменыTask . |
Примеры
Примеры этого элемента управления можно найти в действии в примере приложения .NET MAUI Community Toolkit.
API
Исходный код MediaElement
можно найти в репозитории .NET MAUI Community Toolkit GitHub.
Дополнительные ссылки
.NET MAUI Community Toolkit