首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能在iphone12上得到PHAsset / AVAsset是hdr视频/杜比视觉吗?

我能在iphone12上得到PHAsset / AVAsset是hdr视频/杜比视觉吗?
EN

Stack Overflow用户
提问于 2020-10-24 14:14:11
回答 3查看 474关注 0票数 3

我想添加HDR图标以指示某些资产是HDR,但如果这是来自iphone12的HDR视频记录,我无法获得任何信息来检查视频

EN

回答 3

Stack Overflow用户

发布于 2020-10-24 15:39:55

代码语言:javascript
复制
+ (BOOL)isHDRVideo:(AVAsset *)avasset {
    if (!avasset) {
        return NO;
    }
    __block BOOL isHDRVideo = NO;
    [avasset.tracks enumerateObjectsUsingBlock:^(AVAssetTrack * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stopTracks) {
        [obj.formatDescriptions enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stopFormatDescriptions) {
            CMFormatDescriptionRef desc = (__bridge  CMVideoFormatDescriptionRef)obj;
            NSDictionary *dic = (__bridge NSDictionary *)CMFormatDescriptionGetExtensions(desc);
            NSString *imageBufferColorPrimaries = dic[(__bridge  id)kCVImageBufferColorPrimariesKey];
            if ([imageBufferColorPrimaries isEqualToString:(__bridge  id)kCVImageBufferColorPrimaries_ITU_R_2020]) {
                *stopFormatDescriptions = YES;
                *stopTracks = YES;
                isHDRVideo = YES;
            }
        }];
    }];
    
    return isHDRVideo;
}
票数 1
EN

Stack Overflow用户

发布于 2021-02-24 17:35:36

更好的方法是使用simpleVideo.tracks.forEach{$0.hasMediaCharacteristic(.containsHDRVideo)}或avasset.tracks(withMediaCharacteristic:.containsHDRVideo)

票数 1
EN

Stack Overflow用户

发布于 2021-02-01 14:31:19

这篇文章真的对我很有帮助,所以我觉得我必须分享我的发现,为未来的读者提供一种快速的方法。

可以扩展AVAssetTrack以移动定义CMFormatDescription的所有逻辑:

代码语言:javascript
复制
public extension AVAssetTrack {
  var isHDRVideo: Bool {
    guard
      self.mediaType == .video, // If is not a video track is not HDR
      let cmFormatDescription = self.formatDescriptions.map { $0 as!  CMFormatDescription }.first, // Safely get the description
      let transferFunction = CMFormatDescriptionGetExtension(
        cmFormatDescription,
        extensionKey: kCVImageBufferTransferFunctionKey), // It can be nil, which will make the as! CFString fail
    else { return false }

    return [
      kCVImageBufferTransferFunction_ITU_R_2020,
      kCVImageBufferTransferFunction_ITU_R_2100_HLG,
      kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ
    ].contains(transferFunction as! CFString)
  }
}

然后假设你有一个名为assetAVAsset,你可以这样做:

代码语言:javascript
复制
asset.tracks(withMediaType: .video).map { $0.isHDRVideo }

并在此基础上建立你的逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64510556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档