视频播放

2020-07-24  本文已影响0人  浪呀么浪打浪

1.1 AVPlayer

AVPlayer是一个用来播放基于时间的视听媒体的控制器对象。支持播放从本地、分布下载或通过HTTP Live Streaming 协议得到的流媒体。我们说的“控制器”,不是一个视图或窗口控制器,而是一个对播放和资源时间相关信息进行管理的对象。AVPlayer是一个不可见组件。

AVPlayer只管理一个单独资源的播放,不过框架还提供了AVPlayer的一个子类AVQu eue-Player,可以用来管理一个资源队列。当你需要在一个序列中播放多个条目或者为音频、视频资源设置播放循环时间时可使用此类。

1.2 AVPlayerLayer

AVPlayerLayer构建于Core Animation 之上,是AVFoundation 中能找到的为数不多的可见组件。Core Animation本身具有基于时间的属性,并且由于它基于OpenGL,所以具有很好的性能,能非常好的满足AVFoundation的各种需要。

AVPlayerLayer扩展了Core Animation 的CALayer类,并通过框架在屏幕上显示视频内容。用作视频内容的渲染面。AVPlayerLayer与其他CALayer一样,可以设置为UIView或NSView的备用层,或者可以手动添加到一个已有的层继承关系中。

AVPlayerLayer是一个相对简单的类,使用起来也简单。在这一层中开发者可以自定义的领域只有video gravity.

1.3 AVPlayerItem

我们最终的目的是使用AVPlayer来播放AVAsset。若果查看AVAsset文档,可以找到一些用来获取数据的方法和属性,比如创建日期、元数据和时长等信息。不过无法查到如何获取当前时间的方法,也没有在媒体中查找特定位置的方法。这是因为AVAsset模型只包含媒体资源的静态信息,这些不变的属性用来描述对象的静态状态。这意味着仅使用AVAsset对象是无法实现播放功能的。对一个资源及相关曲目进行播放时,首先需要通过AVPlayerItem和AVPlayerItemTrack类构建相应的动态内容。

AVPlayerItem会建立媒体资源动态视角的数据模型并保存AVPlayer在播放资源时的呈现状态。AVPlayerItem由一个或多个媒体曲目组成,由AVPlayerItemTrack类建立模型。AVPlayerItemTrack实例用于表示播放器条目中的类型统一的媒体流,比如音频或视频。AVPlayerItem中的曲目直接与基础AVAsset中的AVAssetTrack对应。

2.播放秘籍

/Users/leiyang/Desktop/项目存储/SouthRain/SouthRain/Classes/Example\(代码\)/AVFoundation/Controller/YLCapter4ViewController.m 

3.处理时间

AVPlayer和AVPlayerItem都是基于时间的对象。时间是以NSTimeInterval表示的,其实就是简单的对double值进行了typedef定义。不过使用浮点型数据类型表示时间存在一定问题,因为浮点型数据的运算会导致不精确的情况。当进行多时间计算累加时这些不精确的情况就会特别严重,经常会导致时间的明显偏移,使得媒体的多个数据几乎无法实现同步。此外,以浮点型数据呈现时间信息无法做到自我描述,这就导致在使用不同时间轴进行比较和运算时比较困难。AVFoundation使用CMTime展示时间信息。

CMTime:AVFoundation是基于Core Media的高层封装。Core Media是基于C的底层框架,提供了许多处理Mac 和iOS媒体栈的关键功能。

typedef struct

{

CMTimeValue value;

CMTimeScale timescale; 

CMTimeFlags flags; 

CMTimeEpoch epoch; 

} CMTime

这里的timescale并非是时间轴缩放,而是value的缩放。显然,CMTime定义是一个C语言的结构体,CMTime是以分数的形式表示时间,value表示分子,timescale表示分母,flags是位掩码,表示时间的指定状态。

CMTime是专门用于标识电影时间的结构体,通常用如下两个函数来创建CMTime.

1、CMTimeMake

