《AV Foundation 开发秘籍》读书笔记(四)

ThingsBoard入门实战(二):ThingsBoard 设备接入 文章目录ThingsBoard 设备接入一、设备配置/设备类型二、设备三、设备接入HTTPCOAPMQTT四、下一步 ThingsBoard 设备接入 设备接入并不一定需要真正的设备,我们可以通过程序。或者命令来模拟设备,向平台发送信息。 这节我们先为用户分配一个设备,然后通过模拟设备命令更新设备的状态(遥测值)。 一、设备配置/设备类型 添加一个叫"路灯"的设备配置。 设备配置听起来比较抽象,可以认为是设备类型或者是设备类型的配置。实际上,ThingsBoard 中很多时候让选择设备类型,就是选的这个。 阅读详情

第四章 视频播放

1. 主要框架

AVPlayer

AV Foundation 的播放都围绕 AVPlayer 类展开,AVPlayer 是一个用来播放基于时间的视听媒体的控制器对象,支持播放从本地、分布下载或通过 HTTP Live Streaming 协议得到的流媒体。

AVPlayer 是一个不可见组件,如果播放音频文件,没有可视化的用户界面也不会有什么问题,如果播放视频文件,要将视频资源导出到用户界面,需要使用 AVPlayerLayer 类。

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

AVPlayerLayer

AVPlayerLayer 构建于 Core Animation 之上,Core Animation 本身具有基于时间的属性,并且由于它基于 OpenGL,所以具有很好的性能,能非常好地满足 AV Foundation 的各种需要。

AVPlayerLayer 使用起来简单,开发者可以自定义的只有 videoGravity 属性,用来确定视频的拉伸或缩放程度。

AVPlayerItem

我们最终的目的是使用 AVPlayer 播放 AVAsset。但是 AVAsset 只包含媒体资源的静态信息,无法实现播放功能,所以,需要通过 AVPlayerItem 和 AVPlayerItemTrack 构建响应的动态内容。

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

2. 视频播放

- (void)viewDidLoad {
    [super viewDidLoad];

    // AVPlayerItem:提供数据
    NSURL *assetURL = [[NSBundle mainBundle] URLForResource:@"一骑当千01" withExtension:@"mp4"];
    AVAsset *asset = [AVAsset assetWithURL:assetURL];
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
    [playerItem addObserver:self forKeyPath:@"status" options:0 context:nil];

    // AVPlayer:控制播放
    _player = [AVPlayer playerWithPlayerItem:playerItem];

    // AVPlayerLayer:显示播放
    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
    playerLayer.frame = self.view.bounds;
    [self.view.layer addSublayer:playerLayer];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"status"]) {

        AVPlayerItem *playerItem = (AVPlayerItem *)object;
        if (playerItem.status == AVPlayerItemStatusReadyToPlay) {            
            [self.player play];
        }
    }
}

3. 时间处理

AVAudioPlayer 使用 NSTimeInterval 表示时间,但是 double 类型的运算会导致不精确的情况。此外,double 类型呈现时间信息无法做到自我描述,这就导致在使用不同时间轴进行比较和运算时比较困难。所以 AV Foundation 使用一种可靠性更高的方法来展示时间信息,这就是 CMTime

typedef struct {
    CMTimeValue value;      
    CMTimeScale timescale;  
    CMTimeFlags flags;      
    CMTimeEpoch epoch;  
} CMTime;

CMTime 是一种结构体,最关键的两个值为 value 和 timescale,value 是一个 64 位整数值,timescale 是一个 32 位整数值,分别为分子和分母。

// 0.5 s
CMTime halfSecond = CMTimeMake(1, 2);

// 5 s
CMTime fiveSeconds = CMTimeMake(5, 1);

// 44.1 kHz
CMTime oneSample = CMTimeMake(1, 44100);

// Zero time value
CMTime zeroTime = kCMTimeZero;

4. 显示字幕

显示字幕需要用到两个类:AVMediaSelectionGroup 和 AVMediaSelectionOption,AVMediaSelectionOption 表示 AVAsset 中的备用媒体呈现方式,比如音频、视频、文本轨道。这些轨道可能是指定语言的音频轨道、备用相机角度、指定语言字幕。

