ios MobileVLCKit的截屏和录屏功能
第一、截屏功能
项目需求,点击截屏按钮,对当前直播页面截屏并且保存到相册。
MobileVLCKit这个库本身有提供截屏的接口
1、定义VLCMediaPlayer属性
@property(nonatomic,strong)VLCMediaPlayer * player;
2、创建VLCMediaPlayer
-(VLCMediaPlayer *)player{
if(!_player) {
//缓存策略设置
//NSDictionary * dict=@{@"network-caching":@"100"};
VLCMedia * media=[VLCMedia mediaWithURL:[NSURL URLWithString:self.playUrl]];
media.delegate=self;
//[media addOptions:dict];
_player = [[VLCMediaPlayer alloc] init];
//设置硬件解码
[_player setDeinterlaceFilter:@"blend"];
_player.media=media;
_player.drawable = self;
_player.media.delegate=self;
_player.delegate = self;
}
return _player;
}
3、调用VLCMediaPlayer的截屏接口
[self.player saveVideoSnapshotAt:path withWidth:SCREEN_WIDTH andHeight:SCREEN_WIDTH * 190 / 360];
但是这么做会有个问题,因为saveVideoSnapshotAt这个截屏的接口需要在视频已经开始播放的时候,调用才会有效,否则会crash。而直播一开始拉流的时候都有一个缓冲期,所以需要判断视频什么时候开始正式播放。这里利用的是kvo监听:
// 添加监听
- (void)addObserver
{
// 监听VLC对象属性(时间和播放)
[_player addObserver:self forKeyPath:@"remainingTime" options:0 context:nil];
[_player addObserver:self forKeyPath:@"isPlaying" options:0 context:nil];
}
// 移除监听
- (void)removeObserver
{
[_player removeObserver:self forKeyPath:@"isPlaying"];
[_player addObserver:self forKeyPath:@"remainingTime" options:0 context:nil];
}
// kvo监听回调
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void*)context {
NSArray*subviews = [self subviews];
if(subviews.count>0) {//因为当开始播放的时候,MobileVLCKit库会自己添加一个子view,因此这里判断
//当这个子View存在的时候,说明视频已经开始播放了,这个时候才去addsubview(截屏按钮),否则截屏按钮会被那个播放的子view覆盖,点击无效。
[(UIView*)subviews[0]addSubview:self.shotBtn];
[(UIView*)subviews[0]bringSubviewToFront:self.shotBtn];
self.printBtn.layer.zPosition = 10;
}
}
第二:录屏功能
MobileVLCKit这个库的3.2.0版本新增了录屏接口,分别是以下四个:
startRecordingAtPath:path //开始录屏调该接口,这里有个关键点,path只能传directory路径,而不是录制好的文件名字。MObileVLCKit自带的录屏功能,录制出来的视频默认是.ts后缀格式的视屏。
stopRecording //结束录屏调该接口
另外两个是代理:
//录屏回调
- (void)mediaPlayerStartedRecording:(VLCMediaPlayer*)player
{
NSLog(@"开始录制");
}
- (void)mediaPlayer:(VLCMediaPlayer*)player recordingStoppedAtPath:(NSString*)path
{
NSLog(@"结束录制: %@",path);//这里的path则是录制好的视频保存的路径,与上面startRecordingAtPath:path接口的保存路径是一致的。
if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(path))
{
UISaveVideoAtPathToSavedPhotosAlbum(path,self,@selector(video:didFinishSavingWithError:contextInfo:),nil);//由于是.ts后缀格式的视频,保存到相册并不能从相册中 查找到
}
}