1:先去 github 下载需要的的版本
2:根据要求添加依赖库
1:可以先创建一个 view ,然后在设置好 frame 之后,初始化 VLCMediaPlayer
UIView *videoView = [[UIView alloc] initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, 200)];
[self.view addSubview:videoView];
2://添加双击手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(playVideo:)];
tap.numberOfTapsRequired = 2;
[videoView addGestureRecognizer:tap];
#初始 VLCPlayer,设置代理和播放界面
self.player = [[VLCMediaPlayer alloc] init];
self.player.delegate = self;
self.player.drawable = videoView;
self.player.media = [VLCMedia mediaWithURL:url];
#这个是开始播放,但是我没有直接开始,应为,我还要获取第一帧的图片,将其放置在视屏未播放的时候。
//[self.player play];
# 外部方法
//手势点击响应
-(void)playVideo:(UITapGestureRecognizer *)ges{
if (self.player.isPlaying) {
[self.player pause];
}else{
if (_imgView != nil ) {
[_imgView removeFromSuperview];
}
[self.player play];
}
}
-
获取视频第一帧图片,其实这个在下载库里的 demo 是有的,但是在使用的时候碰到了点问题,在下面会有描述。
1:创建一个 UIImageView 放在之前创建的 videView 位置
_imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, 200)];
_imgView.contentMode = UIViewContentModeScaleAspectFit;
_imgView.clipsToBounds = YES;
_imgView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
///使用 AVAssetImageGenerator 获取缩略图
// _imgView.image = [self thumbnailImageRequest:0.0];
[self.view addSubview:_imgView];
2:初始化缩略图对象VLCMediaThumbnailer
self.player.media.delegate = self;
VLCLibrary *sharedLibary = [VLCLibrary sharedLibrary];
// sharedLibary.debugLogging = YES;
VLCMediaThumbnailer *thumbaniler = [VLCMediaThumbnailer thumbnailerWithMedia:self.player.media delegate:self andVLCLibrary:sharedLibary];
[thumbaniler fetchThumbnail];//开始抓图
3:实现缩略图的 delegate 方法
-(void)mediaThumbnailerDidTimeOut:(VLCMediaThumbnailer *)mediaThumbnailer{
NSLog(@"%s: %@", __PRETTY_FUNCTION__, mediaThumbnailer);
}
-(void)mediaThumbnailer:(VLCMediaThumbnailer *)mediaThumbnailer didFinishThumbnail:(CGImageRef)thumbnail{
//将抓到的图赋值给_imgView
_imgView.image = [UIImage imageWithCGImage:thumbnail];
}
Q: 问题来了,现在简单的播放已经可以实现,双击开始播放。打印台输出一个 seek 的数据,也就是说,你获取了第一帧的图片后,再双击播放的时候,开始时间其实就是那个 seek 输出的时间。我也很纳闷这是啥情况。后面我出一个笨方法解决它。
-
解决使用 VLC 自带的缩略图获取第一帧图片后,播放开始时间不对的问题
##//这个是player 的代理方法,状态放生改变后的通知
-(void)mediaPlayerStateChanged:(NSNotification *)aNotification{
// VLCMediaStateNothingSpecial, ///< Nothing
// VLCMediaStateBuffering, ///< Stream is buffering
// VLCMediaStatePlaying, ///< Stream is playing
// VLCMediaStateError, ///< Stream is Error
switch (_player.media.state) {
case 0:
NSLog(@"nothing");
break;
case 1:
NSLog(@"Stream is buffering");
break;
case 2:
#playing这个状态会执行很多次,视频将要播放就会执行,所以在第一视频刚刚加载并播放的时候,我直接让他退回到真正的起始时间,添加的一个 bool 值来判断。
#暂时解决了使用系统缩略图获取图片时,播放时间不对的问题
NSLog(@"Stream is playing");
if (isFirst) {
#跳回起始时间再播放,时间单位为 s
[self.player setTime:[[VLCTime alloc] initWithInt:0]];
isFirst = NO;
}
break;
default:
break;
}
}
有人用过VLC 获取过第一帧图片而且没有问题的吗?有其他解决方案的,麻烦告知,谢谢。
使用 AVAssetImageGenerator 获取缩略图,这样不会产生上面的时间错误。
//使用 AVAssetImageGenerator 获取缩略图
-(UIImage *)thumbnailImageRequest:(CGFloat )timeBySecond{
//根据url创建AVURLAsset
AVURLAsset *urlAsset = [AVURLAsset assetWithURL:url];
//根据AVURLAsset创建AVAssetImageGenerator
AVAssetImageGenerator *imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];
/*截图
* requestTime:缩略图创建时间
* actualTime:缩略图实际生成的时间
*/
NSError *error=nil;
//CMTime是表示电影时间信息的结构体,第一个参数表示是视频第几秒,第二个参数表示每秒帧数.(如果要活的某一秒的第几帧可以使用CMTimeMake方法)
CMTime time = CMTimeMakeWithSeconds(timeBySecond, 10);
CMTime actualTime;
CGImageRef cgImage = [imageGenerator copyCGImageAtTime:time actualTime:&actualTime error:&error];
if (error) {
NSLog(@"截取视频缩略图时发生错误,错误信息:%@",error.localizedDescription);
return nil;
}
CMTimeShow(actualTime);
//转化为UIImage
return [UIImage imageWithCGImage:cgImage];
}