第一、截屏功能
項目需求,點擊截屏按鈕,對當前直播頁面截屏并且保存到相冊。
MobileVLCKit這個庫本身有提供截屏的接口
1、定義VLCMediaPlayer屬性
@property(nonatomic,strong)VLCMediaPlayer * player;
2、創(chuàng)建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、調(diào)用VLCMediaPlayer的截屏接口
?[self.player saveVideoSnapshotAt:path withWidth:SCREEN_WIDTH andHeight:SCREEN_WIDTH * 190 / 360];
但是這么做會有個問題,因為saveVideoSnapshotAt這個截屏的接口需要在視頻已經(jīng)開始播放的時候,調(diào)用才會有效,否則會crash。而直播一開始拉流的時候都有一個緩沖期,所以需要判斷視頻什么時候開始正式播放。這里利用的是kvo監(jiān)聽:
// 添加監(jiān)聽
- (void)addObserver
{
? // 監(jiān)聽VLC對象屬性(時間和播放)
? [_player addObserver:self forKeyPath:@"remainingTime" options:0 context:nil];
? [_player addObserver:self forKeyPath:@"isPlaying" options:0 context:nil];
}
// 移除監(jiān)聽
- (void)removeObserver
{
? [_player removeObserver:self forKeyPath:@"isPlaying"];
? [_player addObserver:self forKeyPath:@"remainingTime" options:0 context:nil];
}
// kvo監(jiān)聽回調(diào)
- (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存在的時候,說明視頻已經(jīng)開始播放了,這個時候才去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 //開始錄屏調(diào)該接口,這里有個關鍵點,path只能傳directory路徑,而不是錄制好的文件名字。MObileVLCKit自帶的錄屏功能,錄制出來的視頻默認是.ts后綴格式的視屏。
stopRecording //結(jié)束錄屏調(diào)該接口
另外兩個是代理:
//錄屏回調(diào)
- (void)mediaPlayerStartedRecording:(VLCMediaPlayer*)player
{
? NSLog(@"開始錄制");
}
- (void)mediaPlayer:(VLCMediaPlayer*)player recordingStoppedAtPath:(NSString*)path
{
? NSLog(@"結(jié)束錄制: %@",path);//這里的path則是錄制好的視頻保存的路徑,與上面startRecordingAtPath:path接口的保存路徑是一致的。
? if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(path))
? {
? ? ? UISaveVideoAtPathToSavedPhotosAlbum(path,self,@selector(video:didFinishSavingWithError:contextInfo:),nil);//由于是.ts后綴格式的視頻,保存到相冊并不能從相冊中 查找到
? }
}