AV Foundation学习笔记二 - 播放器

ASSets

AVFoundation框架的最核心的类是AVAsset,该类是整个AVFoundation框架设计的中心。AVAsset是一个抽象的(意味着你不能调用AVAsset的alloc或者new方法来创建一个AVAsset实例对象,而是通过该类的静态方法来创建实例对象)、不可变(比如NSArray也是个不可变的类)的类,该类包含了media的标题、时长、元数据、资源数据(比如视频的画面和音频的数据),因此,你需要了解该类提供的功能。
AVAsset把media抽象成两个层面:

  1. 是media格式的抽象层,即对于你来说,或者对于AVFoundation框架来说,不管是mp4格式的视频,还是MP3格式的音频,它都仅仅是一个资源(asset),这意味着你不需要关心“它”的实现细节(比如你不需要知道“它”的编码格式,“它”的视频容器类型),但是你也可以了解“它”的实现细节。此外,AVAsset还隐藏了media的存储位置(即media是从哪里获取的),即你不需要知道media是从网络获取的,还是从本地文件读取的。通过“隐藏”了media的格式和存储位置,AVAsset给你提供了一种简单且统一的方式来处理media。
  2. AVAsset不是media本身,而是media的容器。AVAsset包含了一个或者多个media轨道(track)和描述了media内容的元数据(metadata)。AVAssetTrack类既抽象(这里的抽象可以理解为代表)了media轨道(比如音频轨道或者视频轨道),也抽象了字幕、标题,所以AVAssetTrack是AVAsset里面的统一media类型。如下图所示,AVAsset和AVAssetTrack是一对多的关系。
    在这里插入图片描述
    在这里插入图片描述
    你可以通过AVAsset提供的属性或者方法来获取media的时长、创建日期、音轨或者视轨等信息。

Media Metadata(元数据)

media文件(具体指视频文件或者音频文件)一般都会包含用于描述它们内容本身的元数据,比如标题、创作时间、作者等信息。AVFoundation框架提供的AVMetadataItem类用于描述一个个具体的元数据,比如视频标题通过一个AVMetadataItem类的实例对象来表示,作者也是通过一个AVMetadataItem类的实例对象来表示。
虽然每种media类型都有自己独特的编码格式(比如下一小节介绍的QuickTime格式、MPEG-4格式、MP3格式),但幸运的是AVFoundation框架对这些编码格式的细节都进行了抽象,以便让你用一种相对统一的方式来处理media元数据。接下来我们通过一个demo来了解AVFoundation框架如何获取视频文件(比如mp4文件)或者音频文件(比如mp3文件)的元数据的。

Media Metadata demo

如下录屏链接(demo来自《Learning AVFoundation》书中的第3章)所示,我们可以通过AVFoundation框架提供的“操作视频或者音频文件的元数据”的API来读取或者修改视频或者音频文件里面的元数据。

AVAsset类和AVMetadataItem类都属于AVFoundation框架。其中,AVAsset类是对media文件(比如某个mp4文件或者mp3文件)的“抽象”,也就是说,在ios或者mac的app里面,一个AVAsset实例对象就代表了某个具体的media文件,比如代表了A.mp4文件,此时你可以通过AVAsset的metadata属性来获取A.mp4文件的视频标题、文件的创建时间、文件的作者等信息。而AVMetadataItem类则用于描述一个个具体的元数据,比如视频标题通过一个AVMetadataItem类的实例对象来表示,“作者”也是通过一个AVMetadataItem类的实例对象来表示。AVAsset和AVMetadataItem的举例如下图所示。
在这里插入图片描述

Metadata formats(格式)

每种media类型都有自己独特的编码格式,常见的media格式有:QuickTime(文件名以.mov后缀结尾)、MPEG-4(mp4和m4v)、MPEG-4 audio(m4a)和MPEG-Layer 3 audio(mp3)。

QuickTime

QuickTime是苹果开发的一种跨平台的media架构,该架构的一部分就是QuickTime文件格式的规范说明。一个QuickTime文件由被称为atom的数据结构组成。一个atom一般包含media各种类型的数据或者其它atom。下图所示的是某个QuickTime文件内部的结构。
在这里插入图片描述

MPEG-4

MP4(也称MPEG-4)文件格式由QuickTime文件格式演化而来,这意味着MP4文件格式和QuickTime大体类似,MP4文件内部的结构也由atom组成。下图所示的是某个MP4文件内部的结构。
在这里插入图片描述

MP3

MP3文件一般包含了元数据(非必须)和被编码过的音频数据。现在的MP3文件大部分都通过ID3v2格式来存储描述关于音频的描述信息(比如作者名字)。下图所示的是某个MP3文件内部的结构,文件的开头包括文件的格式标识(下图中的文件格式是ID3)、version(版本号)、revision、flags。
在这里插入图片描述

