Plugin.MediaManager.Forms 1.2.2
需要 NuGet 2.14 或更高版本。
dotnet add package Plugin.MediaManager.Forms --version 1.2.2
NuGet\Install-Package Plugin.MediaManager.Forms -Version 1.2.2
<PackageReference Include="Plugin.MediaManager.Forms" Version="1.2.2" />
paket add Plugin.MediaManager.Forms --version 1.2.2
#r "nuget: Plugin.MediaManager.Forms, 1.2.2"
// Install Plugin.MediaManager.Forms as a Cake Addin #addin nuget:?package=Plugin.MediaManager.Forms&version=1.2.2 // Install Plugin.MediaManager.Forms as a Cake Tool #tool nuget:?package=Plugin.MediaManager.Forms&version=1.2.2
MediaManager - 为 Xamarin 和 Windows 提供的跨平台媒体插件
- 设计简单易用
- 从远程 http(s)、嵌入式和本地源播放媒体文件的原生支持
- 原生媒体通知和远程控制
- 默认的队列和播放管理
- 播放状态(播放、缓冲、载入、暂停、进度)
- 媒体处理事件以挂钩
状态
支持
- 请随意提出问题。请确保使用其中一个模板!
- 提供商业支持。与您的应用程序或服务集成、示例、功能请求等。电子邮件: [email protected]
- 由: baseflow.com
Wiki
更多文档和信息可在Wiki上找到
博客
安装
将 NuGet 包 添加到您要使用它的所有项目中。
- 在 Visual Studio 中 - 工具 > NuGet 包管理器 > 为解决方案管理包
- 选择浏览选项卡,搜索MediaManager
- 选择Plugin.MediaManager
- 将插件安装到您的解决方案中的每个项目中
平台支持
平台 | 支持 | 版本 | 播放器 |
---|---|---|---|
.Net Standard | 是 | 2.0+ | MediaManager |
Xamarin.Forms | 是 | 3.2+ | MediaManager |
Xamarin.Android | 是 | API 16+ | ExoPlayer |
Xamarin.iOS | 是 | iOS 10+ | AVPlayer |
Xamarin.Mac | 是 | 3.0+ | AVPlayer |
Xamarin.tvOS | 是 | 10.0+ | AVPlayer |
Tizen | 是 | 4.0+ | MediaPlayer |
Windows 10 UWP | 是 | 10+ | MediaPlayer |
Windows WPF (.NET Framework) | 是 | 4.7.2+ | MediaPlayer |
Windows WPF (.NET Core) | 是 | 3.1+ | MediaPlayer |
使用说明
从任何 .Net 库或 Xamarin 项目中调用 MediaManager.Current 以访问 API。
重要:初始化插件
确保在您的应用程序启动时在所有原生平台上调用 Init()。
CrossMediaManager.Current.Init();
可选地提供 Android 中的 Activity
。这还将用于绑定 Android Service
,并将用作 Intent
来从通知启动。
public class MainActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.main_activity);
CrossMediaManager.Current.Init(this);
}
}
当点击通知时,它将用 intent 启动您的一个活动。在大多数情况下,您可能希望将 Activity
的 LaunchMode
设置为 SingleTop
。这样,当单击时,应该将应用程序重新带到焦点。 您可以在此处了解更多信息
[Activity(LaunchMode = LaunchMode.SingleTop)]
public class MainActivity : AppCompatActivity
如果您想处理应用程序通过通知点击打开的情况,您可以在您的活动中覆盖 OnNewIntent
。
protected override void OnNewIntent(Intent intent)
{
base.OnNewIntent(intent);
// TODO: Handle app opened from notification tap.
}
释放资源
可以调用 CrossMediaManager.Current.Dispose()
来释放播放器。如果您在播放其他媒体文件之前使用了 dispose,请务必调用 CrossMediaManager.Current.Init()
。
播放单个媒体项
//Audio
await CrossMediaManager.Current.Play("https://ia800806.us.archive.org/15/items/Mp3Playlist_555/AaronNeville-CrazyLove.mp3");
//Video
await CrossMediaManager.Current.Play("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
播放多个媒体项
public IList<string> Mp3UrlList => new[]{
"https://ia800806.us.archive.org/15/items/Mp3Playlist_555/AaronNeville-CrazyLove.mp3",
"https://ia800605.us.archive.org/32/items/Mp3Playlist_555/CelineDion-IfICould.mp3",
"https://ia800605.us.archive.org/32/items/Mp3Playlist_555/Daughtry-Homeacoustic.mp3",
"https://storage.googleapis.com/uamp/The_Kyoto_Connection_-_Wake_Up/01_-_Intro_-_The_Way_Of_Waking_Up_feat_Alan_Watts.mp3",
"https://aphid.fireside.fm/d/1437767933/02d84890-e58d-43eb-ab4c-26bcc8524289/d9b38b7f-5ede-4ca7-a5d6-a18d5605aba1.mp3"
};
await CrossMediaManager.Current.Play(Mp3UrlList);
其他播放可能性
Task<IMediaItem> Play(IMediaItem mediaItem);
Task<IMediaItem> Play(string uri);
Task<IMediaItem> Play(IEnumerable<IMediaItem> items);
Task<IMediaItem> Play(IEnumerable<string> items);
Task<IMediaItem> Play(FileInfo file);
Task<IMediaItem> Play(DirectoryInfo directoryInfo);
Task<IMediaItem> PlayFromAssembly(string resourceName, Assembly assembly = null);
Task<IMediaItem> PlayFromResource(string resourceName);
- 例如,可以通过使用
File
和Directory
api播放来自File
的播放。您可以使用这些 .NET api 从互联网下载文件并将它们保存在某处。 - 当从
Assembly
播放时,您需要将媒体文件添加到一个 assembly 并将其构建操作设置为嵌入式资源
。 - 当从
Resource
播放时,您应该在 Android 中将您的媒体文件添加到例如Assets
或raw
文件夹,在 iOS 中添加到Resources
文件夹。
例如
await CrossMediaManager.Current.PlayFromAssembly("somefile.mp3", typeof(BaseViewModel).Assembly);
await CrossMediaManager.Current.PlayFromResource("assets:///somefile.mp3");
await CrossMediaManager.Android.PlayFromResource(Resource.Raw.somefile.ToString());
控制播放器
await CrossMediaManager.Current.Play();
await CrossMediaManager.Current.Pause();
await CrossMediaManager.Current.PlayPause();
await CrossMediaManager.Current.Stop();
await CrossMediaManager.Current.StepForward();
await CrossMediaManager.Current.StepBackward();
await CrossMediaManager.Current.SeekToStart();
await CrossMediaManager.Current.SeekTo(TimeSpan position);
控制队列
await CrossMediaManager.Current.PlayPrevious();
await CrossMediaManager.Current.PlayNext();
await CrossMediaManager.Current.PlayPreviousOrSeekToStart();
await CrossMediaManager.Current.PlayQueueItem(IMediaItem mediaItem);
await CrossMediaManager.Current.PlayQueueItem(int index);
扩展功能
void ToggleRepeat();
void ToggleShuffle();
检索和设置信息
IDictionary<string, string> RequestHeaders { get; set; }
TimeSpan StepSizeForward { get; set; }
TimeSpan StepSizeBackward { get; set; }
MediaPlayerState State { get; }
TimeSpan Position { get; }
TimeSpan Duration { get; }
TimeSpan Buffered { get; }
float Speed { get; set; }
RepeatMode RepeatMode { get; set; }
ShuffleMode ShuffleMode { get; set; }
bool ClearQueueOnPlay { get; set; }
bool AutoPlay { get; set; }
bool KeepScreenOn { get; set; }
扩展功能
bool IsPlaying();
bool IsBuffering();
bool IsPrepared();
bool IsStopped();
CrossMediaManager.Current.MediaPlayer.* 上可用的属性
IVideoView VideoView { get; set; }
bool AutoAttachVideoView { get; set; }
VideoAspectMode VideoAspect { get; set; }
bool ShowPlaybackControls { get; set; }
int VideoHeight { get; }
int VideoWidth { get; }
挂钩到事件
event StateChangedEventHandler StateChanged;
event BufferedChangedEventHandler BufferedChanged;
event PositionChangedEventHandler PositionChanged;
event MediaItemFinishedEventHandler MediaItemFinished;
event MediaItemChangedEventHandler MediaItemChanged;
event MediaItemFailedEventHandler MediaItemFailed;
检索媒体元数据
根据平台,媒体项的元数据可能来自文件中的 ID3 数据。
CrossMediaManager.Current.Queue.Current.Title;
CrossMediaManager.Current.Queue.Current.AlbumArt;
CrossMediaManager.Current.Queue.Current.*
由于元数据可能无法立即提供,因此您可以通过像这样订阅更新
var mediaItem = await CrossMediaManager.Current.Play("https://ia800806.us.archive.org/15/items/Mp3Playlist_555/AaronNeville-CrazyLove.mp3");
mediaItem.MetadataUpdated += (sender, args) => {
var title = args.MediaItem.Title;
};
或者,您也可以使用 PropertyChanged
事件来查看元数据的更新。
您也可以从视频中获取单个帧
string url = "https://something.com/something.mov";
var mediaItem = await CrossMediaManager.Current.Extractor.CreateMediaItem(url);
var image = await CrossMediaManager.Current.Extractor.GetVideoFrame(mediaItem, TimeSpan.FromSeconds(1));
ImageSource imageSource = image.ToImageSource();
FormsImage.Source = imageSource;
向 UI 添加视频播放器
视频视图将自动附加到播放器。如果您有多个视频视图并想自己连接它们,请执行以下操作
CrossMediaManager.Current.MediaPlayer.AutoAttachVideoView = false;
然后您可以按照如下方式手动添加视频视图
对于 Android,我们需要在 axml 布局中有一个 VideoView
。
<mediamanager.platforms.android.video.VideoView
android:id="@+id/your_videoview"
android:layout_width="match_parent"
android:layout_height="300dp" />
然后在代码中找到视图
playerView = view.FindViewById<VideoView>(Resource.Id.your_videoview);
对于 iOS、MacOS 或 tvOS,我们需要在代码中或者在 Xib 或 Storyboard 中添加一个 VideoView
。
var playerView = new VideoView();
View.AddSubview(playerView);
然后对于所有平台,我们必须将播放器视图添加到 MediaPlayer
。
CrossMediaManager.Current.MediaPlayer.VideoView = playerView;
播放非标准格式,如 HLS、Dash 或 SS
MediaManager 会尝试猜测使用的媒体类型或格式。有时这可能无法识别或识别错误,但您可以通过自己设置它来强制执行它,如下所示
var item = await CrossMediaManager.Current.Extractor.CreateMediaItem("https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/bipbop_16x9_variant.m3u8");
item.MediaType = MediaType.Hls;
await CrossMediaManager.Current.Play(item);
通过强制执行,仍然不能保证原生系统实际上能够播放该项。
平台特定功能
功能 | Android | iOS、Mac、tvOS | UWP | Tizen | WPF |
---|---|---|---|---|---|
音频 | ✓ | ✓ | ✓ | ✓ | ✓ |
视频 | ✓ | ✓ | ✓ | ✓ | ✓ |
队列 | ✓ | ✓ | ✓ | ✓ | ✓ |
通知 | ✓ | ✓ | ✓ | ✓ | ✓ |
音量 | ✓ | ✓ | ✓ | ✓ | ✓ |
媒体提取 | ✓ | ✓ | ✓ | ✓ | ✓ |
HLS | ✓ | ✓ | |||
DASH | ✓ | ||||
SmoothStreaming | ✓ | ||||
ChromeCast | ✓ | ||||
AirPlay | ✓ | ||||
Xamarin.Forms | ✓ | ✓ | ✓ | ✓ |
如果您需要,也可以直接访问原生平台的实现!
//Android
CrossMediaManager.Android.*
//iOS, MacOS or tvOS
CrossMediaManager.Apple.*
//UWP
CrossMediaManager.Windows.*
//Tizen
CrossMediaManager.Tizen.*
//WPF
CrossMediaManager.Wpf.*
Xamarin.Forms
将VideoView
添加到表单页面中非常简单,就像这样
<mm:VideoView VerticalOptions="FillAndExpand" Source="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" />
您的Xamarin.Forms页面可能看起来是这样的
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:mm="clr-namespace:MediaManager.Forms;assembly=MediaManager.Forms"
x:Class="YourClassName" >
<ContentPage.Content>
<StackLayout>
<mm:VideoView VerticalOptions="FillAndExpand" Source="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" ShowControls="False" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
您甚至可以使用正常的Play(object)
方法而不设置源。当您导航到包含VideoView
的视图时,播放器将自动附加到视图。
如果您想打开包含播放器的页面,可以打开VideoPage
。
Navigation.PushAsync(new MediaManager.Forms.VideoPage());
响应式扩展
将响应式NuGet包添加到您想使用的所有项目中。
使用说明
CrossMediaManager.Current.Reactive().*
Android上的FFmpegMediaMetadataRetriever
如果您想在Android上使用FFmpegMediaMetadataRetriever提取元数据,可以设置如下使用此扩展
CrossMediaManager.Android.Extractor = new FFmpegMediaExtractor();
拦截来自原生平台或其他应用的分享请求
Android
//Add code to the OnCreate(Bundle savedInstanceState) of your MainActivity
if(await CrossMediaManager.Android.PlayFromIntent(Intent))
{
//If true maybe do an action like opening a Player Page.
}
重要
Android
- 此库将自动请求以下权限:
AccessWifiState
、AccessNetworkState
、Internet
、ForegroundService
和WakeLock
。您不需要将它们添加到您的AndroidManifest中。 - 您的应用程序必须针对Android SDK v28或更高版本
- 此库使用ExoPlayer进行视频播放。这需要您启用以下
- Dex工具到D8:
<AndroidDexTool>d8</AndroidDexTool>
- 可选启用R8链接器以使代码更小:
<AndroidLinkTool>r8</AndroidLinkTool>
- Aapt2构建工具:
<AndroidUseAapt2>true</AndroidUseAapt2>
- 当使用D8和R8与AAPT2时禁用多DEX。您的代码应该足够小,可以做到这一点。
iOS
- 为了让音频在后台继续播放,您必须在Info.plist中添加'音频、AirPlay和画中画后台模式'以及'后台获取'
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>fetch</string>
</array>
- 如果您从http资源播放音频,您必须处理ATS。可选地,您可以为播放媒体而禁用此功能。将以下内容添加到您的Info.plist中
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoadsInMedia</key>
<true/>
</dict>
如果您想禁用更多内容,可以添加:NSAllowsLocalNetworking
或甚至NSAllowsArbitraryLoads
以禁用所有检查。
- 如果您想显示嵌入到MP3文件中的艺术品/封面,请确保您使用ID3 v2.3(而非v2.4)。
UWP
- 在Package.appxmanifest中的功能选项下需要选择:"后台媒体播放"、"Internet"。
- 如果也使用该功能,可选地添加"音乐库"和"视频库"。
Tizen
- 您必须请求
http://tizen.org/privilege/internet
、http://tizen.org/privilege/mediastorage
和http://tizen.org/privilege/externalstorage
权限
构建源代码
- 在Windows上,您需要安装最新Xamarin、.NET Core、UWP和Windows 10 SDK的Visual Studio 2019。
- 在Visual Studio for Mac 2019中不支持多-target。因此,您需要在Mac上通过命令行进行编译。简单地转到源代码所在的文件夹,并运行:
msbuild MediaManager.sln /t:rebuild
以生成发布版本,运行:msbuild MediaManager.sln /t:rebuild /p:Configuration=Release
。要恢复NuGet包,请运行:msbuild MediaManager.sln /t:restore
。
产品 | 版本 兼容和额外的计算目标框架版本。 |
---|---|
.NET | net7.0 兼容。 net7.0-android 已计算。 net7.0-android33.0 兼容。 net7.0-ios 已计算。 net7.0-ios16.1 兼容。 net7.0-maccatalyst 已计算。 net7.0-maccatalyst16.1 兼容。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net7.0-windows10.0.19041 兼容。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
-
net7.0
- Plugin.MediaManager (>= 1.2.2)
-
net7.0-android33.0
- Plugin.MediaManager (>= 1.2.2)
-
net7.0-ios16.1
- Plugin.MediaManager (>= 1.2.2)
-
net7.0-maccatalyst16.1
- Plugin.MediaManager (>= 1.2.2)
-
net7.0-windows10.0.19041
- Microsoft.Windows.SDK.BuildTools (>= 10.0.22621.755)
- Microsoft.WindowsAppSDK (>= 1.2.221209.1)
- Plugin.MediaManager (>= 1.2.2)
NuGet 包 (2)
显示依赖 Plugin.MediaManager.Forms 的前两个 NuGet 包
包 | 下载 |
---|---|
Fabulous.XamarinForms.VideoManager
Fabulous 的 VideoManager 扩展 |
|
Versl.Core
为 Versl 核心框架提供服务。 |
GitHub 仓库 (3)
显示依赖 Plugin.MediaManager.Forms 的前三个流行 GitHub 仓库
仓库 | 星标 |
---|---|
o1298098/Xamarin-CloudMusic
Xamarin.Forms 美观 UI 示例
|
|
UdaraAlwis/Xamarin-Playground
我使用 Xamarin 随便玩的一些有趣的东西。。。 :3 其中一些有趣的项目我在我的博客上展示了,包括一步一步的解释。 :) 不要忘了去看看。访问:theconfuzedsourcecode.wordpress.com
|
|
Baseflow/Chameleon
Chameleon 是一个灵活的多媒体播放器,它使用 Xamarin.Forms 构建
|
版本 | 下载 | 最后更新 |
---|---|---|
1.2.2 | 4,809 | 3/3/2023 |
1.2.1 | 844 | 2/8/2023 |
1.2.0 | 1,139 | 1/12/2023 |
1.1.1 | 88,463 | 5/6/2022 |
1.1.0 | 19,242 | 1/31/2022 |
1.0.9 | 74,919 | 6/9/2021 |
1.0.8 | 46,091 | 1/6/2021 |
1.0.7 | 3,135 | 12/15/2020 |
1.0.6 | 1,142 | 12/8/2020 |
1.0.5 | 645 | 12/8/2020 |
1.0.4 | 7,064 | 10/21/2020 |
1.0.3 | 42,673 | 9/4/2020 |
1.0.1 | 2,187 | 8/20/2020 |
1.0.0 | 4,048 | 8/13/2020 |
0.9.9 | 1,116 | 8/11/2020 |
0.9.8-alpha2 | 796 | 4/24/2020 |
0.9.7 | 23,643 | 3/4/2020 |
0.9.6 | 30,937 | 1/13/2020 |
0.9.5 | 2,032 | 1/10/2020 |
0.9.4 | 916 | 1/9/2020 |
0.9.3 | 781 | 1/8/2020 |
0.9.2 | 752 | 1/8/2020 |
0.9.1 | 4,390 | 12/12/2019 |
0.9.0 | 7,180 | 12/12/2019 |
0.8.18 | 9,904 | 10/21/2019 |
0.8.17 | 1,204 | 10/17/2019 |
0.8.16 | 1,137 | 10/15/2019 |
0.8.15 | 849 | 10/14/2019 |
0.8.14 | 623 | 10/14/2019 |
0.8.13 | 670 | 10/14/2019 |
0.8.12 | 1,184 | 10/8/2019 |
0.8.11 | 2,196 | 9/26/2019 |
0.8.10 | 766 | 9/25/2019 |
0.8.9 | 2,213 | 9/9/2019 |
0.8.8 | 1,019 | 9/3/2019 |
0.8.7 | 3,771 | 8/13/2019 |
0.8.6 | 1,096 | 8/9/2019 |
0.8.5 | 896 | 8/6/2019 |
0.8.4 | 652 | 8/6/2019 |
0.8.3 | 827 | 8/4/2019 |
0.8.2 | 661 | 8/4/2019 |
0.8.1 | 652 | 8/4/2019 |
0.8.0 | 865 | 8/2/2019 |
0.7.9 | 867 | 8/1/2019 |
0.7.8 | 715 | 7/31/2019 |
0.7.7 | 1,092 | 7/27/2019 |
0.7.6 | 667 | 7/26/2019 |
0.7.5 | 708 | 7/26/2019 |
0.7.4 | 821 | 7/23/2019 |
0.7.3 | 2,040 | 7/16/2019 |
0.7.2 | 1,686 | 7/9/2019 |
0.7.1 | 814 | 7/4/2019 |
0.7.0 | 891 | 7/3/2019 |
0.6.9 | 854 | 7/2/2019 |
0.6.8 | 720 | 7/1/2019 |
0.6.7 | 2,360 | 6/7/2019 |
0.6.6 | 751 | 6/7/2019 |
0.6.5 | 834 | 6/6/2019 |
0.6.4 | 765 | 6/6/2019 |
0.6.3 | 914 | 6/3/2019 |
0.6.2 | 3,735 | 5/28/2019 |
0.6.1 | 962 | 5/23/2019 |
0.6.0 | 1,224 | 5/20/2019 |
0.5.9 | 821 | 5/19/2019 |
0.5.8 | 2,310 | 5/17/2019 |
0.5.7 | 727 | 5/16/2019 |
0.5.6 | 768 | 5/15/2019 |
0.5.5 | 2,039 | 5/2/2019 |
0.5.4 | 971 | 4/26/2019 |
0.5.3 | 1,365 | 4/15/2019 |
0.5.2 | 734 | 4/15/2019 |
0.5.1 | 783 | 4/13/2019 |
0.5.0 | 1,090 | 4/12/2019 |
0.4.5 | 51,019 | 10/10/2017 |
0.4.3 | 5,730 | 7/28/2017 |
0.4.1 | 1,505 | 7/25/2017 |
0.4.0 | 13,844 | 3/17/2017 |
0.3.0 | 11,396 | 2/21/2017 |
0.1.2 | 1,319 | 12/26/2016 |
0.1.1 | 1,150 | 12/1/2016 |
0.1.0 | 1,281 | 11/16/2016 |
0.1.0-beta3 | 921 | 11/6/2016 |
0.1.0-beta2 | 799 | 10/31/2016 |