Plugin.MediaManager 1.2.2

需要 NuGet 2.14 或更高版本。

dotnet add package Plugin.MediaManager --version 1.2.2                
NuGet\Install-Package Plugin.MediaManager -Version 1.2.2                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Plugin.MediaManager" Version="1.2.2" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件以引用软件包。
paket add Plugin.MediaManager --version 1.2.2                
#r "nuget: Plugin.MediaManager, 1.2.2"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将此复制到交互式工具或脚本的源代码中,以引用软件包。
// Install Plugin.MediaManager as a Cake Addin
#addin nuget:?package=Plugin.MediaManager&version=1.2.2

// Install Plugin.MediaManager as a Cake Tool
#tool nuget:?package=Plugin.MediaManager&version=1.2.2                

MediaManager - 用于 Xamarin 和 Windows 的跨平台媒体插件

  • 设计简单、易于使用
  • 从远程 http(s)、嵌入式和本地源播放媒体文件的原生回放
  • 原生媒体通知和远程控制
  • 默认队列和播放管理
  • 播放状态(播放、缓冲、加载、暂停、进度)
  • 用于媒体处理的挂钩事件

状态

Build status GitHub tag NuGet MyGet

支持

  • 请随意提交问题。请确保使用模板之一!
  • 提供商业支持。与您的应用程序或服务集成、示例、功能请求等。电子邮件: [email protected]
  • 由: baseflow.com

Wiki

更多文档和信息可在 Wiki 上找到

博客

安装

NuGet 软件包 添加到您想使用的所有项目中。

  • 在 Visual Studio 中 - 工具 > NuGet 包管理器 > 管理解决方案中的包
  • 选择浏览选项卡,搜索 MediaManager
  • 选择 Plugin.MediaManager
  • 将它们安装到解决方案中的每个项目中

平台支持

平台 支持 版本 播放器
Net标准版 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。在大多数情况下,您可能希望将 ActivityLaunchMode 设置为 SingleTop。这将使您的应用在点击时返回到焦点。您可以在这里了解更多信息:更多信息

[Activity(LaunchMode = LaunchMode.SingleTop)]
public class MainActivity : AppCompatActivity

如果您想处理通过点击通知打开应用的情况,您可以在您的 activity 中重写 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);
  • 例如,可以通过使用 FileDirectory api 来从 File 播放。您可以使用这些 .NET api 从互联网下载文件并将它保存在某处。
  • 当从 Assembly 播放时,您需要将媒体文件添加到 assembly 并将构建动作设置为 Embedded resource
  • 当从 Resource 播放时,您应该在 Android 上将您的媒体文件添加到 Assetsraw 文件夹,在 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

  • 此库将自动请求以下权限:AccessWifiStateAccessNetworkStateInternetForegroundServiceWakeLock。您无需将其添加到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中的功能下,您需要选择:“后台媒体播放”、“互联网”
  • 如有必要,添加“音乐库”和“视频库”

Tizen

  • 您必须请求http://tizen.org/privilege/internethttp://tizen.org/privilege/mediastoragehttp://tizen.org/privilege/externalstorage权限

构建源代码

  • 在Windows上,您需要安装了最新Xamarin、.NET Core、UWP和Windows 10 SDK的Visual Studio 2019。
  • 在Visual Studio for Mac 2019中,不支持多目标。因此,您需要在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 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解更多关于目标框架.NET Standard的信息。

NuGet 包 (7)

显示依赖于 Plugin.MediaManager 的前 5 个 NuGet 包

下载
Plugin.MediaManager.Forms

支持跨平台的 .NET 插件,用于播放和控制音频和视频。这添加了 .NET MAUI / Xamarin.Forms 特定的功能

Plugin.MediaManager.Reactive

MediaManager 的响应式扩展

Plugin.MediaManager.ExoPlayer

ExoPlayer 支持更高级的视频和音频播放。这是基于 MediaManager 插件

Plugin.MediaManager.AzureMediaServices

支持跨平台的 .NET 插件,用于播放和控制音频和视频

Plugin.MediaManager.FFmpegMediaMetadataRetriever

支持跨平台的 .NET 插件,用于播放和控制音频和视频

GitHub 存储库

此包未被任何流行的 GitHub 存储库使用。

