iOS音视频开发(二)AVAudioRecorder实现录音功能
iOS音视频开发(三)MediaPlayer播放本地和远程音频
iOS音视频开发(四)MediaPlayer播放本地和远程视频
iOS音视频开发(五)AVAudioPlayer/AVPlayer播放本地和远程音频
iOS音视频开发(六)AVPlayer播放本地和远程视频(本文)
iOS音视频开发(七)AudioToolbox音效播放
AVPlayer属于AVFoundation框架,使用前需要导入框架头文件。
AVPlayer 使用
开发过程中,单纯使用AVPlayer类无法显示视频。视频层必须添加到AVPlayerLayer中才能显示视频。
1.首先将在线视频链接存储在NSURL中,然后初始化AVPlayerItem对象。 AVPlayerItem是管理资源的对象。
2.然后监听AVPlayerItem的status和loadedTimeRange属性。 status 属性具有三种状态:
typedef NS_ENUM(NSInteger, AVPlayerItemStatus) {
AVPlayerItemStatus未知,
AVPlayerItemStatusReadyToPlay,
AVPlayerItemStatus失败
};
1、当AVPlayerItem的status等于AVPlayerStatusReadyToPlay时,表示视频可以播放了,我们就可以调用play方法来播放了。
2.loadedTimeRange属性表示缓冲的进度。监视此属性可以更新UI 中的缓冲进度。
3.addPeriodicTimeObserverForInterval
在AVPlayer中添加时间观察器可以帮助我们检测播放进度。
4、使用AVPlayer对象的seekToTime方法来控制视频播放进度。
下面是具体代码(Demo地址)。我先给大家截图看看完整的效果:
视频截图第一步:初始化播放器对象和播放器层。
- (void)initPlayer{
//创建玩家层
AVPlayerLayer*playerLayer=[AVPlayerLayer playerLayerWithPlayer:self.player];
playerLayer.frame=self.view.bounds;
[self.view.layer addSublayer:playerLayer];
}
//初始化播放器
-(AVPlayer*)播放器{
如果(!_player){
NSURL*url=[NSURL URLWithString:@"http://images.apple.com/media/cn/apple-events/2016/5102cb6c_73fd_4209_960a_6201fdb29e6e/keynote/apple-event-keynote-tft-cn-20160908_1536x640h.mp 4"];
AVPlayerItem*playerItem=[AVPlayerItem playerItemWithURL:url];
_player=[AVPlayerplayerWithPlayerItem:playerItem];
//通过KVO监控AVPlayerItem的status和loadedTimeRange属性
[自我addObserverToPlayerItem:playerItem];
//向播放器添加进度更新addPeriodicTimeObserverForInterval
[自我添加进度观察者];
//给AVPlayerItem添加播放完成通知
[自我添加通知];
}
返回玩家;
}
第二步:通过KVO监控AVPlayerItem的status和loadedTimeRange属性
-(void)addObserverToPlayerItem:(AVPlayerItem*)playerItem {
//监控状态属性。请注意,AVPlayer 还有一个状态属性。您还可以通过监控其状态来获取播放状态。
[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
//监控网络加载属性
[playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
}
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)对象更改:(NSDictionary*)更改上下文:(void*)上下文{
AVPlayerItem*playerItem=对象;
if([keyPath isEqualToString:@"status"]) {
AVPlayerStatus 状态=[[change objectForKey:@"new"]intValue];
如果(状态==AVPlayerStatusReadyToPlay){
NSLog(@"正在播放.视频总长度:%.2f",CMTimeGetSeconds(playerItem.duration));
}
} else if ([keyPath isEqualToString:@"loadedTimeRanges"]){
NSArray*array=playerItem.loadedTimeRanges;
CMTimeRange timeRange=[array.firstObjectCMTimeRangeValue];//这个缓冲时间范围
float startSeconds=CMTimeGetSeconds(timeRange.start);
浮动持续时间=CMTimeGetSeconds(timeRange.duration);
NSTimeIntervaltotalBuffer=startSeconds + 持续时间; //缓冲区总长度
NSLog(@"总缓冲区:%.2f",totalBuffer);
}
}
步骤3:向播放器添加进度更新addPeriodicTimeObserverForInterval
-(void)addProgressObserver{
AVPlayerItem*playerItem=self.player.currentItem;
UIProgressView*progress=self.progress;
//这里设置每秒执行一次
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0,1.0)queue:dispatch_get_main_queue()usingBlock:^(CMTimetime) {
浮点电流=CMTimeGetSeconds(时间);
float总计=CMTimeGetSeconds([玩家项目持续时间]);
NSLog(@"当前播放%.2fs.",current);
];
}
步骤4:为AVPlayerItem添加播放完成通知
- (void)addNotification {
[[NSNotificationCenter defaultCenter]addObserver:self
选择器:@选择器(playbackFinished:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:self.player.currentItem];
}
//播放完成通知
-(void)playbackFinished:(NSNotification*)通知{
NSLog(@"视频播放完成。");
}
第5 步:播放和暂停视频
[self.player play];//播放视频
[self.player暂停];//暂停视频
以上五个步骤就是播放视频的基本步骤。如果上面的代码让你头疼的话,你还可以下载文章中的代码,按照Demo效果一步步看这些方法(Demo中的代码比较复杂)。
注意:如果您将本文中的代码复制到您的新项目中,请记住将其添加到Info.plist
Info.plist截图让项目支持HTTP协议(因为文章中的演示视频是HTTP协议视频)
好了,文章到这里就结束啦,如果本次分享的深入iOS音视频开发:AVPlayer播放本地与远程视频教程(第六篇)和问题对您有所帮助,还望关注下本站哦!
【深入iOS音视频开发:AVPlayer播放本地与远程视频教程(第六篇)】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
哇,又更新了!一直在关注你的 iOS 学习内容,这期刚好是需要的。
有13位网友表示赞同!
想学如何实现播放本地和远程视频的功能,正好来试试这个新的教程。
有17位网友表示赞同!
AVPlayer真强大,每次看到它都能开发出很多酷炫的效果。
有16位网友表示赞同!
有没有什么特殊的技巧可以优化视频播放质量?
有9位网友表示赞同!
期待了解一下如何处理网络不稳定导致的播放中断问题。
有5位网友表示赞同!
能不能讲讲不同文件格式的视频应该如何兼容处理呢?
有18位网友表示赞同!
是否可以使用AVPlayer来控制视频播放的速度和音量?
有8位网友表示赞同!
我想在手机上实现实时视频监控功能,可以用这个来参考吗?
有5位网友表示赞同!
如果要添加字幕的功能,这教程里会提到吗?
有8位网友表示赞同!
这个教程适合初学者吗?还是有一定程序基础比较好?
有18位网友表示赞同!
不知道远程视频能不能支持直播呢?
有19位网友表示赞同!
请问使用AVPlayer播放本地视频需要考虑什么安全问题?
有8位网友表示赞同!
有没有推荐一些好用的开源库,可以帮助开发更强大的音视频功能?
有6位网友表示赞同!
学习完这个教程,可以做哪些类型的应用呢?
有11位网友表示赞同!
会不会有后续的文章讲解如何使用AVFoundation其他组件进行更高层级的音视频处理?
有5位网友表示赞同!
我对视频滤镜效果很感兴趣,知道这个教程里讲到了吗?
有5位网友表示赞同!
想在视频播放器里添加一些自定义UI界面元素,请问可以怎么做呢?
有12位网友表示赞同!
学习完这个教程,是不是就可以直接开发一款完整的视频播放应用了?
有7位网友表示赞同!
这篇文章的代码示例能直接编译运行吗?
有9位网友表示赞同!