AVFoundation 简单入门二

在上两篇文章的基础上,我们初步认识了AV Foundation框架,并且可以利用它完成一些特定的需求,今天,继续我们的小小的研究。日进一步,不求速成。

通过了解我们知道,AV Foundation可以用来播放和创建基于时间的音视频资源,并可以精确的处理基于时间的音视频媒体数据(查找、创建、编辑及二次编码),当然也可以在硬件设备上获取实时的视频输入流或视频回放等。AV Foundation可以满足您对媒体数据的大部分处理。

在处理之前,我们需要大致的了解下媒体工程软件里的相关类。一个工程文件中有很多轨道,如音频轨道1,音频轨道2 …,视频轨道1,视频轨道2等,每个轨道里有许多素材,对于每个视频素材,它可以进行缩放、旋转等操作,素材库中的视频拖到轨道中会分为视频轨和音频轨两个轨道。大致分为以下几个:

AVAsset:素材库里的素材;
AVAssetTrack:素材的轨道;
AVMutableComposition :一个用来合成视频的工程文件;
AVMutableCompositionTrack :工程文件中的轨道,有音频轨、视频轨等,里面可以插入各种对应的素材;
AVMutableVideoCompositionLayerInstruction:视频轨道中的一个视频,可以缩放、旋转等;
AVMutableVideoCompositionInstruction:一个视频轨道,包含了这个轨道上的所有视频素材;
AVMutableVideoComposition:管理所有视频轨道,可以决定最终视频的尺寸,裁剪需要在这里进行;
AVAssetExportSession:配置渲染参数并渲染。

AVAsset

AVFoundation使用AVAsset类来表示一个媒体资源,一个AVAsset实例是一个或多个音视频媒体数据的集合,是一个抽象类。可以使用子类用URL来创建一个asset对象,也可以基于现有的媒体资源创造一个新的媒体资源。下面是AVAsset中的一些属性,分别对应着视频的基本信息,如时长,创建时间等。

代码是最好的老师,创建一个AVAsset:

为了创建一个由URL标识的代表任何资源的assert对象,可以使用AVURLAssert,最简单的是从文件里创建一个assert对象:

AVURLAsset初始化方法的第二个参数使用一个dictionary,这个dictionary里的唯一一个key是 AVURLAssetPreferPreciseDurationAndTimingKey,它的value是一个boolean类型(用NSValue包装的对象),这个值表示asset是否提供一个精确的duration。

AVURLAssetPreferPreciseDurationAndTimingKey值为NO(不传默认为NO),duration会取一个估计值,计算量比较小。反之如果为YES,duration需要返回一个精确值,计算量会比较大,耗时比较长。使用一个预估的duration效率比较高并且对播放来说足够。如果你想要播放asset,初始化方法传nil就行了,而不是一个dictionry,或者传一个以AVURLAssetPreferPreciseDurationAndTimingKeydictionary为key,值为NO的一个dictionary;如果你想把asset加到一个composition中,你需要一个精确的访问权限,这时你可以传一个dictionary,这个dictionary的一组键值对为AVURLAssetPreferPreciseDurationAndTimingKey和YES。

从asset中获取静态图片(比如说缩略图),你可以用AVAssetImageGenerator对象。可以用asset初始化一个AVAssetImageGenerator对象,即使asset在初始化的时候没有可见的track也能成功,所以需要使用tracksWithMediaCharacteristic检测asset是否有track。generateCGImagesAsynchronouslyForTimes:completionHandler: 方法可以生成一系列图片,第一个参数是一个包含NSValue类型的数组,数组里每一个对象都是CMTime结构体,表示你想要生成的图片在视频中的时间点,第二个参数是一个block,每生成一张图片都会回调这个block,这个block提供一个result的参数告诉你图片是否成功生成或者图片生成操作是否取消。

AVAssetTrack

一般的视频至少有2个轨道,一个播放声音,一个播放画面。在AVAsset中,可以通过trackId,获得特定的track。

除了通过trackID获得track之外,AVAsset中还提供了其他3中方式获得track:

tracks中包含了当前Asset中的所有track,通过遍历我们可以获得想要的track。

-tracksWithMediaType:方法会根据指定的媒体类型返回一个track数组,数组中包含着Asset中所有指定媒体类型的track。如果Asset中没有这个媒体类型的track,返回一个空数组。AVMediaFormat中一共定义了8种媒体类型: AVMediaTypeVideo、AVMediaTypeAudio、AVMediaTypeText、AVMediaTypeClosedCaption、AVMediaTypeSubtitle、AVMediaTypeTimecode、AVMediaTypeMetadata、AVMediaTypeMuxed。

-tracksWithMediaCharacteristic:方法会根据指定的媒体特征返回track数组,数组的特性与-tracksWithMediaType:类似,如果Asset中没有这个媒体特征的track,返回一个空数组。AVMediaFormat中一共定义了15种媒体特征: AVMediaTypeMetadataObject、AVMediaCharacteristicVisual、AVMediaCharacteristicAudible、AVMediaCharacteristicLegible、AVMediaCharacteristicFrameBased、AVMediaCharacteristicIsMainProgramContent、AVMediaCharacteristicIsAuxiliaryContent、AVMediaCharacteristicContainsOnlyForcedSubtitles、AVMediaCharacteristicTranscribesSpokenDialogForAccessibility、AVMediaCharacteristicDescribesMusicAndSoundForAccessibility、AVMediaCharacteristicEasyToRead、AVMediaCharacteristicDescribesVideoForAccessibility、AVMediaCharacteristicLanguageTranslation、AVMediaCharacteristicDubbedTranslation、AVMediaCharacteristicVoiceOverTranslation。

代码实现:


下面看一个小例:

补充上篇录制视频的示例:

1 1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部