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操作等方法。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

社团成员信息系统

ER实体关系图与数据库模型 DDL CREATE TABLE club (club_id int(11) NOT NULL AUTO_INCREMENT,club_name varchar(100) NOT NULL,president_name varchar(50) DEFAULT NULL,foundation_date date DEFAULT NULL,description text,PRIMARY KEY (club_id),KEY president_name (pr…

DP(动态规划)【2】 最大连续子列和 最长不降子序列

1.最大连续子列和 #include <iostream> #include <vector> #include <cmath> #include <string> #include <cstring> #include <queue> using namespace std; const int N10002,maxn10;int n,m,k,f[N]{0},dp[N]{0};int main() {scanf(&quo…

1.SQL注入-数字型

SQL注入-数字型(post) 查询1的时候发现url后面的链接没有传入1的参数。验证为post请求方式&#xff0c;仅显示用户和邮箱 通过图中的显示的字段&#xff0c;我们可以猜测传入数据库里面的语句&#xff0c;例如&#xff1a; select 字段1,字段2 from 表名 where id1; 编辑一个…

【漏洞复现】宏景HCM人力资源信息管理系统——任意文件读取漏洞

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 宏景HCM人力资源信息管理系统是一款全面覆盖人力资源管理各模块…

GPT-4o首次引入!全新图像自动评估基准发布!

目录 01 什么是DreamBench&#xff1f; 02 与人类对齐的自动化评估 03 更全面的个性化数据集 04 实验结果 面对层出不穷的个性化图像生成技术&#xff0c;一个新问题摆在眼前&#xff1a;缺乏统一标准来衡量这些生成的图片是否符合人们的喜好。 对此&#xff0c;来自清华大…

心理辅导平台系统

摘 要 中文本论文基于Java Web技术设计与实现了一个心理辅导平台。通过对国内外心理辅导平台发展现状的调研&#xff0c;本文分析了心理辅导平台的背景与意义&#xff0c;并提出了论文研究内容与创新点。在相关技术介绍部分&#xff0c;对Java Web、SpringBoot、B/S架构、MVC模…

lvs+上一章的内容

书接上回这次加了个keepalived 一、集群与分布式 1.1 集群介绍 **集群&#xff08;Cluster&#xff09;**是将多台计算机组合成一个系统&#xff0c;以解决特定问题的计算机集合。集群系统可以分为以下三种类型&#xff1a; **LB&#xff08;Load Balancing&#xff0c;负载…

Golang | Leetcode Golang题解之第203题移除链表元素

题目&#xff1a; 题解&#xff1a; func removeElements(head *ListNode, val int) *ListNode {dummyHead : &ListNode{Next: head}for tmp : dummyHead; tmp.Next ! nil; {if tmp.Next.Val val {tmp.Next tmp.Next.Next} else {tmp tmp.Next}}return dummyHead.Next …

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 数字排列游戏(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

【论文复现】——基于LM优化的NDT点云配准算法

目录 一、算法原理1、论文概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 1、论文概述 传统的正态分布变换配准算法处理初始位姿变换相…

修改网络的结构用于预训练

目录 一、模型准备 二、修改结构 1、在网络中添加一层 2、在classifier结点添加一个线性层 3、修改网络中的某一层(features 结点举例&#xff09; 4、替换网络中的某一层结构&#xff08;与第3点类似&#xff09; 5、提取全连接层的输入特征数和输出特征数 6、删除网络…

springboot + Vue前后端项目(第二十一记)

项目实战第二十一记 写在前面1. springboot文件默认传输限制2. 安装视频插件包命令3. 前台Video.vue4. 创建视频播放组件videoDetail.vue5. 路由6. 效果图总结写在最后 写在前面 本篇主要讲解系统集成视频播放插件 1. springboot文件默认传输限制 在application.yml文件中添…

《昇思25天学习打卡营第2天|快速入门》

文章目录 前言&#xff1a;今日所学&#xff1a;1. 数据集处理2. 网络的构建3. 模型训练4. 保存模型5. 加载模型 总体代码与运行结果&#xff1a;1. 总体代码2. 运行结果 前言&#xff1a; 今天是学习打卡的第2天&#xff0c;今天的内容是对MindSpore的一个快速入门&#xff0…

Selenium IDE 的使用指南

Selenium IDE 的使用指南 在自动化测试的领域中&#xff0c;Selenium 是一个广为人知且强大的工具集。而 Selenium IDE 作为其中的一个组件&#xff0c;为测试人员提供了一种便捷且直观的方式来创建和执行自动化测试脚本。 一、Selenium IDE 简介 Selenium IDE 是一个用于录…

第十三章 常用类

一、包装类 1. 包装类的分类 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型—包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 2. 包装类和基本数据的转换 jdk5 前的手动装箱和拆箱方式&#xff0c;装箱&#xff1a;基本…

【Qt】信号和槽机制

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

操作系统之《PV操作》【知识点+详细解题过程】

1、并发进程 &#xff1a; 并发的实质是一个处理器在几个进程之间的多路复用&#xff0c;并发是对有限的物理资源强制行使多用户共享&#xff0c;消除计算机部件之间的互等现象&#xff0c;以提高系统资源利用率。 &#xff08;1&#xff09;并发进程——互斥性&#xff1a; 进…

使用Jetpack Compose实现具有多选功能的图片网格

使用Jetpack Compose实现具有多选功能的图片网格 在现代应用中,多选功能是一项常见且重要的需求。例如,Google Photos允许用户轻松选择多个照片进行分享、添加到相册或删除。在本文中,我们将展示如何使用Jetpack Compose实现类似的多选行为,最终效果如下: 主要步骤 实现…

【redis】Redis AOF

1、AOF的基本概念 AOF持久化方式是通过保存Redis所执行的写命令来记录数据库状态的。AOF以日志的形式来记录每个写操作&#xff08;增量保存&#xff09;&#xff0c;将Redis执行过的所有写指令记录下来&#xff08;读操作不记录&#xff09;。AOF文件是一个只追加的文件&…

Redis 高级数据结构业务实践

0、前言 本文所有代码可见 > 【gitee code demo】 本文会涉及 hyperloglog 、GEO、bitmap、布隆过滤器的介绍和业务实践 1、HyperLogLog 1.1、功能 基数统计&#xff08;去重&#xff09; 1.2、redis api 命令作用案例PFADD key element [element ...]添加元素到keyPF…