CMTime CMTimeMake(int64_tvalue,//表示 当前视频播放到的第几桢数int32_ttimescale//每秒的帧数);

2、CMTime ·CMTimeMakeWithSeconds(Float64 seconds,//第几秒的截图,是当前视频播放到的帧数的具体时间int32_tpreferredTimeScale//首选的时间尺度 "每秒的帧数");

NSEC_PER_SEC,每秒有多少纳秒。

USEC_PER_SEC,每秒有多少毫秒。(注意是指在纳秒的基础上)

NSEC_PER_USEC,每毫秒有多少纳秒。

4.创建视频播放器

5.时间监听

1.定期监听

以一定的时间间隔获得通知。如果需要随着时间的变化移动播放头位置或更新时间显示。利用AVPlayer的- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block可以很容易间听到此类变化。

interval:一个用于指定通知周期间隔的CMTime值。

queue:通知发送的顺序调度队列。大多数时候,我们希望这些通知消息发生在主队列,在如果没有明确指定的情况下默认为主队列。需要重点注意的是不可以使用并行调度队列。因为API没有处理并行队列的方法,否则会导致一些不可知的问题。

block:一个在指定的时间间隔中将会在队列上调用的回调块。这个块传递一个CMTime值用于指示播放器的当前时间。

2.边界时间监听

AVPlayer还提供了一种更有针对性的方法来监听时间,应用程序可以得到播放器时间轴中多个边界点的遍历结果。这一方法主要用于同步用户界面变更或随着视频播放记录一些非可视化数据。比如:可以定义25%,50%和75%边界的标记。以此判断用户播放进度。- (id)addBoundaryTimeObserverForTimes:(NSArray<NSValue *> *)times queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(void))block.

times:CMTime值组成的一个NSArray数组定义了需要通知的边界点。

queue:与定期监听类似,为方法提供一个用来发送通知的顺序调度队列。指定Null等同于明确设置主队列。

block:每当正常播放中跨越一个边界点时就会在队列中调用这个回掉块。有趣的事,盖块不提供遍历的CMTime值,所以开发者需要为此执行一些额外计算进行确定。

3.条目结束监听

当播放完成时,AVPlayer会发送一个AVPlayerItemDidPlayToEndTimeNotification通知。

cancelPendingSeeks是经过性能优化的,如果前一个搜索请求没有完成,则避免出现操作堆积情况的出现。开发者可调用seekTime开启一个新的搜索。

6.创建可视擦条

AVAssetImageGenerator.这个类可用来从一个AVAsse视频曲目中提取图片。这样可以生成一个或多个缩略图。用来提升应用程序用户界面的效果。

AVAssetImageGenerator定义了两个方法实现从视频资源中检索图片。分别为:

- (nullableCGImageRef)copyCGImageAtTime:(CMTime)requestedTime actualTime:(nullableCMTime*)actualTime error:(NSError*_Nullable*_Nullable)outError。允许在指定时间点捕捉图片。如果开发者希望捕捉一张图片那么这个方法是最合适的,可能用于在视频列表中展示视频缩略图。

- (void)generateCGImagesAsynchronouslyForTimes:(NSArray<NSValue *> *)requestedTimes completionHandler:(AVAssetImageGeneratorCompletionHandler)handler;允许按照第一个参数所指定的时间段生成一个图片序列。该方法具有很高的性能,只需要调用这一个方法就可以生成一组图片。requestedTime:请求的最初时间。它对应于生成图像的调用中指定的times数组中的值。CGImageRef:生成的图片。actualTime:生成图片的实际时间。这个值可能与请求时间不同。AVAssetImageGenerator可以使用requestedTimeToleranceAfter和requestedTimeToleranceBefore调整requestedTime和actualTime的接近程度。

AVAssetImageGenerator即可以生成本地图片,也可以生成持续下载的资源。不过它不能从HTTPLiveSteam生成图片。

7.显示字幕

  AVMediaSelectionGroup和    AVMediaSelectionOption。

AVMediaSelectionOption表示AVAsset中的备用媒体呈现方式。一个资源可能包含备用媒体呈现方式。比如备用音频、视频或文本轨道。使用AVAsset的availableMediaCharacteristicsWithMediaSelectionOptions属性确定存在哪些备用轨道。返回数组所包含的字符串值为AVMediaCharacteristicVisual(视频)、AVMediaCharacteristicAudible(音频)、AVMediaCharacteristicLegible(字幕或隐藏式字幕    )。

通过调用AVPlayerItem的- (void)selectMediaOption:(nullableAVMediaSelectionOption*)mediaSelectionOptioninMediaSelectionGroup:(AVMediaSelectionGroup*)mediaSelectionGroup 方法修改字幕。

8.AirPlay

AirPlay旨在用无线方式将流媒体音频和视频内容在Apple TV上播放,或者将纯音频内容在第三方音频系统中播放。

AVPlayer有一个属性allowsExternalPlayback,允许或禁用AirPlay功能。

iOS并没有AirPlay框架或者API供开发者使用,取而代之的是我们使用MediaPlayer框架中的MPVolumeView类来实现这个功能。若果用户的网络中存在AirPlay设备,则会额外显示一个AirPlay路线选择按钮。点击按钮会显示所有可用的AirPlay列表。

上一篇下一篇

猜你喜欢

热点阅读