AVPlayer

AVPlayer是AVFoundation框架用于播放视频的接口类,即如果要播放视频或,用它就对了。

  • AVPlayer是一个被用来播放基于时间的media文件的控制器。该控制器并不是UIViewController,而是一个管理播放的普通对象。
  • AVPlayer支持播放本地视频或者网络视频。
  • AVPlayer实例对象支持复用。具体通过replaceCurrentItemWithPlayerItem:方法来切换数据源,进而达到复用播放器的目的。

下图所示的是当我们要播放一个视频时,所涉及的类。
在这里插入图片描述

AVPlayerLayer

AVPlayerLayer是CALayer的子类,所以AVPlayerLayer是一个可视化的组件,并且用于渲染视频内容到屏幕上,用法和CALayer相同(即可以作为UIView的backing layer,也可以直接添加到某个CALayer上)。
AVPlayerLayer有个很常见的属性:videoGravity。videoGravity属性指的是视频画面的拉伸效果,该属性的取值有3个,分别是AVLayerVideoGravityResizeAspect 、AVLayerVideoGravityResizeAspectFill 、AVLayerVideoGravityResize 。下面3张图所示的是,一个16:9的视频在一个4:3的矩形框中 在这3个取值的情况下的效果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

AVPlayerItem

背景:我们一般都是使用AVPlayer来播放AVAsset。如果你看苹果的AVAsset相关的API文档,你可以看到AVAsset的属性和方法都是用于获取media的数据,比如media的创建时间、时长,但是,你没法找到“获取当前播放器已经播放的时长”,也没法找到“seek方法”。那是因为AVAsset只抽象了一个media文件的静态特征,也就是说,AVAsset的属性都是不变的属性,不会随着media文件的播放而发生变化。但是,作为播放器(这里指AVPlayer)的使用方,你肯定需要知道当前视频的已经播放时长、需要seek操作等,于是,AVPlayerItem和AVPlayerItemTrack类就出现了。
AVPlayerItem类抽象类media文件的动态特征。该类提供了seekToTime:方法、currenTime属性等,以便你了解播放器在播放视频时的一些状态。
文章看到了这里,你就能明白为什么通过下面的代码段就可以播放视频。
在这里插入图片描述

播放器状态:AVPlayerItem的status属性(不包括播放结束的状态,因为没有播放结束的状态值!)

AVPlayerItem的status属性表示播放器的状态,如下图所示,我们可以通过KVO的方式来监听播放器状态的变化。
在这里插入图片描述

播放进度的监听

播放器进度的监听不是通过KVO的方式,而是通过AVPlayer的addPeriodicTimeObserverForInterval:queue:usingBlock:方法来实现。具体用法如下图demo代码(来自书的第4章)所示。
在这里插入图片描述

播放结束的监听(居然要通过NSNotification来监听。。)

AVPlayerItem的status属性虽然表示播放器的状态,但表示不全,仅有3个状态(状态如下图所示)。
在这里插入图片描述
播放结束时,我们可以通过监听AVPlayerItemDidPlayToEndTimeNotification来感知到,demo代码(来自书的第4章)如下图所示。
在这里插入图片描述

播放器的核心操作(由AVPlayer类的play、pause、seekToTime、stop方法提供)

如下图所示,AVPlayer提供了视频的播放、暂停、seek操作等方法。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/363252.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中的并发编程

文章目录 并发编程1、进程、线程与协程【1】进程概念【2】线程的概念线程的生命周期进程与线程的区别 【3】协程(Coroutines) 2、多线程实现【1】threading模块【2】线程应用案例【3】线程池【4】互斥锁(同步锁)【5】线程队列(1)队列的基本语法&#xff…

Logback-打印方法名及代码行号

背景 公司产品使用了logback作为日志输出框架,日志输出的pattern里配置了打印调用方法名及代码行号的配置,但是实际输出的日志方法名总是显示? 在强迫症的驱使下,开启了探秘之旅 Logback版本 1.2.3 项目中Logging.pattern配置如下&#xff1…

经典排序算法详解

目录 创作不易,如对您有帮助,还望一键三连,谢谢! 前言 学习目标: 直接插入排序 基本思想: 代码 希尔排序: gap取值 代码 特性总结 选择排序 基本思想 代码 堆排序 思想 代码 冒…

【PHP项目实战训练】——后台-RBAC权限管理原理

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

Ubuntu多显示器设置不同缩放比例

