獲取視頻第一幀及視頻尺寸

僅測試了本機(jī)拍攝的mp4文件

- (void)setFileName:(NSString *)fileName{
    _fileName = [fileName copy];
    
    // 這里是獲取本地沙盒的視頻,遠(yuǎn)程url原理一樣
    // 記住如果是http地址記得用[NSURL URLWithString:urlStr]
    // 若是本地視頻地址要用[NSURL fileURLWithPath:path]
    _videoUrl = [NSURL fileURLWithPath:[[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:VideoRecordsDirectory] stringByAppendingPathComponent:_fileName]];
    
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:_videoUrl options:nil];
    
    // 獲取某一幀圖片,這里獲取第一幀
    _videoImage = [self getthumImageForAsset:asset atTime:0];
}

// 獲取視頻某一幀的圖片
- (UIImage *)getthumImageForAsset:(AVURLAsset *)asset atTime:(NSTimeInterval)time{
    
    NSParameterAssert(asset);
    
    AVAssetImageGenerator *assetImageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    assetImageGenerator.appliesPreferredTrackTransform = YES;
    assetImageGenerator.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
    
    // 獲取任意幀要設(shè)定這個(gè),然后可根據(jù)傳過來的參數(shù)time獲取任意幀
    //    assetImageGenerator.requestedTimeToleranceAfter = kCMTimeZero;
    //    assetImageGenerator.requestedTimeToleranceBefore = kCMTimeZero;
    
    CGImageRef thumImageRef = NULL;
    
    // 獲取哪一時(shí)間的幀圖片
    CFTimeInterval thumImageTime = time;
    
    NSError *thumImageGenerationError = nil;
    
    // 獲取每秒多少幀
    //    float fps = [[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] nominalFrameRate];
    // 重寫CMTimeMake(a,b) a當(dāng)前第幾幀, b每秒鐘多少幀.當(dāng)前播放時(shí)間a/b CMTimeMakeWithSeconds(a,b) a當(dāng)前時(shí)間,b每秒鐘多少幀
    // 這個(gè)時(shí)候即可獲取第N幀圖片
    //    thumImageRef = [assetImageGenerator copyCGImageAtTime:CMTimeMake(time, fps) actualTime:NULL error:&thumImageGenerationError];
    
    thumImageRef = [assetImageGenerator copyCGImageAtTime:CMTimeMake(thumImageTime, 60) actualTime:NULL error:&thumImageGenerationError];
    
    if (!thumImageRef)
        NSLog(@"thumImageGenerationError %@", thumImageGenerationError);
    
    UIImage *thumImage = thumImageRef ? [[UIImage alloc] initWithCGImage:thumImageRef] : nil;
    
    return thumImage;
}

/** 獲取視頻的尺寸 */
+ (void)getVideoSizeWithURL:(NSURL *)URL complete:(void(^)(CGSize videoSize))complete{
    
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:URL options:nil];
    
    // 獲取
    // loadValuesAsynchronouslyForKeys是官方提供異步加載track的方法,防止線程阻塞
    // 加載track是耗時(shí)操作
    [asset loadValuesAsynchronouslyForKeys:@[@"tracks"] completionHandler:^{
        
        // 一般視頻都有至少兩個(gè)track(軌道),根據(jù)track.mediaType判斷track類型
        // AVMediaTypeVideo表示視頻軌道,AVMediaTypeAudio代表音頻軌道,其他類型可以查看文檔。
        // 根據(jù)track的naturalSize屬性即可獲得視頻尺寸
        NSArray *array = asset.tracks;
        CGSize videoSize = CGSizeZero;
        
        for (AVAssetTrack *track in array) {
            
            if ([track.mediaType isEqualToString:AVMediaTypeVideo]) {
                
                // 注意修正naturalSize的寬高
                videoSize = CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform);//CGSizeMake(track.naturalSize.height, track.naturalSize.width);
                
                break;
            }
        }
        
        if (asset.playable) {
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                !complete ? : complete(videoSize);
            });
        }
    }];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,564評(píng)論 19 139
  • 《裕語言》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 28,753評(píng)論 5 20
  • 時(shí)間并沒有因?yàn)槲覀兒懿簧岫v足,她是沙漏里無法阻擋的沙,她是從你耳畔輕撫的和風(fēng),她是彌漫著四季味道的空氣。 大學(xué)已...
    黑歪歪閱讀 261評(píng)論 0 0
  • 一個(gè)強(qiáng)盜敏捷地落在半掩的窗戶邊,一側(cè)身閃進(jìn)房間,從容四顧。一名行家里手在工作時(shí)總是從容不迫的。他朝梳妝臺(tái)走了三步,...
    卷毛佟閱讀 656評(píng)論 9 11
  • 昨日,看書時(shí)看到一個(gè)關(guān)于蟬的故事。 蟬的生命歷程很短,只有一個(gè)夏天。而它要被埋在地下17年,才能等到一個(gè)夏天。我想...
    夏拾昭華閱讀 568評(píng)論 9 5

友情鏈接更多精彩內(nèi)容