从AVPlayer的AVPeriodicTimebaseObse

2020-12-03  本文已影响0人  双鱼子曰1987

一、崩溃包裹

分析Bugly奔溃日志,发现以下一个错误:
*** -[AVPeriodicTimebaseObserver initWithTimebase:interval:queue:block:] invalid parameter not satisfying: ((Boolean)(CMTimeCompare(interval, kCMTimeZero) > 0))

错误堆栈如下:

CoreFoundation  ___exceptionPreprocess + 216
1 libobjc.A.dylib   objc_exception_throw + 56
2 AVFCore   ___68-[AVPeriodicTimebaseObserver initWithTimebase:interval:queue:block:]_block_invoke
3 AVFCore   -[AVPlayer addPeriodicTimeObserverForInterval:queue:usingBlock:] + 132
...

由上可知,错误是在监听AVPlayer 播放进度 addPeriodicTimeObserverForInterval:queue:usingBlock: 的时候,非法入参引起的。

二、AVPlayer 播放进度的监听

iOS播放视频常常使用系统的AVPlayer类,视频的进度是通过注册监听获得的。方法如下- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block;
该方法需要指定一个queue,然后在时间间隔interval内通过block回调回来。

三、说说CMTime

3.1、CMTime的基本概念
po CMTimeMakeWithSeconds(60, 600);

(CMTime) time = 36000 600ths of a second {
  value = 36000  60*600
  timescale = 600
  flags = kCMTimeFlags_Valid
  epoch = 0
}
typedef struct
{
    CMTimeValue value;
    CMTimeScale timescale;
    CMTimeFlags flags; //flags 为一个位枚举
    CMTimeEpoch epoch;
} CMTime;

typedef int64_t CMTimeValue;
typedef int32_t CMTimeScale;
typedef int64_t CMTimeEpoch;

我们一般关心 valuetimescale 的赋值。

3.2、CMTime常用操作方法

(CMTime) time1 = 0 seconds {
  value = 0
  timescale = 1
  flags = kCMTimeFlags_Valid
  epoch = 0
}

其他

视频合成中CMTime的理解,以及利用CMTime实现过渡效果
CGTime CMTimeRange CMTimeMapping 小结

上一篇 下一篇

猜你喜欢

热点阅读