Xamarin IOS CrossMediaManager 后台视频播放
Xamarin IOS CrossMediaManager Background video playing
我正在使用来自 https://github.com/Baseflow/XamarinMediaManager ,it works perfectly fine. I want audio to be continued played when the app goes in background or screen is locked, that can be achieved using the method given in this link https://developer.apple.com/documentation/avfoundation/media_playback_and_selection/creating_a_basic_video_player_ios_and_tvos/playing_audio_from_a_video_asset_in_the_background
的 videoview
所以我跟着它,你可以看到我的代码。我正在获取当前的 PlayerViewController 和 AVPlayer 并按照给定 class.
中的方式连接和断开它们
public class LockedScreenManager
{
public AVQueuePlayer CurrentAVPlayer { get; set; }
public AVPlayerViewController CurrentAVPlayerController { get; set; }
public LockedScreenManager()
{
UIApplication.SharedApplication.BeginReceivingRemoteControlEvents();
CrossMediaManager.Current.PositionChanged += PositionChanged;
var audioSession = AVAudioSession.SharedInstance();
audioSession.SetCategory(AVAudioSessionCategory.Playback);
}
public void Connect()
{
CurrentAVPlayerController.Player = CurrentAVPlayer;
}
public void DisConnect()
{
CurrentAVPlayer = null;
}
private void PositionChanged(object sender, MediaManager.Playback.PositionChangedEventArgs e)
{
var apple = CrossMediaManager.Apple;
var _IosMediaPlayer = apple.AppleMediaPlayer as MediaManager.Platforms.Ios.Player.IosMediaPlayer;
CurrentAVPlayer = _IosMediaPlayer.Player;
CurrentAVPlayerController = _IosMediaPlayer.PlayerView.PlayerViewController;
var mediaItem = CrossMediaManager.Current.Queue.Current;
if (mediaItem == null)
{
MPNowPlayingInfoCenter.DefaultCenter.NowPlaying = null;
return;
}
var nowPlayingInfo = new MPNowPlayingInfo
{
Title = mediaItem.Title,
AlbumTitle = mediaItem.Album,
AlbumTrackNumber = mediaItem.TrackNumber,
AlbumTrackCount = mediaItem.NumTracks,
Artist = mediaItem.DisplaySubtitle,
Composer = mediaItem.Composer,
DiscNumber = mediaItem.DiscNumber,
Genre = mediaItem.Genre,
ElapsedPlaybackTime = CrossMediaManager.Current.Position.TotalSeconds,
PlaybackDuration = CrossMediaManager.Current.Duration.TotalSeconds,
PlaybackQueueIndex = CrossMediaManager.Current.Queue.CurrentIndex,
PlaybackQueueCount = CrossMediaManager.Current.Queue.Count,
IsLiveStream = mediaItem.IsLive
};
MPNowPlayingInfoCenter.DefaultCenter.NowPlaying = nowPlayingInfo;
}
}
在我的 AppDelege Class 中,我创建了 this class 的实例并按照代码中给出的方式使用它。
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
//
// This method is invoked when the application has loaded and is ready to run. In this
// method you should instantiate the window, load the UI into it and then make the window
// visible.
//
// You have 17 seconds to return from this method, or iOS will terminate your application.
LockedScreenManager lockedScreenManager;
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
lockedScreenManager= new LockedScreenManager();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
public override void WillEnterForeground(UIApplication uiApplication)
{
lockedScreenManager.Connect();
base.WillEnterForeground(uiApplication);
}
public override void DidEnterBackground(UIApplication uiApplication)
{
lockedScreenManager.DisConnect();
base.DidEnterBackground(uiApplication);
}
}
我在info.plist里设置了所有的后台播放,但是还是不行。当应用程序在后台消失时,它会停止。帮助解决这个问题将不胜感激。
谢谢
在 DisConnect
方法中进入后台时,您的代码中似乎存在解除分配 CurrentAVPlayer
的错误,应该是:
public void DisConnect()
{
CurrentAVPlayerController.Player = null;
}
我正在使用来自 https://github.com/Baseflow/XamarinMediaManager ,it works perfectly fine. I want audio to be continued played when the app goes in background or screen is locked, that can be achieved using the method given in this link https://developer.apple.com/documentation/avfoundation/media_playback_and_selection/creating_a_basic_video_player_ios_and_tvos/playing_audio_from_a_video_asset_in_the_background
的 videoview所以我跟着它,你可以看到我的代码。我正在获取当前的 PlayerViewController 和 AVPlayer 并按照给定 class.
中的方式连接和断开它们public class LockedScreenManager
{
public AVQueuePlayer CurrentAVPlayer { get; set; }
public AVPlayerViewController CurrentAVPlayerController { get; set; }
public LockedScreenManager()
{
UIApplication.SharedApplication.BeginReceivingRemoteControlEvents();
CrossMediaManager.Current.PositionChanged += PositionChanged;
var audioSession = AVAudioSession.SharedInstance();
audioSession.SetCategory(AVAudioSessionCategory.Playback);
}
public void Connect()
{
CurrentAVPlayerController.Player = CurrentAVPlayer;
}
public void DisConnect()
{
CurrentAVPlayer = null;
}
private void PositionChanged(object sender, MediaManager.Playback.PositionChangedEventArgs e)
{
var apple = CrossMediaManager.Apple;
var _IosMediaPlayer = apple.AppleMediaPlayer as MediaManager.Platforms.Ios.Player.IosMediaPlayer;
CurrentAVPlayer = _IosMediaPlayer.Player;
CurrentAVPlayerController = _IosMediaPlayer.PlayerView.PlayerViewController;
var mediaItem = CrossMediaManager.Current.Queue.Current;
if (mediaItem == null)
{
MPNowPlayingInfoCenter.DefaultCenter.NowPlaying = null;
return;
}
var nowPlayingInfo = new MPNowPlayingInfo
{
Title = mediaItem.Title,
AlbumTitle = mediaItem.Album,
AlbumTrackNumber = mediaItem.TrackNumber,
AlbumTrackCount = mediaItem.NumTracks,
Artist = mediaItem.DisplaySubtitle,
Composer = mediaItem.Composer,
DiscNumber = mediaItem.DiscNumber,
Genre = mediaItem.Genre,
ElapsedPlaybackTime = CrossMediaManager.Current.Position.TotalSeconds,
PlaybackDuration = CrossMediaManager.Current.Duration.TotalSeconds,
PlaybackQueueIndex = CrossMediaManager.Current.Queue.CurrentIndex,
PlaybackQueueCount = CrossMediaManager.Current.Queue.Count,
IsLiveStream = mediaItem.IsLive
};
MPNowPlayingInfoCenter.DefaultCenter.NowPlaying = nowPlayingInfo;
}
}
在我的 AppDelege Class 中,我创建了 this class 的实例并按照代码中给出的方式使用它。
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
//
// This method is invoked when the application has loaded and is ready to run. In this
// method you should instantiate the window, load the UI into it and then make the window
// visible.
//
// You have 17 seconds to return from this method, or iOS will terminate your application.
LockedScreenManager lockedScreenManager;
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
lockedScreenManager= new LockedScreenManager();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
public override void WillEnterForeground(UIApplication uiApplication)
{
lockedScreenManager.Connect();
base.WillEnterForeground(uiApplication);
}
public override void DidEnterBackground(UIApplication uiApplication)
{
lockedScreenManager.DisConnect();
base.DidEnterBackground(uiApplication);
}
}
我在info.plist里设置了所有的后台播放,但是还是不行。当应用程序在后台消失时,它会停止。帮助解决这个问题将不胜感激。
谢谢
在 DisConnect
方法中进入后台时,您的代码中似乎存在解除分配 CurrentAVPlayer
的错误,应该是:
public void DisConnect()
{
CurrentAVPlayerController.Player = null;
}