VLC 框架的使用及问题

  • 集成MobileVLCKit 框架,简单的说。

1:先去 github 下载需要的的版本
2:根据要求添加依赖库
  • 使用 VLC

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 获取过第一帧图片而且没有问题的吗?有其他解决方案的,麻烦告知,谢谢。

  • 第二种获取 video 缩略图的方法

使用 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];
}

你可能感兴趣的:(VLC 框架的使用及问题)