我正在使用UIImagePickerController来允许我的用户从资产库中选择一个视频。使用UIImagePickerController选择电影时避免视频压缩?
当用户在第二个屏幕上选择“选择”按钮时,视图显示进度条和“压缩视频...”消息。
这是怎么发生的?
有没有办法可以避免这种压缩操作?
我正在使用UIImagePickerController来允许我的用户从资产库中选择一个视频。使用UIImagePickerController选择电影时避免视频压缩?
当用户在第二个屏幕上选择“选择”按钮时,视图显示进度条和“压缩视频...”消息。
这是怎么发生的?
有没有办法可以避免这种压缩操作?
答:目前还没有办法控制的UIImagePickerController如何压缩挑视频。
我刚做了一些快速测试。使用我创建的测试应用程序,我选取了两次相同的视频 - 一次将videoQuality
属性设置为UIImagePickerControllerQualityTypeHigh
,一次将其设置为UIImagePickerControllerQualityTypeLow
。复制的结果文件大小完全相同,大小为15.1MB,帧大小为360x480。原始大小为72.5MB,帧大小为480x640。显然这个属性不会影响所使用的压缩。
设置的UIImagePickerController的视频质量属性设置为“高”(UIImagePickerControllerQualityTypeHigh = 0)
从SDK文档: “如果显示在图像选择器中录制的电影,指定你不想要降低电影的视频质量。“
看起来像在iPhone 4上,即使设置为“高”,它仍然会压缩,但质量比默认好得多。由于原始720p视频编码速度超过10 Mbit/sec,因此我可以看到它们为什么会以“高”压缩! – CDeutsch 2010-08-03 20:35:10
我有类似的发现,甚至在某些压缩中将其设置为高结果(和“压缩视频”对话框)。 – Shizam 2010-09-07 00:16:30
在'UIImagePickerControllerQualityTypeHigh'的文档中,最后一行说:“**如果在图像选择器中显示录制的影片,则指定您不想降低影片的视频质量。这似乎表明,对于选择视频(而不是记录),此属性会影响它们在图像选择器的编辑屏幕中的显示方式。 – memmons 2011-05-05 04:46:52
对于那些给出使用videoQuality属性的建议,文档明确指出它是视频捕获选项,而不是选择器选项。
由于杰克在下面提到它,它也用于转码。看起来我太快阅读文档,因为我没有注意到转码提及。
该文件称“视频录制**和转码质量**”。 – 2014-11-19 07:30:27
由于目前还没有办法避免使用UIImagePickerController进行压缩,所以我想包含一些关于如何创建自己的图像选择器以免压缩的想法。
这将允许访问原始视频文件:
的iOS 8
PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];
for (PHAsset *asset in assetsFetchResult) {
PHVideoRequestOptions *videoRequestOptions = [[PHVideoRequestOptions alloc] init];
videoRequestOptions.version = PHVideoRequestOptionsVersionOriginal;
[[PHImageManager defaultManager] requestAVAssetForVideo:asset options:videoRequestOptions resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
// the AVAsset object represents the original video file
}];
}
看看访问集合(时刻)和其他选项的PhotoKit文档。
这里是苹果公司使用PhotoKit一个示例应用程序可能被修改为照片选择器:https://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html
这里是在GitHub上照片选择器库,它使用PhotoKit看起来有前途的,因为它可以让你的PHAsset对象所有选择的图像/视频:https://github.com/guillermomuntaner/GMImagePicker
的iOS 7和下面
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (group) {
// If you want, you can filter just pictures or videos
// I just need videos so I do this:
[group setAssetsFilter:[ALAssetsFilter allVideos]];
[group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){
if (asset){
// You can now add this ALAsset in your own video picker.
// Note that you can only access the ALAsset as long as
// you maintain a reference to the ALAssetsLibrary
// Or if you want to process the video, you can create an AVAsset:
NSURL *url = asset.defaultRepresentation.url;
AVAsset *videoAsset = [AVAsset assetWithURL:url];
}
}];
}
} failureBlock:^(NSError *error) {
NSLog(@"error enumerating AssetLibrary groups %@\n", error);
}];
至今还没有找到一个解决这个。有人有主意吗? – Avalanchis 2010-07-08 13:47:24
看看下面的答案。它看起来不像开发人员可以影响压缩。 – memmons 2011-05-05 05:31:29
Avalanchis - 这是2年前回答的。可能获得接受? – memmons 2013-05-02 14:28:30