NSArray *mediaCharacteristics = self.asset.availableMediaCharacteristicsWithMediaSelectionOptions;

该数组中可能包含的字符串值为:

  • AVMediaCharacteristicVisual(视频)
  • AVMediaCharacteristicAudible(音频)
  • AVMediaCharacteristicLegible(字幕或隐藏式字幕)

获取所有可选择字幕语言数组

- (NSArray *)getSubtitles {

    AVMediaSelectionGroup *group = [self.asset mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicLegible];
    if (group) {
        NSMutableArray *subtitles = [NSMutableArray array];
        for (AVMediaSelectionOption *option in group.options) {
            [subtitles addObject:option.displayName];  // 语言字幕轨道名称,比如 English、Italian、Russian
        }
        return subtitles;
    } else {
        return nil;
    }
}

设置字幕

- (void)subtitleSelected:(NSString *)subtitle {

    AVMediaSelectionGroup *group =
        [self.asset mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicLegible];

    for (AVMediaSelectionOption *option in group.options) {
        if ([option.displayName isEqualToString:subtitle]) {
            [self.playerItem selectMediaOption:option inMediaSelectionGroup:group];
            return;
        }
    }
    [self.playerItem selectMediaOption:nil inMediaSelectionGroup:group];
}

5. 缩略图

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

  1. copyCGImageAtTime:actualTime:error: 允许在指定时间点捕捉图片,适合在展示视频缩略图。

  2. generateCGImagesAsynchronouslyForTimes:completionHandler:
    允许按照第一个参数所指定的时间段生成一个图片序列,该方法具有很高的性能,只需要调用这一个方法就可以生成一组图片

下面方法为第一种 copyCGImageAtTime:actualTime:error: 方法:

- (void)generateThumbnails {

    self.imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:self.asset];

    // 默认情况下,捕捉的图片都保持原始维度。设置 maximumSize 的宽度,则会根据视频的宽高比自动设置高度值
    self.imageGenerator.maximumSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 0.0f);

    CMTime duration = self.asset.duration;

    // 将视频时间轴平均分为 20 个 CMTime 值
    NSMutableArray *times = [NSMutableArray array];
    CMTimeValue increment = duration.value / 20;
    CMTimeValue currentValue = 2.0 * duration.timescale;
    while (currentValue <= duration.value) {
        CMTime time = CMTimeMake(currentValue, duration.timescale);
        [times addObject:[NSValue valueWithCMTime:time]];
        currentValue += increment;
    }

    __block NSUInteger imageCount = times.count;
    __block NSMutableArray *images = [NSMutableArray array];

    AVAssetImageGeneratorCompletionHandler handler;

    // requestedTime : 请求的最初时间,它对应于生成图像的调用中指定的 times 数组中的值
    // imageRef      : 生成的 CGImageRef,如果在给定的时间点没有生成图片则为 NULL
    // actualTime    : 图片实际生成的时间,可能和请求时间不同。可以在生成图片前通过 AVAssetImageGenerator 实例设置 requestedTimeToleranceBefore 和 requestedTimeToleranceAfter 值来调整 requestedTime 和 actualTime 的接近程度
    // result        : AVAssetImageGeneratorResult 用来表示生成图片成功、失败、取消
    handler = ^(CMTime requestedTime,
                CGImageRef imageRef,
                CMTime actualTime,
                AVAssetImageGeneratorResult result,
                NSError *error) {

        if (result == AVAssetImageGeneratorSucceeded) {
            MYThumbnail *thumbnail =
                [MYThumbnail thumbnailWithImage:[UIImage imageWithCGImage:imageRef] time:actualTime];
            [images addObject:thumbnail];
        } else {
            NSAssert(error.localizedDescription, error.localizedDescription);
        }

        // 如果 imageCount 等于 0 这表明所有图片都处理完成
        if (--imageCount == 0) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.playerView.transport setStillsImages:images];
            });
        }
    };
    [self.imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:handler];
}

6. 封装框架

