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

1,043 阅读3分钟

去年因为视频压缩转码方面的一些需求需要判断 AVAsset 的编码类型是否为 H.264,然后就整理了这篇笔记,但是忘记发出来了 2748810-fdd2ac150a767702.jpeg 思路大概分三步: 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));