如何在iOS中使用MpMoviePlayerController在UISlider上显示缓冲数据?

我正在使用MPMoviePlayerController来播放audio,我想显示像这样的滑块缓冲数据…

在这里输入图像说明

我想在滑块中显示像红色部分的缓冲区数据。 我试图谷歌它。 但我没有得到任何解决scheme。 以及如何使滑块自定义? 提前致谢…

是的我们可以通过playableDuration使用MPMoviePlayerController来显示stream数据。 我解释了所有这些步骤涉及到使我的自定义播放器的这个custom_slider

(如果您只对编程部分感兴趣,可以直接阅读第4步 )这些步骤是:

第1步 :( 第一个devise部分)我使用标准控件完成它…

在界面生成器中,将您的UISlider立即置于UIProgressView之上,并使其尺寸相同。

在UISlider上,背景水平线被称为轨道,诀窍是使其不可见。 我们用透明的PNG和UISlider方法setMinimumTrackImage:forState:和setMaximumTrackImage:forState:来做到这一点。

在视图控制器的viewDidLoad方法中添加:

 [ProgressSlider setMinimumTrackImage:minImage forState:UIControlStateNormal]; [ProgressSlider setMaximumTrackImage:transparentImage forState:UIControlStateNormal]; [progressBar setTrackImage:maxImage]; [progressBar setProgressImage:streamImage]; 

ProgressSlider将您的UISlider和progressBar引用到您的UIProgressView。

你可以像这样以编程方式制作透明图像。

  UIGraphicsBeginImageContextWithOptions((CGSize){512,5}, NO, 0.0f); UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

您可以根据您的进度视图轨道图像高度宽度更改其大小…我使用{512,5},可以使用{1,1}作为默认滑块和进度视图。

引用采取的forms这个答案https://stackoverflow.com/a/4570100/3933302

第2步:

现在我试图设置UIProgressView的轨道和进度图像。 但是这并没有显示出赛道和进度的形象。 然后我发现这个解决scheme…使用这个库在github中可用。 https://gist.github.com/JohnEstropia/9482567

现在我改变了UIProgressView到JEProgressView的出现,包括那些在NIBs和故事板。

基本上,你需要强制将图像直接分配给UIProgressView的子UIImageViews。

该子类是需要重写layoutSubviews,根据图像大小调整imageViews的高度。

引用来自这个答案https://stackoverflow.com/a/22322367/3933302

第3步

但现在的问题是,你将从哪个图像滑块和progressView。 这在本教程中进行了解释,您也可以下载psd。

http://www.raywenderlich.com/32167/photoshop-tutorial-for-developers-creating-a-custom-uislider

步骤4:

现在来编程的一部分 ..通过使用播放持续时间可以显示stream数据..(这是我最大的问题)

使用MPMovieLoadStatePlayable我们可以得到什么时候缓冲区有足够的数据可以开始播放,但在播放完成之前可能会用完数据。

https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerController_Class/index.html#//apple_ref/c/tdef/MPMovieLoadState

现在在您的PlayAudio方法…放置此代码..

 -(void) playAudio:(NSURL *) url { ............. streamTimer= [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(loadStateChange) userInfo:nil repeats:YES]; .......... } 

这里是loadStateChange的定义

 -(void)loadStateChange { if(self.moviePlayer.loadState == MPMovieLoadStatePlayable){ [self.moviePlayer play]; slideTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateProgressUI) userInfo:nil repeats:YES]; [streamTimer invalidate]; } else if(self.downloadList) //if you are playing local file then it will show track with full red color progressBar.progress= appDel.moviePlayerController.moviePlayer.duration; } 

这里是updateProgressUI的定义

 - (void)updateProgressUI{ if(self.moviePlayer.duration == self.moviePlayer.playableDuration){ // all done [slideTimer invalidate]; } progressBar.progress = self.moviePlayer.playableDuration/self.moviePlayer.duration ; } 

我希望这个完全自定义的滑块将帮助你制作自定义的球员…我解释了我所有的工作步骤…..谢谢….

你不能用MPMoviePlayerController来做到这MPMoviePlayerController

但是,如果你切换到AVPlayer那么你可以使用AVPlayerItem.loadedTimeRanges 。 它包含您在自定义控件中进行可视化所需的所有信息。

有关该主题的问题有很多,例如:

AVPlayerstream媒体进展

根据MPMoviePlayerController的文档( 这里可用),你可以使用playableDuration属性来检索玩家已经加载的持续时间。

然后,您必须UISlider子类,以在drawRect:方法中绘制控件的红色部分。

至于AVPlayer你可以在代表你的内容的AVPlayerItem上调用loadedTimeRanges (文档在这里 )。 这会给你一个数组(从iOS 8开始)一个单一的CMTimeRange代表已经被缓冲的媒体部分。 我会build议使用[NSArray firstObject]时检索时间范围,以保护您的代码可能是空的数组。