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.mzph.cn/diannao/37383.shtml

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

相关文章

DevOps CMDB平台整合Jira工单

背景 在DevOps CMDB平台建设的过程中,我们可以很容易的将业务应用所涉及的云资源(WAF、K8S、虚拟机等)、CICD工具链(Jenkins、ArgoCD)、监控、日志等一次性的维护到CMDB平台,但随着时间的推移,…

PHP爬虫类的并发与多线程处理技巧

PHP爬虫类的并发与多线程处理技巧 引言: 随着互联网的快速发展,大量的数据信息存储在各种网站上,获取这些数据已经成为很多业务场景下的需求。而爬虫作为一种自动化获取网络信息的工具,被广泛应用于数据采集、搜索引擎、舆情分析…

关于组织赴俄罗斯(莫斯科)第 28 届国际汽车零部件、汽车维修设备和商品展览会商务考察的通知

关于组织赴俄罗斯(莫斯科) 第 28 届国际汽车零部件、汽车维修设备和商品展览会商务考察的通知 展会名称:俄罗斯(莫斯科)第 28 届国际汽车零部件、汽车零部件、汽车维修设备和商品展览会 时间:2024 年 8 月…

Python | Leetcode Python题解之第204题计数质数

题目: 题解: MX5000000 is_prime [1] * MX is_prime[0]is_prime[1]0 for i in range(2, MX):if is_prime[i]:for j in range(i * i, MX, i):#循环每次增加iis_prime[j] 0 class Solution:def countPrimes(self, n: int) -> int:return sum(is_prim…

【MongoDB】分布式数据库入门级学习

SueWakeup 个人主页:SueWakeup 系列专栏:为祖国的科技进步添砖Java 个性签名:保留赤子之心也许是种幸运吧 本文封面由 凯楠📸友情提供 凯楠📸 - 不夜长安 目录 MongoDB 相关 数据库排行榜单 MongoDB 中文官网 菜鸟…

如何把mkv转成mp4?介绍一下将mkv转成MP4的几种方法

如何把mkv转成mp4?如果你有一个MKV格式的视频文件,但是需要将其转换为MP4格式以便更广泛地在各种设备和平台上播放和共享,你可以通过进行简单的文件格式转换来实现。转换MKV到MP4格式可以提供更好的兼容性,并确保你的视频文件能够…

在预训练语言模型主流架构

文章目录 编码器-解码器架构因果解码器架构前缀解码器架构在预训练语言模型时代,自然语言处理领域广泛采用了预训练 + 微调的范式,并诞生了以 BERT 为代表的编码器(Encoder-only)架构、以 GPT 为代表的解码器(Decoder-only)架构和以 T5 为代表的编码器-解码器(Encoder-d…

React:tabs或标签页自定义右击菜单内容,支持内嵌iframe关闭菜单方案

React:tabs或标签页自定义右击菜单内容,支持内嵌iframe关闭菜单方案 不管是react、vue还是原生js,原理是一样的。 注意如果内嵌iframe情况下,iframe无法使用事件监听,但是可以使用iframe的任何点击行为都会往父级wind…

入门Java爬虫:认识其基本概念和应用方法

Java爬虫初探:了解它的基本概念与用途,需要具体代码示例 随着互联网的快速发展,获取并处理大量的数据成为企业和个人不可或缺的一项任务。而爬虫(Web Scraping)作为一种自动化的数据获取方法,不仅能够快速…

vue2(vue-cli3x[vue.config.js])使用cesium新版(1.117.0)配置过程

看来很多解决方法都没有办法,最后终于。呜呜呜呜 这里我用的是vue-cli去搭建的项目的vue2 项目,其实不建议用vue2搭配cesium。因为目前cesium停止了对vue2的版本更新,现在默认安装都是vue3版本,因此需要控制版本,否则…

Node.js简介

一:Node.js简介 Node.js是一个跨平台的JavaScript运行环境,使开发者可以搭建服务器端的JavaScript应用程序 作用:使用Node.js编写服务器端程序 编写数据接口,提供网页资源浏览功能有利于前端工程化,可以集成各种开发…

【力扣高频题】011. 盛最多水的容器

前面的算法文章,更新了许多 专题系列 。包括:滑动窗口、动态规划、加强堆、二叉树递归套路 等。 还没读过的小伙伴可以关注一下,在主页中点击对应链接查看哦~ 接下来的一段时间,将持续 「力扣高频题」 系列文章,想刷 …

idea2024使用springboot3.x系列新建java项目,使用jdk17,启动项目报错

身为一名开发人员,敲代码无数,竟被一个小小启动给我卡了大半天,太丢脸了 报错一:Field infoSysRepository in com.erectile.Impl.PersonalInfoServiceImpl required a bean of type ‘com.erectile.jpa.repository.InfoSysReposit…

IP地址与在线教育平台资源分配优化

IP地址的资源分配与优化策略可以帮助在线教育平台提供更高质量、稳定且个性化的教育服务。 IP地址作为网络设备的标识符,能够为在线教育平台提供有关学生地理位置和网络环境信息。通过对学生IP地址的分析,平台可以初步了解学生所在的地区、网络服务提供商…

回收站的照片删除了怎么找回?

大家在日常使用电脑的过程中,难免会遇到不小心删除重要文件的情况,尤其是珍贵的照片。当我们意识到误删照片时,第一反应通常是去回收站找回。然而,如果连回收站的照片都被删除了,该如何恢复呢?本文将详细探…

【MySQL】事务的快照生成时间点和薛定谔的猫相关?

概述 最近因为工作需要,对MySQL的事务处理进行了一系列测试验证,其中,对于MySQL的事务到底时什么时候生成了数据的快照,结果似乎跟薛定谔的猫理念很像,很有意思;过程我贴出来,有兴趣的朋友可以一…

simulink开发stm32,使用中断模块,无法产生中断,其中包括使用timer模块,以及ADC都无法产生中断,需要注意的地方

1,其中包括使用timer模块,以及ADC都无法产生中断,需要注意的地方 原来是需要在配置文件里开启一下timer的中断,其他模块自动加载ioc就可以了,这个timer需要注意力,需要自己勾选一下 如下图: 看…

致敬经典:在国产开源操作系统 RT-Thread 重温 UNIX 彩色终端

引言 上篇文章里我们向大家介绍了 RT-Thread v5.1.0 的一些新特性。其中包括了终端环境的进一步完善。终端是人机交互的重要接口。实用的终端工具可以显著地提升系统使用者的幸福指数。举例来说,当我们想要修改一些系统配置,或是编写脚本时,一…

Linux——echo命令,管道符,vi/vim 文本编辑器

1.echo 命令 作用 向终端设备上输出字符串或变量的存储数据 格式 echo " 字符串 " echo $ 变 量名 [rootserver ~] # echo $SHELL # 输出变量的值必须加 $ /bin/bash [rootserver ~] # str1" 我爱中国 " # 自定义变量 echo 重定向输出到文件 ec…

MySQL数据库——在Centos7环境安装

MySQL在Centos7环境安装 1.切换root用户 安装与卸载中,用户全部切换成为root,安装好后,普通用户也能使用 2.卸载不要的环境 要将自己环境中有关mysql的全都删除,避免安装过程中被影响 ps axj | grep mariadb 先检查是否有mari…