AV Foundation学习笔记二 - 播放器

news2024/11/24 15:23:13

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.coloradmin.cn/o/1873918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python:探索高效、智能的指纹识别技术(简单易懂)

目录 概括 导入库 函数一 参数: 函数二 函数三 主函数 运行结果 src: model_base 7.bmp ​编辑 总结 概括 指纹识别是一种基于人体生物特征的身份验证技术。它通过捕捉和分析手指上的独特纹路和细节特征,实现高准确度的身份识别。…

多地高温持续“热力”爆表 约克VRF中央空调带你清凉舒爽一夏

“出门5分钟,流汗2小时”,夏季高温天气,怎一个“热”字了得?6月以来,我国多地迎来高温“炙烤”,全国出现40℃以上高温的范围持续增加,随着中央气象台高温预警持续拉响,人们都很纳闷:…

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

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

5. Spring IoCDI ★ ✔

5. Spring IoC&DI 1. IoC & DI ⼊⻔1.1 Spring 是什么?★ (Spring 是包含了众多⼯具⽅法的 IoC 容器)1.1.1 什么是容器?1.1.2 什么是 IoC?★ (IoC: Inversion of Control (控制反转))总…

2.用BGP对等体发送路由

2.用BGP对等体发送路由 实验拓扑: 实验要求:用BGP对等体发送路由信息 实验步骤: 1.完成基本配置(略) 2.建立BGP对等体(略) 3.创建路由信息(用创建一个loop back接口就能产生一个直连…

毅速丨金属3D打印是制造业转型升级的重要技术

随着科技的进步,金属3D打印技术已成为制造业升级的重要驱动力。它以其独特的优势,正引领着制造业迈向新的未来。 金属3D打印技术的突破: 设计自由。金属3D打印能制造任意形状和结构的零件,为设计师提供了无限的创意空间。 快速制…

AI数据分析003:用kimi生成一个正弦波数学动画

文章目录 一、正弦波公式二、输入内容三、输出内容一、正弦波公式 ƒ(x) = a * sin(x + x0) + b 公式中: a: 决定正弦函数振动幅度的大小; x0:表示x开始比0拖后的弧度值; b:表示函数偏离X轴的距离; 对于难以理解的学生来说,可以用动画把这个公式直观的展现出来。 二…

深入理解 XML 和 HTML 之间的区别

在现代网络技术的世界中,XML(可扩展标记语言)和 HTML(超文本标记语言) 是两个非常重要的技术。尽管它们都使用标签和属性的格式来描述数据,但它们在形式和用途上有显著的区别。 概述 什么是 XML&#xff…

【51单片机入门】数码管原理

文章目录 前言共阴极与共阳极数码管多个数码管显示原理 总结 前言 在我们的日常生活中,数码管被广泛应用于各种电子设备中,如电子表、计时器、电子钟等。数码管的主要功能是显示数字和一些特殊字符。在这篇文章中,我们将探讨数码管的工作原理…

搭建ASPP:多尺度信息提取网络

文章目录 介绍代码实现 介绍 ASPP(Atrous Spatial Pyramid Pooling),空洞空间卷积池化金字塔。简单理解就是个至尊版池化层,其目的与普通的池化层一致,尽可能地去提取特征。ASPP 的结构如下: 如图所示&…

容联云容犀Desk在线客服:全渠道+全场景+全智能辅助,提升客户体验

如今,客户体验已经从基础的对话、交易、业务办理,转变为深度的生活联结、情感共鸣、价值认可。客户期待的转变,也让更多企业越发重视“以客户为中心”的业务增长战略。 容犀Desk营销服统一体验工作空间应运而生,其核心能力在线客…

INDEMIND:智效赋能,让服务机器人服务于人

商用清洁机器人的价值战。 随着行业发展势头回归冷静,“卖家秀”时代成为过去,机器人拼技术、拼产品的价值战时代已然到来。 庞大的前景是香饽饽也是镜中花 作为被业内寄予厚望的服务机器人之一,背后的信心是来自于明确的需求和庞大的市场…

JAVA-矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 思路: 找到0的位置,把0出现的数组的其他值夜置为0 需要额外空间方法: 1、定义两个布尔数组标记二维数组中行和列…

vue3 【提效】自动路由(含自定义路由) unplugin-vue-router 实用教程

不再需要为每一个路由编写冗长的 routes 配置啦,新建文件便可自动生成路由! 使用方法 1. 安装 unplugin-vue-router npm i -D unplugin-vue-router2. 修改 vite 配置 vite.config.ts import VueRouter from unplugin-vue-router/viteplugins 中加入 V…

【前端】简易化看板

【前端】简易化看板 项目简介 看板分为三个模块,分别是待办,正在做,已做完三个部分。每个事件采取"卡片"式设计,支持任务间拖拽,删除等操作。 代码 import React, { useState } from react; import { Car…

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

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

从我邮毕业啦!!!

引言 时间过的好快,转眼间就要从北邮毕业了,距离上一次月度总结又过去了两个月,故作本次总结。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star! 毕业🎓 6月1号完成了自己的…

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

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

从零开始:Spring Boot 中使用 Drools 规则引擎的完整指南

规则引擎作用 规则引擎主要用于将业务逻辑从应用程序代码中分离出来,提高系统的灵活性和可维护性。规则引擎通过预定义的规则来处理输入数据并做出相应的决策,从而实现业务逻辑的自动化和动态调整。 例如 门店信息校验:美团点评在门店信息…

C语言分支和循环(上)

C语言分支和循环(上) 1. if语句1.1 if1.2 else1.3 分支中包含多条语句1.4 嵌套if1.5 悬空else问题 2. 关系操作符3. 条件操作符4. 逻辑操作符:&&,||,!4.1 逻辑取反运算符4.2 与运算符4.3 或运算符4.4 练习:闰年…