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

Sou*_*rma 12 iphone objective-c mpmovieplayercontroller mpmovieplayer ios

我正在使用MPMoviePlayerController播放音频,我想在这样的滑块上显示缓冲数据......

在此输入图像描述

我想在滑块中显示缓冲区数据,如红色部分.我试过去谷歌吧.但我没有得到任何解决方案.以及如何使滑块自定义?提前致谢...

Sou*_*rma 11

是的我们可以通过playableDuration使用MPMoviePlayerController显示流数据.我正在解释所有这些涉及我的步骤,为我的自定义播放器制作这个custom_slider ...

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

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

在Interface Builder中,将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];
Run Code Online (Sandbox Code Playgroud)

其中ProgressSlider将您的UISlider和progressBar引用到您的UIProgressView.

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

 UIGraphicsBeginImageContextWithOptions((CGSize){512,5}, NO, 0.0f);
    UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)

您可以根据进度视图跟踪图像高度宽度更改它的大小...我使用{512,5}您可以使用{1,1}作为默认滑块和进度视图.

从这个答案/sf/answers/319907031/获取参考

第2步:

现在我尝试设置UIProgressView的跟踪和进度图像.但它没有显示轨道和进度图像.然后我找到了这个解决方案......使用github中提供的这个库.https://gist.github.com/JohnEstropia/9482567

现在我将UIProgressView的出现更改为JEProgressView,包括NIB和故事板中的那些.

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

需要子类来覆盖layoutSubviews,您可以根据图像大小调整imageViews的高度.

参考本答案/sf/answers/1562565721/

第3步:

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

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

第4步:

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

使用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];
..........
}
Run Code Online (Sandbox Code Playgroud)

这是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;
}
Run Code Online (Sandbox Code Playgroud)

这是updateProgressUI的定义

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

}
Run Code Online (Sandbox Code Playgroud)

我希望这个完全自定义的滑块可以帮助你制作自定义播放器...我解释了我的所有工作步骤.....谢谢......