Ubuntu多显示器设置不同缩放比例 设备问题解决方案 设备 笔记本屏幕分辨率为2560 \times 1600,外接显示器的分辨率为3840 \times 2160。 问题 Ubuntu默认的显示器设置中,缩放仅能选择100%,200%,300%,400%。假…

北邮《计算机网络》蒋老师思考题及答案-传输层

蒋yj老师yyds! 答案自制,仅供参考,欢迎质疑讨论 问题一览 传输层思考题P2P和E2E的区别使用socket的c/s模式通信,流控如何反映到编程模型三次握手解决什么问题举一个两次握手失败的例子为什么链路层是两次握手而非三次?…

求生之路史低入手 教你怎么使用求生之路创意工坊提高体验性

求生之路是一款抵御丧尸的第一人称射击游戏,四名幸存者联机配合,在现代的城市中,击败各种丧尸还有强大的变种人BOSS,虽然是十几年前的游戏,但是毫不夸张的说,游戏丝毫不过时,目前steam夏促&…

数据结构5---矩阵和广义表

一、矩阵的压缩存储 特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。 稀疏矩阵:矩阵中有很多零元素。压缩存储的基本思想是: (1)为多个值相同的元素只分配一个存储空间; (2)对零元素不分配存储空间。 1、特殊矩阵的压缩存储 (1)对称矩…

数据库自动备份到gitee上,实现数据自动化备份

本人有个不太好的习惯,每次项目的数据库都是在线上创建,Navicat 连接线上数据库进行处理,最近有一个项目需要二次升级,发现老项目部署的服务器到期了,完蛋,数据库咩了!!!…

从 Hadoop 迁移,无需淘汰和替换

我们仍然惊讶于有如此多的客户来找我们,希望从HDFS迁移到现代对象存储,如MinIO。我们现在以为每个人都已经完成了过渡,但每周,我们都会与一个决定进行过渡的主要、高技术性组织交谈。 很多时候,在这些讨论中&#xff…

游戏AI的创造思路-技术基础-深度学习(5)

继续深度学习技术的探讨,填坑不断,头秃不断~~~~~ 目录 3.5. 自编码器(AE) 3.5.1. 定义 3.5.2. 形成过程 3.5.3. 运行原理 3.5.3.1.运行原理及基本框架 3.5.3.2. 示例代码 3.5.4. 优缺点 3.5.5. 存在的问题和解决方法 3.5…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(三)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

鸿蒙开发 之 健康App案例

1.项目介绍 该项目是记录用户日常饮食情况,以及针对不同食物摄入营养不同会有对应的营养摄入情况和日常运动消耗情况,用户可以自己添加食品以及对应的热量。 1.1登陆页 1.2饮食统计页 1.3 食物列表页 2.登陆页 2.1自定义弹框 import preferences from oh…

使用自定义的shiro密码匹配器CredentialsMatcher完成密码验证

今天突然想研究一下shiro怎么匹配用户的密码。 我们使用shiro的API登录时,会先创建一个令牌对象,而经常用的令牌对象是UsernamePasswordToken,把用户输入的用户名和密码作为参数构建一个UsernamePasswordToken,然后通过Subject.l…

十二、Yocto集成ROS2 app程序(package)

文章目录 Yocto集成ROS2 app程序1. 添加一个ros2 package应用程序2. 添加bb文件集成app应用程序 Yocto集成ROS2 app程序 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第十二篇文章: 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi…

stable diffusion 模型和lora融合

炜哥的AI学习笔记——SuperMerger插件学习 - 哔哩哔哩接下来学习的插件名字叫做 SuperMerger,它的作用正如其名,可以融合大模型或者 LoRA,一般来说会结合之前的插件 LoRA Block Weight 使用,在调整完成 LoRA 模型的权重后使用改插件进行重新打包。除了 LoRA ,Checkpoint 也…

Kafka入门到精通(三)-Kafka

Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动&#xf…

pgsql的套接字文件不存在

问题:psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory 解决方式: 检查 postgresql.conf 文件中的 unix_socket_directories 设置,确保它包含 /tmp 或者你期望的目录。 重…

文本分析|小白教程

在信息爆炸的时代,文本数据无处不在,如何从这些海量的文字中提炼出有价值的信息呢?答案就是——文本分析。文本分析,简单来说,就是对文本数据进行深度的研究和分析。它能够从看似普通的文字中,提取出主题、…

sheng的学习笔记-AI-高斯混合模型(GMM)

AI目录:sheng的学习笔记-AI目录-CSDN博客 需要学习前置知识: 聚类,可参考 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 EM算法,可参考 sheng的学习笔记-AI-EM算法-CSDN博客 贝叶斯,可参考 sheng的学习笔记-AI-…