版本 下载 最后更新
1.2.2 33,082 3/3/2023
1.2.1 1,318 2/8/2023
1.2.0 1,620 1/12/2023
1.1.1 116,517 5/6/2022
1.1.0 23,181 1/31/2022
1.0.9 83,428 6/9/2021
1.0.8 86,167 1/6/2021
1.0.7 4,730 12/15/2020
1.0.6 6,986 12/8/2020
1.0.5 1,364 12/8/2020
1.0.4 11,580 10/21/2020
1.0.3 47,222 9/4/2020
1.0.1 3,439 8/20/2020
1.0.0 5,693 8/13/2020
0.9.9 3,231 8/11/2020
0.9.8-alpha3 1,886 4/30/2020
0.9.8-alpha2 1,295 4/24/2020
0.9.8-alpha1 947 4/22/2020
0.9.7 35,072 3/4/2020
0.9.6 48,164 1/13/2020
0.9.5 3,189 1/10/2020
0.9.4 1,842 1/9/2020
0.9.3 1,518 1/8/2020
0.9.2 1,689 1/8/2020
0.9.1 6,488 12/12/2019
0.9.0 8,284 12/12/2019
0.8.18 20,631 10/21/2019
0.8.17 3,556 10/17/2019
0.8.16 1,863 10/15/2019
0.8.15 1,542 10/14/2019
0.8.14 1,677 10/14/2019
0.8.13 1,365 10/14/2019
0.8.12 2,483 10/8/2019
0.8.11 3,056 9/26/2019
0.8.10 1,691 9/25/2019
0.8.9 3,517 9/9/2019
0.8.8 1,901 9/3/2019
0.8.7 4,803 8/13/2019
0.8.6 2,157 8/9/2019
0.8.5 1,718 8/6/2019
0.8.4 1,716 8/6/2019
0.8.3 1,580 8/4/2019
0.8.2 1,392 8/4/2019
0.8.1 1,352 8/4/2019
0.8.0 1,633 8/2/2019
0.7.9 3,007 8/1/2019
0.7.8 1,463 7/31/2019
0.7.7 2,531 7/27/2019
0.7.6 1,367 7/26/2019
0.7.5 1,423 7/26/2019
0.7.4 1,587 7/23/2019
0.7.3 2,729 7/16/2019
0.7.2 2,507 7/9/2019
0.7.1 1,588 7/4/2019
0.7.0 1,677 7/3/2019
0.6.9 4,140 7/2/2019
0.6.8 1,690 7/1/2019
0.6.7 4,818 6/7/2019
0.6.6 1,495 6/7/2019
0.6.5 1,755 6/6/2019
0.6.4 1,522 6/6/2019
0.6.3 1,753 6/3/2019
0.6.2 4,801 5/28/2019
0.6.1 1,752 5/23/2019
0.6.0 2,192 5/20/2019
0.5.9 1,567 5/19/2019
0.5.8 3,003 5/17/2019
0.5.7 1,444 5/16/2019
0.5.6 1,567 5/15/2019
0.5.5 2,900 5/2/2019
0.5.4 1,783 4/26/2019
0.5.3 2,803 4/15/2019
0.5.2 12,843 4/15/2019
0.5.1 1,576 4/13/2019
0.5.0 1,899 4/12/2019
0.4.5 75,238 10/10/2017
0.4.4 6,026 8/21/2017
0.4.3 7,401 7/28/2017
0.4.1 2,395 7/25/2017
0.4.0 24,575 3/17/2017
0.3.0 14,418 2/21/2017
0.1.3 2,087 12/28/2016
0.1.2 2,208 12/26/2016
0.1.1 2,068 11/30/2016
0.1.0 2,524 11/16/2016
0.1.0-beta3 1,568 11/6/2016
0.1.0-beta2 1,482 10/31/2016
0.1.0-beta1 1,299 10/30/2016
0.0.9 1,663 10/17/2016
0.0.8 1,589 10/13/2016
0.0.7 1,566 9/29/2016
0.0.6 1,806 9/26/2016
0.0.5 2,105 9/20/2016
0.0.4 1,868 9/7/2016
0.0.3 1,861 8/25/2016
0.0.1 1,886 8/11/2016
0.0.0.1 2,119 9/27/2016