UIImagePickerController:从视频中获取图像

时间:2011-02-16 22:58:54

标签: ios video uiimagepickercontroller frame avfoundation

我正在尝试从视频中提取帧作为图像。视频使用UIImagePickerController记录。

录制视频后,我会获取其网址并使用AVURLAsset加载。然后我创建一个AVAssetReader和AVAssetReaderTrackOutput来获取各个帧。

当我将帧作为CMSampleBufferRef获取时,我将它们传递给Apple的imageFromSampleBuffer方法,该方法应返回UIImage。当我使用AVCaptureSession获取帧时,此方法工作正常,但当我使用通过UIImagePickerController录制的视频时,此行返回0x0:

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

其中sampleBuffer是我传递的CMSampleBufferRed。

我通过调试器检查了sampleBuffer的值,看起来没问题(不是0x0)。 CMSampleBufferGetImageBuffer有什么原因会返回0x0?

或者是否有另一种方法从MOV文件中提取单个视频帧并将其另存为UIImage?

感谢。

2 个答案:

答案 0 :(得分:7)

我找到了解决方案。您必须在初始化AVAssetReaderTrackOutput时传递的设置中设置像素格式。

我通过了以下设置字典:

NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 

希望这有助于其他人。

答案 1 :(得分:0)

我前一段时间是这样做的。

LBSequence.strToByteArr = function(str){
    const byteArr = [];
    for(let i=0; i< str.length; i++){
        let code = str.charCodeAt(i);
        byteArr.push(...LBSequence.encode(code));
    }
    return byteArr;
}

LBSequence.byteArrToStr = function(byteArr, start, end){
    start || (start = 0);
    end || (end  = byteArr.length);
    let str = '';
    while(start< end){
        let code = LBSequence.decode( byteArr, start );
        str += String.fromCharCode( code.val );
        start += code.len;
    }
    return str;
}