首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在UISlider上使用MpMoviePlayerController在iOS中显示缓冲数据?

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

Stack Overflow用户
提问于 2014-12-17 09:53:34
回答 3查看 5.3K关注 0票数 12

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

我想在滑块中显示缓冲区数据,比如红色部分。我试过用谷歌搜索它。但我没有找到任何解决办法。以及如何使滑块定制?提前谢谢..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-01 07:15:48

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

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

步骤1(First )I使用标准控件.

在Interface中,将您的UISlider立即放在您的UIProgressView之上,并使其大小相同。

在UISlider上,背景水平线被称为轨道,诀窍是让它看不见。我们使用透明的PNG和UISlider方法setMinimumTrackImage:forState和setMaximumTrackImage:forState:。

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

代码语言:javascript
复制
[ProgressSlider setMinimumTrackImage:minImage forState:UIControlStateNormal];

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

其中ProgressSlider指的是UISlider,progressBar指的是UIProgressView。

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

代码语言:javascript
复制
 UIGraphicsBeginImageContextWithOptions((CGSize){512,5}, NO, 0.0f);
    UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();

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

参考摘自本答案https://stackoverflow.com/a/4570100/3933302

步骤2:

现在,我尝试设置UIProgressView的跟踪和进度图像。但它并没有显示轨迹和进度图像。然后我发现这个solution...to使用github中的这个库。https://gist.github.com/JohnEstropia/9482567

现在,我将UIProgressView的出现改为了JEProgressView,包括在NIB和故事板中出现的事件。

基本上,您需要强制将图像直接分配给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:

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

使用MPMovieLoadStatePlayable,我们可以得到缓冲区有足够的数据可以开始回放,但它可能会在播放结束之前耗尽数据。

编号/c/tdef/MPMovieLoadState

在您的PlayAudio method...place中,这段代码..。

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

以下是loadStateChange的定义

代码语言:javascript
复制
-(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的定义

代码语言:javascript
复制
- (void)updateProgressUI{
    if(self.moviePlayer.duration == self.moviePlayer.playableDuration){
        // all done
        [slideTimer invalidate];
    }
    progressBar.progress = self.moviePlayer.playableDuration/self.moviePlayer.duration ;

}

我希望这个完全定制的滑块能帮助你制作定制播放器.我在steps.....Thanks中解释了我所有的工作.

票数 11
EN

Stack Overflow用户

发布于 2014-12-17 12:18:59

你不能用MPMoviePlayerController来做这件事。

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

就这一问题提出了若干问题,例如:

AVPlayer流进程

票数 4
EN

Stack Overflow用户

发布于 2014-12-19 16:28:59

根据MPMoviePlayerController (可用这里)的文档,您可以使用playableDuration属性检索播放机加载的持续时间。

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

至于AVPlayer,您可以在表示内容的AVPlayerItem上调用loadedTimeRanges (文档这里)。这将为您提供一个(截至iOS 8)的数组,其中一个表示已缓冲的媒体部分的单个CMTimeRange。我建议在检索时间范围时使用[NSArray firstObject]来保护代码免受可能为空的数组的攻击。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27522740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档