6

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

细节:

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

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

  • 低:226KB,144x192,编解码器:AAC H.264
  • 中:1.1MB,360x480,编解码器:AAC H.264
  • 高:480x640 时 5MB,编解码器:AAC H.264

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

  • 低:194KB,144x192,编解码器:AAC H.264
  • 中:2.87MB,720x1280,编解码器:AAC H.264
  • 高:720x1280 时为 2.87MB,编解码器:AAC H.264

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

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

任何人都可以解释这里发生了什么吗?我希望能够向我们的客户解释它,甚至更好地指出 Apple 文档中涵盖此内容的内容。

在此先感谢您的帮助...

4

1 回答 1

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;
}
于 2012-06-28T06:58:00.423 回答