有很多知识点通过笔记是无法表达清楚的,具体实现还需看代码理解的透彻。根据 Learning-AV-Foundation Chapter 4 自行封装了一个视频播放、设置字幕、获取视频缩略图的框架,下载地址:https://github.com/Mayan29/MYAVFoundation

k8s 不同node之间pod ip不通 底层k8s使用calico网络,ipip网络模式,kubevirt启动了2台虚拟机;在这两台虚拟机上再搭建k8s,calico网络,ipip网络模式。说明:我是使用helm安装的calico,改这个模式要改crd资源ippools。其他方式安装的calico修改方法可能不一样。在虚拟机上的k8s上启动了2个pod,分布在不同的node上,这两个pod不能ping通对方的pod ip。修改虚拟机之上的k8s集群的calico网络的ipipMode为Never即可,之前使用的是Always。 阅读详情

相关推荐

HHD Device Monitoring Studio:破解版在串口调试中的实战应用

本文详细介绍了HHD Device Monitoring Studio破解版在串口调试中的实战应用,包括安装指南、串口监控功能解析、Modbus RTU协议分析案例以及自定义协议解析技巧。通过具体操作步骤和性能优化建议,帮助开发者高效完成端口监控和调试任务,提升工作效率。

weixin_29268331的博客 935

AVPlayer自定制视频播放器(1)——视频播放器基本实现

在iOS多媒体开发过程中,经常会用到视频播放器,简单是视频播放器,直接使用苹果提供好的MPMoviePlayerController和MPMoviePlayerViewController就可以实现了,但是,多数情况下,都需要自定制视频播放器,这时,就要使用神器AVPlayer来进行开发了。下面,就讲述一下AVPlayer的使用。先列出两篇比较好的博客,供大家参考: iOS开发系列--音频播放、

天下皆白唯我独黑的博客 6万+

GX WORKS2通过交换机连接PLC的方法

三菱PLC连接方法的分享

weixin_64927621的博客 3617

iOS的影片播放MediaPlayer 和avplayer的简单用法

在iOS開發上,如果遇到需要播放影片,如開機動畫…,我們很習慣地會使用MediaPlayer來播放影片,因為很方便使用,所以就一直使用下去。但是隨著客戶的要求越來越嚴苛,尤其是過場動畫或互動效果上的表現。所以如果在一些動畫中還挾帶影片一起運算,那勢必機器會跑不動。所以在iOS 4之後,我們可以使用AVPlayer這個類別來進行更細微的操作。 備註: MediaPlayer的影片是放

xiaoxin5596的专栏 1772

竞赛无人机模块化开发实战:2023 TI电赛G题空地协同消防系统(飞控与视觉融合篇)

本文以2023年TI电赛G题为例,详细阐述了采用模块化开发思维构建空地协同智能消防系统的实战方法。文章重点拆解了无人机飞控二次开发、视觉识别与融合控制等核心模块,提供了硬件选型、代码实现与系统联调的完整指南,旨在帮助参赛者通过“搭积木”式编程高效完成复杂系统集成。

js777的博客 452

彻底禁用有道云笔记自动更新:手动修改配置文件的终极方案

本文详细介绍了如何通过修改配置文件彻底禁用有道云笔记的自动更新功能,解决v7.2.8版本的兼容性问题。通过定位并修改`app-update.yml`文件,用户可以一劳永逸地阻止强制更新,保持稳定的v7.2.7版本。文章还提供了常见问题排查和进阶防护措施,确保操作的有效性和安全性。

weixin_29258297的博客 462

AVPlayer 无间隔循环播放

AVPlayer 可以实现音频或者视频文件的在线播放和本地播放。最近做了一个单曲循环播放的功能。一开始选择了下面这个方法: - (void)replaceCurrentItemWithPlayerItem:(nullable AVPlayerItem *)item; 但尝试后发现两首音乐无法完美衔接,中间会有一个短暂的停留,这个不太符合我们的需求。尝试在播放完后,重新创建播放器,继续播放这

Anybody capable of love is capable of being saved. 39万+

智能交通实战:基于YOLOv5/8/10的车辆违章行为检测系统(违停/压线/逆行识别)

