gpt4 book ai didi

ios - 将 PHAsset(视频)同步转换为 AVAsset

转载 作者:技术小花猫 更新时间:2023-10-29 10:42:19 25 4
gpt4 key购买 nike

我需要使用 AVAsset 对象,以便使用 AVPlayer 和 AVPlayerLayer 播放它。我开始使用 Photos 框架,因为 AssetsLibrary 已被弃用。现在我到了我有一个 PHAsset 对象数组的地步,我需要将它们转换为 AVAsset。我尝试枚举 PHFetchResult 并使用 PHAsset 的本地化描述分配一个新的 AVAsset,但是当我播放它时它似乎没有显示任何视频。

    PHAssetCollection *assetColl = [self scaryVideosAlbum];

PHFetchResult *getVideos = [PHAsset fetchAssetsInAssetCollection:assetColl options:nil];

[getVideos enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
NSURL *videoUrl = [NSURL URLWithString:asset.localizedDescription];
AVAsset *avasset = [AVAsset assetWithURL:videoUrl];
[tempArr addObject:avasset];
}];

我假设本地化描述不是视频的绝对 url。

我还偶然发现了 PHImageManager 和 requestAVAssetForVideo,但是,涉及视频的选项参数没有 isSynchrounous 属性,图像选项参数就是这种情况。

        PHVideoRequestOptions *option = [PHVideoRequestOptions new];
[[PHImageManager defaultManager] requestAVAssetForVideo:videoAsset options:option resultHandler:^(AVAsset * _Nullable avasset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {

有同步的方法吗?

谢谢。

最佳答案

不,没有。但是您可以构建一个同步版本:

dispatch_semaphore_t    semaphore = dispatch_semaphore_create(0);

PHVideoRequestOptions *option = [PHVideoRequestOptions new];
__block AVAsset *resultAsset;

[[PHImageManager defaultManager] requestAVAssetForVideo:videoAsset options:option resultHandler:^(AVAsset * avasset, AVAudioMix * audioMix, NSDictionary * info) {
resultAsset = avasset;
dispatch_semaphore_signal(semaphore);
}];

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
// yay, we synchronously have the asset
[self doSomethingWithAsset:resultAsset];

但是,如果您在主线程上执行此操作并且 requestAVAssetForVideo: 花费的时间太长,您可能会锁定 UI 甚至被 iOS watchdog 终止。 .

重新设计您的应用以使用异步回调版本可能更安全。像这样:

__weak __typeof(self) weakSelf = self;

[[PHImageManager defaultManager] requestAVAssetForVideo:videoAsset options:option resultHandler:^(AVAsset * avasset, AVAudioMix * audioMix, NSDictionary * info) {
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf doSomethingWithAsset:avasset];
});
}];

关于ios - 将 PHAsset(视频)同步转换为 AVAsset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32827557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com