ios MobileVLCKit的截屏和录屏功能

2019-06-04  本文已影响0人  康闹闹2013

第一、截屏功能

项目需求,点击截屏按钮,对当前直播页面截屏并且保存到相册。

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后缀格式的视频,保存到相册并不能从相册中 查找到

  }

}

上一篇 下一篇

猜你喜欢

热点阅读