在开始模型训练前,我们得明确要检测的违章行为,还要准备好对应的数据集,这就像做饭前要确定做什么菜、准备什么食材一样。通过本指南,你已经掌握了从技术选型(YOLOv5/8/10)数据准备模型训练到UI界面开发的全流程,搭建了一套完整的车辆违章行为检测系统。这个系统在实际应用中,能有效识别多种车辆违章行为,检测准确率高、速度快,可用于智能交通管理、停车场管理等多个场景。随着深度学习技术的不断进步,YOLO系列模型在车辆违章检测领域的应用会越来越广泛。

m0_71589036的博客 458

iOS 视频播放(AVPlayer)

文章目录 一、AVPlayer 1、简介 2、视频播放的解决方案 二、AVPlayer中的MVC 1、v层 :AVPlayerLayer 2、m层 :AVPlayerItem 3、c层 :AVPlayer 三、实现简单的播放、暂停功能 1、播放 2、暂停 3、视频播放暂停实现一、AVPlayer1、简介 OC 提供了三种视频播放解决方案,分别是

风中的劲草 3万+

RK3568平台(电源篇)电源域IO配置

在kernel之前需要修改电源域,主控电源域的IO电平要与对接外设芯片的IO电平匹配,还要注意软件的电压配置要跟硬件的电压一致,否则,最坏的情况可能会导致IO的损坏。其实就是管理 IO 输出的电平;假如硬件上 IO 电源域配置为 3.3V,则 IO 输出最大电平为 3.3V;同理 IO 电源域硬件配置为 1.8V,则 IO 输出最大电平是 1.8V;这样有利于 IO 电平的灵活配置;

weixin_49303682的博客 3478

使用Python的OpenCV库进行三维重建点云

通过这些步骤,我们可以使用Python的OpenCV库进行三维重建,并生成对应的点云。当然,这只是一个简单的示例,实际的三维重建可能涉及更多的图像处理和计算步骤。在计算机视觉领域,三维重建是一项重要的任务,它可以将多个二维图像或视频序列转换为三维场景模型。在本文中,我们将介绍如何使用Python的OpenCV库进行三维重建,并生成相应的点云。以上是使用Python的OpenCV库进行三维重建点云的简要介绍和示例代码。最后,我们可以将计算得到的三维点云可视化。安装完成后,我们可以开始编写代码。

AuSwift的博客 1646

nPlayer Plus视频播放器 免越狱直装

nPlayer Plus视频播放器 推荐直装

李先生的专栏 2万+

YOLOv12涨点改进| Kimi团队 2026 |独家创新首发、注意力改进篇|爆火AttnRes残差自注意力模块,含多种创新改进,借助残差思想,缓解细节信息在传播过程中被稀释,促进YOLOv12涨点

🔥本文提出AttnRes残差自注意力模块改进YOLOv12模型,通过深度维度的注意力加权机制替代传统固定残差累加方式。该模块能自适应选择更有价值的历史层特征进行聚合,缓解浅层信息在深层传播中被稀释的问题,提升小目标和复杂场景的检测能力。文章详细介绍了模块结构、原理及优势,并提供了完整的代码实现和配置方法,包括三种改进方案:yolov12n_AttnRes.yaml、yolov12n_AttnRes-2.yaml和yolov12n_A2C2f_AttnRes2D.yaml。

Ai缝合怪、助力小伙伴高效发论文 183

《AV Foundation 开发秘籍》读书笔记(一)

《AV Foundation 开发秘籍》第一章 AV Foundation 简介

轮子制造工厂 2226

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《AV Foundation 开发秘籍》读书笔记(三)

AV Foundation 把所有的代码设计围绕资源(assert)进行,AVAssert 是 AV Foundation 设计的核心。

轮子制造工厂 1798

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

《AV Foundation 开发秘籍》读书笔记(二)

《AV Foundation 开发秘籍》第二章 音频播放和录制

轮子制造工厂 1575

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

《AV Foundation 开发秘籍》读书笔记(五)

第五章 AV Kit 用法AV Kit 可以简化基于 AV Foundation 框架且满足默认操作系统视觉效果和体验的视频播放器的创建过程。AV Kit 框架第一次出现在 Mac OS X Mavericks 版本中,从 iOS 8 开始被引入到 iOS 平台。

