iOS 判断 AVAsset 的编码类型是否是 H.264

去年因为视频压缩转码方面的一些需求需要判断 AVAsset 的编码类型是否为 H.264,然后就整理了这篇笔记,但是忘记发出来了



思路大概分三步:

1.从 AVAsset 的轨道中取出视频轨道
2.从视频轨道中获取视频格式信息
3.从视频格式信息中获取视频编码类型

AVAsset 的轨道集合:

/*!
  @property     tracks
  @abstract     Provides the array of AVAssetTracks contained by the asset
*/
@property (nonatomic, readonly) NSArray<AVAssetTrack *> *tracks;

以下代码可以建一个 AVAsset 的 Category

@implementation AVAsset (PSExtends)

/// 1.从 AVAsset 的轨道中取出视频轨道
- (AVAssetTrack *)ps_videoAssetTrack
{
    NSArray<AVAssetTrack *> *tracksArray = self.tracks;
    AVAssetTrack *videoAssetTrack = nil;
    for (AVAssetTrack *track in tracksArray) {
        if ([track.mediaType isEqualToString:AVMediaTypeVideo]) {
            videoAssetTrack = track;
            break;
        }
    }
    return videoAssetTrack;
}

- (BOOL)ps_isH264
{
    BOOL isH264 = NO;
    AVAssetTrack *videoAssetTrack = [self ps_videoAssetTrack];
    if (videoAssetTrack) {
        isH264 = videoAssetTrack.ps_isH264;
    }
    return isH264;
}

- (BOOL)ps_isHEVC
{
    BOOL isHEVC = NO;
    AVAssetTrack *videoAssetTrack = [self ps_videoAssetTrack];
    if (videoAssetTrack) {
        isHEVC = videoAssetTrack.ps_isHEVC;
    }
    return isHEVC;
}

@end

@implementation AVAssetTrack (PSExtends)

/// 2.从视频轨道中获取视频格式信息
- (CMFormatDescriptionRef)ps_CMFormatDescriptionRef
{
    NSArray *formatDescriptions = [self formatDescriptions];
    CMFormatDescriptionRef formatDescription = (__bridge CMFormatDescriptionRef)(formatDescriptions.firstObject);
    return formatDescription;
}

/// 3.从视频格式信息中获取视频编码类型
- (CMVideoCodecType)ps_CMVideoCodecType
{
    CMFormatDescriptionRef formatDescription = [self ps_CMFormatDescriptionRef];
    CMVideoCodecType codecType = CMVideoFormatDescriptionGetCodecType(formatDescription);
    return codecType;
}

- (BOOL)ps_isH264
{
    BOOL isH264 = NO;
    CMVideoCodecType codecType = [self ps_CMVideoCodecType];
    isH264 = (codecType == kCMVideoCodecType_H264);
    return isH264;
}

- (BOOL)ps_isHEVC
{
    BOOL isHEVC = NO;
    CMVideoCodecType codecType = [self ps_CMVideoCodecType];
    isHEVC = (codecType == kCMVideoCodecType_HEVC);
    return isHEVC;
}

@end

其他编码类型:

