我有一个 Xamarin iOS 应用程序,我想从支持 HTTP 范围请求的 API 端点流式传输视频。我已经在这里查看了许多类似的问题,但无论我尝试什么,我似乎都无法让 AVPlayer 在完全下载之前开始播放视频文件。
我试过了:
- KVO on
playbackLikelyToKeepUp
, playbackBufferEmpty
and playbackBufferEmpty
尽快播放视频ReadyToPlay
- set
AutomaticallyWaitsToMinimizeStalling
= 在 AVPlayer 上为 false
- set
CanUseNetworkResourcesForLiveStreamingWhilePaused
= 正确,并且PreferredForwardBufferDuration
AVPlayerItem 上 = 1
- called
PlayImmediatelyAtRate(1)
在 AVPlayer 上
但文件仍然在视频开始播放之前完全下载,这会导致用户延迟。
是否可以让 AVPlayer 在完成下载之前开始播放视频文件,类似于 HTML 视频标签的做法?
这是我当前的代码:
private void SetUpPlayer()
{
if (ViewModel.VideoStreamUrl == null)
{
return;
}
// See https://stackoverflow.com/questions/38865797/how-to-play-video-with-avplayerviewcontroller-avkit-in-xamarin-ios
_aVPlayerItem = new AVPlayerItem(ViewModel.VideoStreamUrl)
{
CanUseNetworkResourcesForLiveStreamingWhilePaused = true,
PreferredForwardBufferDuration = 1,
};
// See https://stackoverflow.com/questions/38867190/how-can-i-check-if-my-avplayer-is-buffering/38867386#38867386
_playbackLikelyToKeepUpObserver?.Dispose();
_playbackLikelyToKeepUpObserver = (NSObject)_aVPlayerItem.AddObserver("playbackLikelyToKeepUp",
NSKeyValueObservingOptions.New,
AVPlayerItem_BufferUpdated);
_playbackBufferEmptyObserver?.Dispose();
_playbackBufferEmptyObserver = (NSObject)_aVPlayerItem.AddObserver("playbackBufferEmpty",
NSKeyValueObservingOptions.New,
AVPlayerItem_BufferUpdated);
_playbackBufferFullObserver?.Dispose();
_playbackBufferFullObserver = (NSObject)_aVPlayerItem.AddObserver("playbackBufferFull",
NSKeyValueObservingOptions.New,
AVPlayerItem_BufferUpdated);
_aVPlayer = new AVPlayer(_aVPlayerItem)
{
AutomaticallyWaitsToMinimizeStalling = false,
};
var playerViewController = new AVPlayerViewController
{
Player = _aVPlayer,
};
AddChildViewController(playerViewController);
View.AddSubview(playerViewController.View);
playerViewController.View.Frame = View.Frame;
playerViewController.ShowsPlaybackControls = true;
_aVPlayer.PlayImmediatelyAtRate(1);
}
private void AVPlayerItem_BufferUpdated(NSObservedChange obj)
{
ReportVideoBuffering();
}
private void ReportVideoBuffering()
{
bool isBufferEmpty = _aVPlayerItem != null && _aVPlayerItem.PlaybackBufferEmpty;
Console.WriteLine($"Buffer empty? {isBufferEmpty}");
Console.WriteLine($"Player status? {_aVPlayer.Status}");
if (_aVPlayer.Status == AVPlayerStatus.ReadyToPlay)
{
Console.WriteLine($"Playing video.");
_aVPlayer.Play();
}
}
这个问题的简单答案是否定的,AVPlayer 不支持使用 http 范围请求和部分内容 (206) 响应的流式传输。在我们的例子中,我们决定使用 Azure 媒体服务来提供流端点,然后我们可以在 iPad 应用程序以及 Web 上使用该端点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)