是的,我们可以通过 playableDuration 使用 MPMoviePlayerController 显示流数据。我正在解释为我的 customize player 制作这个 custom_slider 所涉及的所有这些步骤...
(如果只对编程部分感兴趣,可以直接阅读第四步)
这些是步骤:
第 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];
ProgressSlider 指的是您的 UISlider,progressBar 指的是您的 UIProgressView。
您可以像这样以编程方式制作透明图像。
UIGraphicsBeginImageContextWithOptions((CGSize){512,5}, NO, 0.0f);
UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
您可以根据进度视图轨道图像高度宽度更改它的大小...我使用 {512,5} 您可以使用 {1,1} 作为默认滑块和进度视图。
参考来自这个答案https://stackoverflow.com/a/4570100/3933302
第 2 步:
现在我尝试设置 UIProgressView 的轨迹和进度图像。但它没有显示轨迹和进度图像。然后我找到了这个解决方案......使用github中提供的这个库。 https://gist.github.com/JohnEstropia/9482567
现在我将 UIProgressView 的出现更改为 JEProgressView,包括 NIB 和情节提要中的出现。
基本上,您需要强制将图像直接分配给 UIProgressView 的子 UIImageView。
需要子类覆盖layoutSubviews,根据图片大小调整imageViews的高度。
参考来自这个答案https://stackoverflow.com/a/22322367/3933302
第 3 步:
但现在的问题是,您将从哪个制作滑块和进度视图的图像。本教程对此进行了说明,您也可以下载 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];
..........
}
这里是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 ;
}
我希望这个完全自定义的滑块能帮助您制作自定义播放器...我逐步解释了我的所有工作......谢谢......