ios - 将 AVPlayerItem 转换为 NSData

标签 ios objective-c uiimage avplayeritem

我正在尝试完成一个简单的任务,例如将 UIImage 转换为 NSData,当我选择一个时返回给我的 AVPlayerItem来自 PHImageManager 的视频。什么可能等效于 UIImagePNGRepresentation 将视频转换为数据:

PHVideoRequestOptions *videoRequestOptions = [[PHVideoRequestOptions alloc] init];
videoRequestOptions.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;
videoRequestOptions.version = PHVideoRequestOptionsVersionOriginal;

[[PHImageManager defaultManager] requestPlayerItemForVideo:asset options:videoRequestOptions resultHandler:^(AVPlayerItem *item, NSDictionary *info)
            {
                //?
            }];

UIImage 是这样的:

[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:imageRequestOptions resultHandler:^(UIImage *result, NSDictionary *info)
{
     NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(result)]; //<==THIS
}

最佳答案

解决方案是从 AVPlayerItem Assets 获取 URL,然后从该 URL 创建 NSData:

PHAsset *asset = ...
PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
[[PHImageManager defaultManager] requestPlayerItemForVideo:asset options:options resultHandler:^(AVPlayerItem * _Nullable playerItem, NSDictionary * _Nullable info) {
                NSURL *fileURL = [(AVURLAsset *)playerItem.asset URL];
                NSData *videoData = [NSData dataWithContentsOfURL:fileURL];
                NSLog(@"tmpData Size: %lu",tmpData.length);
}];

另一种方法是使用“requestAVAssetForVideo:asset”....

PHFetchOptions *fetchOption = [[PHFetchOptions alloc]init];
if ([fetchOption respondsToSelector:@selector(setFetchLimit:)]) {
    [fetchOption setFetchLimit:1];
}
PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[@"<Video-localIdentifier>"] options:fetchOption].firstObject;
PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc]init];
options.version = PHVideoRequestOptionsVersionOriginal;
options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;

[[PHImageManager defaultManager] requestAVAssetForVideo:asset
                                                options:options
                                          resultHandler:
 ^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
     AVURLAsset *urlAsset = (AVURLAsset *)asset;
     NSData *videoData = [NSData dataWithContentsOfURL:urlAsset.URL];

     if (videoData) {
         NSLog(@"videoData Size: %lu", videoData.length);
     }

 }];

关于ios - 将 AVPlayerItem 转换为 NSData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37985652/

相关文章:

iphone - UIWebView webViewDidStartLoad 有时不触发

objective-c - 在沙盒应用程序中使用 NSFileManager 访问 NSApplicationScriptsDirectory

ios - 带有 UITableView 的 UIPageViewController,滑动以删除单元格?

objective-c - 在 View 之间滑动

ios - 如何在 Objective c 中推送到 View Controller 时显示 ActivityIndi​​cator

objective-c - 在 Objective-C 中打印多个页面

ios - 根据各种屏幕尺寸自动布局 Collection View

ios - UIScrollView 中图像上的 cropImage 方法问题产生错误的图像

ios - 在 arc 中调整 UIImage 大小时发生内存泄漏

iOS UIImage : set image orientation without rotating the image itself