要支持音视频播放 就要加一个框架
AVFoundation.framwork
#import
@interface AVAudioPlayer : NSObject
- (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
音频文件路径初始化
- (id)initFileURLWithPath:(NSString *)path; // Better to use initFileURLWithPath:isDirectory: if you know if the path is a directory vs non-directory, as it saves an i/o.
NSURL 的方法本地路径转化为NSURL要用这个方法
- (BOOL)prepareToPlay;
预播放 防止刚开始播放前的1~2秒卡顿
- (BOOL)play;
开始播放
- (void)pause;
暂停
- (void)stop;
停止
@property(readonly) NSTimeInterval duration;
播放总时间
@property NSTimeInterval currentTime;
播放当前时间
@property float volume;
播放音量
@property NSInteger numberOfLoops;
循环次数
上一首 下一首 切换需要用代理(AVAudioPlayerDelegate)
*****************
视频:
需要导入框架库
MediaPlayer.framework
注:弹出播放器的VC要嵌套在NC中才可以 不然就会出问题(不能自动弹出,手动弹出后再点就会崩溃)
ios7自带播放器
MP_EXTERN_CLASS_AVAILABLE(3_2) @interface MPMoviePlayerViewController : UIViewController
- (id)initWithContentURL:(NSURL *)contentURL;
vc可以弹出系统自带的视频播放VC
@interface UIViewController (MPMoviePlayerViewController)
- (void)presentMoviePlayerViewControllerAnimated:(MPMoviePlayerViewController *)moviePlayerViewController;
***
视频格式:
.m3u8 苹果专用的流媒体视频格式 安卓的不能用
流媒体: 流式的媒体 服务端将视频分割为一小段一小段 每一段都能独立播放 可以下一点看一点
***
视频播放器可以定制
自定义播放界面
步骤:
①
创建一个UIView
②
+(Class)layerClass;
// default is [CALayer class]. Used when creating the underlying layer for the view.
需要定制UIView 时使用
与CALayer最大区别在于:CALayer不能接收手势 接收手势的是UIView
CALayer是UIView的底层 UIView是完全依赖CALayer的
CALayer主要负责界面的绘制
UIView主要负责显示
如果定制播放器是要导入框架库的
AVFoundation.framework
+ (Class)layerClass
{
return [AVPlayerLayer class];
}
这样就能安置播放器了
(如果要做游戏就要返回OPenGL的class)
@interface AVPlayerLayer : CALayer
@property (nonatomic, strong) AVPlayer *player;
AVPlayer作为属性,重写setter方法getter方法
- (void)setPlayer:(AVPlayer *)player
{
AVPlayerLayer *layer = (AVPlayerLayer *)self.layer;
layer.player = player;
}
- (AVPlayer *)player
{
return ((AVPlayerLayer *)self.layer).player;
}
@interface AVPlayerItem : NSObject <</SPAN>NSCopying>
负责处理媒体 获取网络数据
- (id)initWithURL:(NSURL *)URL;
@interface AVPlayer : NSObject
负责播放
- (id)initWithPlayerItem:(AVPlayerItem *)item;
- (void)play;
自定义创建的WYPlayer(继承自UIView)就负责放置显示
.player = _avPlayer;
要把播放的AVPlayer加到定制的WYPlayer上
横竖屏是依赖设置停靠模式
@property(nonatomic) UIViewAutoresizing autoresizingMask; // simple resize. default is UIViewAutoresizingNone
_playView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
在获取服务器数据之前是不能获取AVPlayerItem的时间的 会崩掉的
获取片源时间必须和服务器有过交互
可以用KVO 监听AVPlayerItem的
@property (nonatomic, readonly) AVPlayerItemStatus status;
[_item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:NULL];
用这个添加监听
如果发生变化 就触发一个方法(如下) (获取片源时间的方法)
当status的值为AVPlayerItemStatusReadyToPlay 就能拿到时间
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
在这个方法里获取片源时间
CGFloat totalTime = _item.duration.value / _item.duration.timescale;
计算时间的标准工时 CMTime提供的
在视屏播放提供了现有的方法 可以代替NSTimer的功能 每隔一段时间刷新时间label和slider 写在block中
- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block;
__block WYViewController *vc = self;
[_avPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
CGFloat curTime = vc->_item.currentTime.value / vc->_item.duration.timescale;
}];
- (void)seekToTime:(CMTime)time;
利用上面提到的公式进行计算CMTime
然后让_item调用这个方法 就能让播放器播放到指定位置