为什么通过UIImagePickerController高中设置选择的视频可以在结果上产生相同的质量属性?

时间:2012-04-26 21:59:47

标签: ios uiimagepickercontroller resolution videoquality

为什么使用UIImagePickerController高级和中级视频质量设置选择视频会产生完全相同的视频属性,至少在iPhone4和iPad3等设备上?

详细说明:

我们正在使用UIImagePickerController让我们的应用用户从照片库中选择图像或视频,然后将它们传输到服务器。我们让用户选择我们直接映射到UIImagePickerControllerQualityTypeHigh,UIImagePickerControllerQualityTypeMedium和UIImagePickerControllerQualityTypeLow videoQuality常量的高,中或低视频质量。

当我们使用相机在我们的应用程序外拍摄的10秒左右的视频被选中并在3GS(iOS 5.0)上发送时,我们会看到每个质量设置的明显差异,例如:

  • 低:226x,144x192,编解码器:AAC H.264
  • medium:360x480,1.1MB,编解码器:AAC H.264
  • 高:480x640处5MB,编解码器:AAC H.264

当我们在iPhone4或iPad3上尝试相同时(我们碰巧有那些设备很方便;不确定它只发生在那些设备上)我们看到低设置会产生相同的低分辨率结果,但是高和中等设置给我们相同的结果,如下所示:

  • 低:194x,144x192,编解码器:AAC H.264
  • medium:在720x1280处为2.87MB,编解码器:AAC H.264
  • 高:2.87MB,720x1280,编解码器:AAC H.264

(请注意,中等和高的结果是相同的。)

设备的原始版本为12.8 MB,720x1280,编解码器:AAC H.264,比特率更高。

可以解释一下这里发生了什么吗?我希望能够向我们的客户解释,甚至可以更好地指出苹果公司的文档中的内容。

提前感谢您的帮助......

1 个答案:

答案 0 :(得分:5)

视频质量设置仅适用于捕获视频而不是从视频选择器中拾取视频。该设置清楚地列在下面的捕获设置部分下。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html

您可以使用以下代码以原始格式导出视频。只需传递所选视频的URL值,该函数将返回导出视频的路径。

+(NSString*) videoAssetURLToTempFile:(NSURL*)url
{
    NSString * surl = [url absoluteString];
    NSString * ext = [surl substringFromIndex:[surl rangeOfString:@"ext="].location + 4];
    NSTimeInterval ti = [[NSDate date]timeIntervalSinceReferenceDate];
    NSString * filename = [NSString stringWithFormat: @"%f.%@",ti,ext];
    NSString * tmpfile = [NSTemporaryDirectory() stringByAppendingPathComponent:filename];

    NSURL *outputURL = [NSURL fileURLWithPath:tmpfile];

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
    exportSession.outputURL = outputURL;
    exportSession.shouldOptimizeForNetworkUse = YES;
    exportSession.outputFileType = AVFileTypeQuickTimeMovie;
    [exportSession exportAsynchronouslyWithCompletionHandler:^(void) 
    {
        NSLog(@"Export Complete %d %@ %@", exportSession.status, exportSession.error, outputURL);
        [exportSession release];
    }];

    return tmpfile;
}