/*!
    @enum CMVideoCodecType
    @discussion Four-character codes identifying the video codec. Certain codec types are also pixel formats.
                  Note: There is no kCMVideoCodecType_Raw -- use the appropriate pixel format type as the codec type.
    @constant   kCMVideoCodecType_422YpCbCr8    Component Y'CbCr 8-bit 4:2:2 ordered Cb Y'0 Cr Y'1
    @constant   kCMVideoCodecType_Animation     Apple Animation format
    @constant   kCMVideoCodecType_Cinepak   Cinepak format
    @constant   kCMVideoCodecType_JPEG  Joint Photographic Experts Group (JPEG) format
    @constant   kCMVideoCodecType_JPEG_OpenDML  JPEG format with Open-DML extensions
    @constant   kCMVideoCodecType_SorensonVideo     Sorenson video format
    @constant   kCMVideoCodecType_SorensonVideo3    Sorenson 3 video format
    @constant   kCMVideoCodecType_H263  ITU-T H.263 format
    @constant   kCMVideoCodecType_H264  ITU-T H.264 format (AKA ISO/IEC 14496-10 - MPEG-4 Part 10, Advanced Video Coding format)
    @constant   kCMVideoCodecType_HEVC  ITU-T HEVC format
    @constant   kCMVideoCodecType_HEVCWithAlpha HEVC format with alpha support defined in Annex-F.
                  IMPORTANT NOTE: this constant is used to select the appropriate encoder, but is NOT used on the encoded content,
                  which is backwards compatible and hence uses 'hvc1' as its codec type.
    @constant   kCMVideoCodecType_MPEG4Video    ISO/IEC Moving Picture Experts Group (MPEG) MPEG-4 Part 2 video format
    @constant   kCMVideoCodecType_MPEG2Video    MPEG-2 video format
    @constant   kCMVideoCodecType_MPEG1Video    MPEG-1 video format
    @constant   kCMVideoCodecType_DVCNTSC   DV NTSC format
    @constant   kCMVideoCodecType_DVCPAL    DV PAL format
    @constant   kCMVideoCodecType_DVCProPAL     Panasonic DVCPro PAL format
    @constant   kCMVideoCodecType_DVCPro50NTSC  Panasonic DVCPro-50 NTSC format
    @constant   kCMVideoCodecType_DVCPro50PAL   Panasonic DVCPro-50 PAL format
    @constant   kCMVideoCodecType_DVCPROHD720p60    Panasonic DVCPro-HD 720p60 format
    @constant   kCMVideoCodecType_DVCPROHD720p50    Panasonic DVCPro-HD 720p50 format
    @constant   kCMVideoCodecType_DVCPROHD1080i60   Panasonic DVCPro-HD 1080i60 format
    @constant   kCMVideoCodecType_DVCPROHD1080i50   Panasonic DVCPro-HD 1080i50 format
    @constant   kCMVideoCodecType_DVCPROHD1080p30   Panasonic DVCPro-HD 1080p30 format
    @constant   kCMVideoCodecType_DVCPROHD1080p25   Panasonic DVCPro-HD 1080p25 format
    @constant   kCMVideoCodecType_AppleProRes4444XQ Apple ProRes 4444 XQ format
    @constant   kCMVideoCodecType_AppleProRes4444   Apple ProRes 4444 format
    @constant   kCMVideoCodecType_AppleProRes422HQ  Apple ProRes 422 HQ format
    @constant   kCMVideoCodecType_AppleProRes422    Apple ProRes 422 format
    @constant   kCMVideoCodecType_AppleProRes422LT  Apple ProRes 422 LT format
    @constant   kCMVideoCodecType_AppleProRes422Proxy   Apple ProRes 422 Proxy format
    @constant   kCMVideoCodecType_AppleProResRAW    Apple ProRes RAW format
    @constant   kCMVideoCodecType_AppleProResRAWHQ  Apple ProRes RAW HQ format
*/
typedef FourCharCode CMVideoCodecType API_AVAILABLE(macos(10.7), ios(4.0), tvos(9.0), watchos(6.0));
#if COREMEDIA_USE_DERIVED_ENUMS_FOR_CONSTANTS
enum : CMVideoCodecType
#else
enum
#endif
{
    kCMVideoCodecType_422YpCbCr8       = kCMPixelFormat_422YpCbCr8,
    kCMVideoCodecType_Animation        = 'rle ',
    kCMVideoCodecType_Cinepak          = 'cvid',
    kCMVideoCodecType_JPEG             = 'jpeg',
    kCMVideoCodecType_JPEG_OpenDML     = 'dmb1',
    kCMVideoCodecType_SorensonVideo    = 'SVQ1',
    kCMVideoCodecType_SorensonVideo3   = 'SVQ3',
    kCMVideoCodecType_H263             = 'h263',
    kCMVideoCodecType_H264             = 'avc1',
    kCMVideoCodecType_HEVC             = 'hvc1',
    kCMVideoCodecType_HEVCWithAlpha    = 'muxa',
    kCMVideoCodecType_MPEG4Video       = 'mp4v',
    kCMVideoCodecType_MPEG2Video       = 'mp2v',
    kCMVideoCodecType_MPEG1Video       = 'mp1v',
    kCMVideoCodecType_VP9              = 'vp09',

    kCMVideoCodecType_DVCNTSC          = 'dvc ',
    kCMVideoCodecType_DVCPAL           = 'dvcp',
    kCMVideoCodecType_DVCProPAL        = 'dvpp',
    kCMVideoCodecType_DVCPro50NTSC     = 'dv5n',
    kCMVideoCodecType_DVCPro50PAL      = 'dv5p',
    kCMVideoCodecType_DVCPROHD720p60   = 'dvhp',
    kCMVideoCodecType_DVCPROHD720p50   = 'dvhq',
    kCMVideoCodecType_DVCPROHD1080i60  = 'dvh6',
    kCMVideoCodecType_DVCPROHD1080i50  = 'dvh5',
    kCMVideoCodecType_DVCPROHD1080p30  = 'dvh3',
    kCMVideoCodecType_DVCPROHD1080p25  = 'dvh2',
    
    kCMVideoCodecType_AppleProRes4444XQ = 'ap4x',
    kCMVideoCodecType_AppleProRes4444  = 'ap4h',
    kCMVideoCodecType_AppleProRes422HQ = 'apch',
    kCMVideoCodecType_AppleProRes422   = 'apcn',
    kCMVideoCodecType_AppleProRes422LT = 'apcs',
    kCMVideoCodecType_AppleProRes422Proxy = 'apco',

    kCMVideoCodecType_AppleProResRAW   = 'aprn',
    kCMVideoCodecType_AppleProResRAWHQ = 'aprh',
} API_AVAILABLE(macos(10.7), ios(4.0), tvos(9.0), watchos(6.0));

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容