浅谈AVAsset

众所周知,AVFoundation给我们提供了一个非常大的可扩展的框架,我们可以通过这个框架,对媒体资源进行捕捉,组合,播放,处理等功能.这篇文章,则是主要介绍AVFoundation框架中,一个非常重要的类AVAsset.
1.何为AVAsset
AVAsset是一个抽象类和不可变类,定义了媒体资源混合呈现的方式.可以让我们开发者在处理时基媒体提供了一种简单统一的方式,它并不是媒体资源,但是它可以作为时基媒体的容器.
2.创建方法
当我们想为一个媒体资源创建AVAsset对象时,可以通过URL对它进行初始化,URL可以是本地资源也可以是一个网络资源
<code>NSURLassetUrl = [NSURL URLWithString:@"1234"];
AVAsset
asset = [AVAsset asetWithURL:assetUrl];</code>

通过对asset打印可以得知,当它通过asetWithURL方法进行创建时,实际上是创建了它子类AVUrlAsset的一个实例,而AVAsset是一个抽象类,不能直接被实例化.
通过AVUrlAsset我们可以创建一个带选项(optional)的asset,以提供更精确的时长和计时信息

An instance of NSDictionary that contains keys for specifying options for the initialization of the AVURLAsset. See** AVURLAssetPreferPreciseDurationAndTimingKey** and AVURLAssetReferenceRestrictionsKey above.

  • (instancetype)URLAssetWithURL:(NSURL*)URL options:(nullableNSDictionary *)options;<
NSURL*assetUrl = [NSURLURLWithString:@"1234"];
NSDictionary*optional =@{@"AVURLAssetPreferPreciseDurationAndTimingKey":@(YES)};
AVURLAsset*urlAsset = [[AVURLAssetalloc]initWithURL:assetUrloptions:optional];

3.属性
AVAsset具有多种有用的方法和属性,比如时长,创建日期和元数据等

/* Indicates the duration of the asset. If @"providesPreciseDurationAndTiming" is NO, a best-available estimate of the duration is returned. The degree of precision preferred for timing-related properties can be set at initialization time for assets initialized with URLs. See AVURLAssetPreferPreciseDurationAndTimingKey for AVURLAsset below.
*/
@property (nonatomic, readonly) CMTime duration;

/* indicates the natural rate at which the asset is to be played; often but not always 1.0
*/
@property (nonatomic, readonly) float preferredRate;

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

@property (nonatomic, readonly, nullable) AVMetadataItem *creationDate

其中duration的属性是一个CMTime的结构体

typedef struct
{
 CMTimeValue value;  /*! @field value The value of the CMTime. value/timescale = seconds. */
 CMTimeScale timescale; /*! @field timescale The timescale of the CMTime. value/timescale = seconds.  */
 CMTimeFlags flags;  /*! @field flags The flags, eg. kCMTimeFlags_Valid, kCMTimeFlags_PositiveInfinity, etc. */
 CMTimeEpoch epoch;  /*! @field epoch Differentiates between equal timestamps that are actually different because
             of looping, multi-item sequencing, etc.  
             Will be used during comparison: greater epochs happen after lesser ones. 
             Additions/subtraction is only possible within a single epoch,
             however, since epoch length may be unknown/variable. */
} CMTime;

获取一个asset的时长用value/timescale即可
4.异步载入
由于是当创建时,资源就是对媒体文件进行处理.AVAsset使用一种高效的设计方法,延迟载入资源的属性,什么时候使用,什么时候再加载.虽然这可以解决一些由于直接加载数据带来的问题,但是访问AVAsset的属性如果耗时较长,而又发生在主线程,就会阻塞主线程,使界面无法响应.
所以AVAsset和AVAssetTrack都遵守了**
AVAsynchronousKeyValueLoading**协议
这是协议的两个方法

- (AVKeyValueStatus)statusOfValueForKey:(NSString *)key error:(NSError * __nullable * __nullable)outError;
- (void)loadValuesAsynchronouslyForKeys:(NSArray<NSString *> *)keys completionHandler:(nullable void (^)(void))handler;

通过statusOfValueForKey方法查询一个给定属性的状态,该方法会返回一个枚举类型的AVKeyValueStatus值,用于标识状态
通过调用loadValuesAsynchronouslyForKeys: completionHandler:方法,为其提供一个属性的数组,当资源出狱回应请求状态就会调用completionHandler代码快

通过一个例子来进行演示


    AVAsset *asset = [AVAsset assetWithURL:assetUrl];
    NSArray *keys = @[@"tracks",
                      @"playable",
                      @"duration"];
    
    __weak typeof(asset) weakAsset = asset;
    __weak typeof(self) weakSelf = self;
    [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            // check the keys
            for (NSString *key in keys) {
                NSError *error = nil;
                AVKeyValueStatus keyStatus = [weakAsset statusOfValueForKey:key error:&error];
                
                switch (keyStatus) {
                    case AVKeyValueStatusFailed:{
                        // failed
                        break;
                    }
                    case AVKeyValueStatusLoaded:{
                        // success
                        break;
                    }case AVKeyValueStatusCancelled:{
                        // cancelled
                        break;
                    }
                    default:
                        break;
                }
            }
            
            // check playable
            if (!weakAsset.playable) { // 不能播放
                return;
            }
            
        });
    }];

通常情况下只需监听tracks一个属性即可,但是官方文档上有这么一段话,所以在代码里监听了三个属性

The completion states of the keys you specify in keys
are not necessarily the same—some may be loaded, and others may have failed. You must check the status of each key individually using thestatusOfValue(forKey:error:)
method.

当然我们亦可以通过苹果提供的方法取消监听

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

推荐阅读更多精彩内容