轮子制造工厂 565

IOS利用AVPlayer开发多媒体在线播放器

在这里给AVPlayer播放在线音频文件作个记号 1.在H文件中初始: ============== AVPlayer *mp3Player; AVPlayerItem *mp3PlayerItem; id audioMix; id volumeMixInput; 2.在MM文件中: view source print ? 01. //作品播放 0

u011140147的专栏 12万+

AVFoundation视频播放(非音视频流处理)

前面我们已经提到了利用AVFoundation实现音视频播放,那么为什么这里又来讲一次呢?原因在于他们之间在IOS中的层次结构不一样。 如果我们吧视频播放排个顺序的话: (1)MediaPlayer.framework(framework) 最上层cocos touch层,简单类比一下。最上层。 (2)AVPlayer (calss)多媒体层 第二层 (3)AVAsset(class) 可

关注IOS、Android网络、音视频编解码、特效、Neon算法优化,DSP等嵌入式驱动开发算法移植 1万+

基于 AVPlayer 自定义播放器

如果我只是简单的播放一个视频,而不需要考虑播放器的界面。iOS9.0 之前使用 MPMoviePlayerController, 或者内部自带一个 view 的 MPMoviePlayerViewController. iOS9.0 之后,可以使用 AVPictureInPictureController, AVPlayerViewController, 或者 WKWebView。 ...

diancannei3748的博客 841

视频播放器AVPlayer

1、采用AVPlayer进行封装 2、通过单例视频管理类全局控制视屏的播放暂停和移除视频view 3、播放视图和工具条独立封装,完全解耦 4、封装独立的弹框视图,可加网络判断来是否继续播放 github地址:https://github.com/Janko0/JKAVPlayer 播放器使用 // //  ViewController.m //  JKPlayer /

youngkehpu的博客 3万+

音视频再学习笔记(2)(about AVPlayerItem)

文档地址: https://developer.apple.com/reference/avfoundation/avplayeritem 1、AVPlayerItem is a dynamic object.In addition to its property values that can be changed by you ,many of its read-only proper

探究苹果技术原理和学习新技术(锲而舍之,朽木不折;锲而不舍,金石可镂。) 4605

在线高清版4412开发板视频_免费_先学习下不定期更新

如 果能点个赞就更好啦,不用会员也能看的 iTOP4412开发板介绍https://www.bilibili.com/video/av74453392 iTOP4412开发板系统编程前言https://www.bilibili.com/video/av75754003 iTOP4412-fastboot烧写Androidhttps://www.bilibili.com/video/av...

mucheni的博客 2万+

终极B站视频解析指南:免费获取高清视频的简单方法

想要轻松获取B站视频资源,却不想面对复杂的技术难题?bilibili-parse视频解析工具正是你需要的解决方案。这个开源项目提供了一个简单易用的PHP API,让你能够快速解析B站视频信息,获取多种格式的视频播放地址。无论是普通用户还是开发者,都能在几分钟内掌握这个强大的工具,实现B站视频的高效获取和播放。 ## 📱 工具核心功能概览 ### 一键式视频解析体验 bilibili-pars

gitblog_01134的博客 561

iOS音视频开发-----流媒体

HTTP Live Streaming (HLS))是向播放应用提供媒体的理想方式。使用HLS,您可以以不同的比特率提供多个媒体流,并且您的播放客户端会随着网络带宽的变化动态选择适当的流。这可确保您始终根据用户当前的网络状况提供最优质的内容。本章介绍如何在播放应用中利用HLS的独特功能。 从iOS 10开始,您可以使用AVFoundation将HTTP Live Streaming资源下载到iO...

szk972092933的博客 2896

ios avplayer 视频播放器

#import <UIKit/UIKit.h> @interface XGGesTuresView : UIView //左下角播放按钮 @property (nonatomic ,strong)UIButton * leftplayerbutton; //最小时间 @property (nonatomic ,strong)UILabel ...

weixin_30699741的博客 4816
上一篇: MLeaksFinder 自动内存泄漏检测工具
下一篇: 《AV Foundation 开发秘籍》读书笔记(五)
mayan29
博客等级 码龄11年 13粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值