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

iOS AVPlayer视频播放器 iOS 基于AVPlayer的视频播放器,实现播放、暂停、全屏、进度条,缓冲条 立即下载

第二章 音频播放和录制

1. 音频会话

音频会话分类

Category播放类型后台播放静音或屏幕关闭音频输入音频输出作用
AVAudioSessionCategoryAmbient混合播放有影响支持游戏背景音乐
AVAudioSessionCategorySoloAmbient(默认)独占播放有影响支持微信中播放语音
AVAudioSessionCategoryPlayback可选支持支持音频播放器
AVAudioSessionCategoryRecord独占录音支持支持微信中录制语音
AVAudioSessionCategoryPlayAndRecord可选支持支持支持微信语音聊天
AVAudioSessionCategoryAudioProcessing——————硬件解码音频
AVAudioSessionCategoryMultiRoute支持支持多设备输入输出

上述分类所提供的几种常见行为可以满足大部分应用程序的需要,如果需要更复杂的功能,上述其中一种分类可以通过使用 options 和 modes 方法进一步自定义开发。

激活音频会话

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    AVAudioSession *session = [AVAudioSession sharedInstance];
    NSError *error;
    if (![session setCategory:AVAudioSessionCategoryPlayback error:&error]) {
        NSLog(@"Category Error : %@", error.localizedDescription);
    }
    if (![session setActive:YES error:&error]) {
        NSLog(@"Activation Error : %@", error.localizedDescription);
    }

    return YES;
}

如果分类允许后台播放,则应该打开 Capabilities 中的 Background Modes 继而勾选后台播放音频选项

2. 音频播放

除非需要从网络流中播放音频、需要访问原始音频样本,或者需要非常低的时延,否则 AVAudioPlayer 都能胜任

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"白洁01" withExtension:@"mp3"];

    // Must Maintain a strong reference to player
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];

    if (self.player) {
        self.player.numberOfLoops = -1;  // 循环播放
        [self.player prepareToPlay];
    }
}

- (IBAction)play {

    [self.player play];
}

prepareToPlay 方法是可选的,在调用 play 方法前也会自动调用,作用是取得需要的音频硬件并预加载 Audio Queue 的缓冲区,降低调用 play 方法后的延时。

- (IBAction)pause {

    [self.player pause];
}

- (IBAction)stop {

    [self.player stop];
    self.player.currentTime = 0.0f;
}

通过 pause 和 stop 方法停止的音频都会继续播放。最主要的区别在底层处理上,调用 stop 方法会撤销调用 prepareToPlay 时所做的设置,而调用 pause 方法则不会。

// 音量 0 ~ 1
- (IBAction)voice:(UISlider *)sender {

    self.player.volume = sender.value;
}

// 声道 -1 ~ 1
- (IBAction)pan:(UISlider *)sender {

    self.player.pan = sender.value;
}

// 速率 0.5 ~ 2
- (IBAction)speed:(UISlider *)sender {

    self.player.rate = sender.value;
}

如果要改变速率,在初始化 AVAudioPlayer 时应做出如下设置

self.player.enableRate = YES;

3. 处理中断事件

当有电话呼入、闹钟响起的时候,播放中的音频会慢慢消失和暂停,但是终止通话后,播放、停止按钮的控件和音频的播放没有恢复。为了优化用户体验,需要监听这些事件,并作出处理:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleInterruption:) name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]];
- (void)handleInterruption:(NSNotification *)notification
{
    NSDictionary *info = notification.userInfo;

    AVAudioSessionInterruptionType type = [info[AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
    if (type == AVAudioSessionInterruptionTypeBegan) {

        // 中断开始,设置停止音乐
        [self.player pause];

    } else {

        // 中断结束,判断是否允许继续播放
        AVAudioSessionInterruptionOptions options = [info[AVAudioSessionInterruptionOptionKey] unsignedIntegerValue];
        if (options == AVAudioSessionInterruptionOptionShouldResume) {

            // 允许继续播放,则继续播放
            [self.player play];
        }
    }
}

4. 对线路改变的响应

播放音频期间插入耳机,音频输出线路变成耳机插孔并继续播放。断开耳机连接,音频线路再次回到设备的内置扬声器播放。虽然线路变化和预期一样,不过按照苹果官方文档,认为该音频应该处于静音状态。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleRouteChange:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];
- (void)handleRouteChange:(NSNotification *)notification
{
    NSDictionary *info = notification.userInfo;

    AVAudioSessionRouteChangeReason reason = [info[AVAudioSessionRouteChangeReasonKey] unsignedIntegerValue];
    if (reason == AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {

        AVAudioSessionRouteDescription *previousRoute  = info[AVAudioSessionRouteChangePreviousRouteKey];
        AVAudioSessionPortDescription  *previousOutput = previousRoute.outputs[0];
        if ([previousOutput.portType isEqualToString:AVAudioSessionPortHeadphones]) {

            // 停止播放音乐
            [self.player stop];
        }
    }
}

5. 音频录制

一般情况存在录音功能,必然会有播放功能,所以不能使用默认的录制音频会话,应该使用既可以录制又能播放的 AVAudioSessionCategoryPlayAndRecord

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL *url = [NSURL fileURLWithPath:[@"Users/mayan/Desktop" stringByAppendingPathComponent:@"voice.caf"]];
    NSDictionary *settings = @{
                               AVFormatIDKey            : @(kAudioFormatAppleIMA4),
                               AVSampleRateKey          : @22050.0f,
                               AVNumberOfChannelsKey    : @1,
                               };
    self.recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:nil];

    if (self.recorder) {
        self.recorder.delegate = self;
        [self.recorder prepareToRecord];
    }
}

- (IBAction)record {

    [self.recorder record];
}

- (IBAction)recordFinish {

    [self.recorder stop];
}

// 音频录制完成调用
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
    if (flag) {

        // 一般把录制好的音频复制或者剪切到目的文件夹下
        NSURL *srcURL = self.recorder.url;
        NSURL *destURL = [NSURL URLWithString:@"目的文件路径/音频文件名称.caf"];

        [[NSFileManager defaultManager] copyItemAtURL:srcURL toURL:destURL error:nil];
    }
}

在录制音频过程中,Core Audio Format(CAF)通常是最好的容器格式,因为它和内容无关可以保存 Core Audio 支持的任何音频格式。在设置字典中指定的键值信息也值得讨论一番:

音频格式

AVFormatIDKey 定义了写入内容的音频格式,下面是常用格式:

  • kAudioFormatLinearPCM:将未压缩的音频流写入到文件中。保真度最高,文件也最大;
  • kAudioFormatMPEG4AAC(AAC) 或 kAudioFormat-AppleIMA4(Apple IMA4):文件显著缩小,还能保证高质量音频

采样率

AVSampleRateKey 定义了录音器的采样率,采样率定义了对输入的模拟音频信号每一秒的采样数。采样率越高,越能得到高质量的内容,不过文件相对越大。标准的采样率:8000、16000、22050、44100

通道数

AVNumberOfChannelsKey 定义记录音频内容的通道数。默认值 1 是单声道录制,2 是立体声录制。除非使用外部硬件录制,否则应该创建单声道录音。

6. 音频测量

AVAudioPlayer 和 AVAudioRecorder 中最实用的功能就是对音频进行测量。Audio Metering 可以读取音频的平均分贝和峰值分贝数据,并使用这些数据以可视化方式将声音大小呈现给用户。

首先在初始化 AVAudioPlayer 或 AVAudioRecorder 时应做出如下设置

self.player.meteringEnabled = YES;
self.recorder.meteringEnabled = YES;

点击音频播放或者音频录制,开始测量

- (void)startMeterTimer
{
    [self.link invalidate];
    self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateMeter)];
    self.link.frameInterval = 4;  // 时间间隔为刷新率的 1/4
    [self.link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}

- (void)stopMeterTimer
{
    [self.link invalidate];
    self.link = nil;
}

下面分别是音频播放情况下测量、音频录制情况下测量

- (void)updateMeter
{
    [self.player updateMeters];  // 刷新

    CGFloat num1 = [self.player averagePowerForChannel:0];
    CGFloat num2 = [self.player peakPowerForChannel:0];

    NSLog(@"平均分贝:%f, 峰值分贝:%f", num1, num2);
}
- (void)updateMeter
{
    [self.recorder updateMeters];  // 刷新

    CGFloat num1 = [self.recorder averagePowerForChannel:0];
    CGFloat num2 = [self.recorder peakPowerForChannel:0];

    NSLog(@"平均分贝:%f, 峰值分贝:%f", num1, num2);
}

上面方法都会返回用于表示声音分贝(dB)等级的浮点值,这个值的范围是 -160dB ~ 0dB

javjajavjavjajvajvajvav javjajvajvjavjajvjavjavavava 立即下载

相关推荐

手机看片不卡播放器rmvb

手机看片不卡播放器rmvb 最好使 下完请评价 并推荐给好友

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

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

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

JavSP:汇总多站点数据的AV元数据刮削器

Jav Scraper Package 汇总多站点数据的AV元数据刮削器 提取影片文件名中的番号信息,自动抓取并汇总多个站点数据的 AV 元数据,按照指定的规则分类整理影片文件,并创建供 Emby、Jellyfin、Kodi 等软件使用的元数据文件 功能特点 下面这些是一开始就决定要做的主要功能,在逐渐实现和完善,如果想到新的功能点也会加进来。 自动识别影片番号 支持处理影片分片 汇总多个站点的数据生成NFO数据文件 多线程并行抓取 下载高清封面 自动检查新版本 翻译标题和剧情简介 匹配本地字幕 使用小缩略图创建文件夹封面 保持不同站点间 genre 分类的统一 不同的运行模式(抓取数据+整理,仅抓取数据) 可选:所有站点均抓取失败时由人工介入 目前软件还处于比较初期的阶段,部分功能还没有完成。如果你愿意试一下,可以参照下面的说明。如果使用的时候遇到什么问题也欢迎给

AVFoundation 播放器实例

播放器 使用苹果官方的 AVFoundation 框架,可以很容易的封装一个视频的播放器。 在获取视频资源后,只需要将视频在播放图层中渲染即可,并在图层中添加控件以便对视频的播放即暂停进行控制。 下面封装的库,主要包含两个类 HXJPlayerView 和 HXJPlayerControlView 。但是,在具体使用时,其实只需要使用 HXJPlayerView 类,创建一个播放视图即可。 HXJ...

集腋成裘 2万+

AVPlayer播放器

简单的AVPlayer播放器 注释齐全 歌词随心动 暂停 下一曲 上一曲

VSCode+ESP-IDF开发环境搭建:从零开始创建你的第一个物联网项目(2024最新版)

本文详细介绍了如何在2024年使用VSCode和ESP-IDF搭建物联网开发环境,从零开始创建第一个物联网项目。内容包括环境准备、ESP-IDF配置、项目创建与结构解析、构建烧录步骤以及高级技巧和常见问题解决方案,帮助开发者快速上手ESP32开发。

weixin_29165725的博客 330

AVPlayer 无间隔循环播放

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

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

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺等操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。

体会编程语言独到的美 17万+

iOS 视频播放(AVPlayer)

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

风中的劲草 3万+

基于 Python 的 LIF 模型:探索神经元同步与小世界网络

首先,我们定义了一个LIFNeuronself.soma.L = self.soma.diam = 12.6157 # 固定神经元形状self.cm = cm # 电容self.V_rest = V_rest # 静息电位self.V = V_rest # 初始化膜电位在初始化过程中,每个神经元被赋予初始的静息电位,并且其膜电位会在后续的模拟过程中动态变化。

qq_36224726的博客 1423

VIPER22A实战:从零搭建15W非隔离电源,附BUCK电路调试心得

本文详细介绍了使用VIPER22A芯片从零搭建15W非隔离电源的全流程,重点解析BUCK电路设计与调试技巧。通过核心参数计算、PCB布局优化和效率提升方案,帮助工程师快速掌握DC-DC电源设计要点,实现高效稳定的电源转换。

redis7keeper的博客 667

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

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

轮子制造工厂 1826

银河麒麟V10 SP3系统下如何安全安装gcc-toolset-10(附yum仓库避坑指南)

本文详细介绍了在银河麒麟V10 SP3系统中安全部署gcc-toolset-10的完整方案。核心在于通过配置默认禁用的yum仓库(如EPKL仓库)并配合--enablerepo参数进行精准安装,有效规避依赖冲突风险,实现与系统默认GCC 7.3的稳定共存。文章还提供了多版本环境切换、系统维护及故障排查的实用指南,确保操作的可控与可逆。

h0i1j2k3l的博客 589

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

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

轮子制造工厂 2226

加密视频如何破解 如何解除机器码绑定的视频

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 如何破解加密...

Q-980767270的博客 5万+

EtherCAT APWR报文实战:从站地址配置(0x0010)的初始化流程与报文解析

本文详细解析了EtherCAT APWR报文在从站地址配置(0x0010寄存器)中的初始化流程与实战应用。通过类比物业分配门牌号,生动解释了APWR报文如何高效批量配置从站地址,并深入探讨了0x0010寄存器的特殊作用、初始化步骤及常见问题排查方法。文章结合IgH主站的三从站配置案例,提供了报文解析技巧和调试建议,帮助工程师快速掌握EtherCAT网络配置的核心技术。

weixin_28744423的博客 410

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

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

轮子制造工厂 1798

解释多智能体强化学习(Multi-Agent Reinforcement Learning)(面试题200合集,中频、重要)

多智能体强化学习通过扩展传统强化学习框架,研究多个智能体在动态、交互环境中的策略优化问题。它既有理论上的挑战(如非平稳性和均衡求解),也有广泛的实际应用前景。数学上,它依赖马尔可夫博弈模型,核心是设计算法让智能体在合作或竞争中达到最优。

qq_38334677的博客 990

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

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

轮子制造工厂 565

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IOS开发之AVPlayer(可定制播放器)

MPMoviePlayerController足够强大,几乎不用写几行代码就能完成一个播放器,但是正是由于它的高度封装使得要自定义这个播放器变得很复杂,甚至是不可能完成。例如有些时候需要自定义播放器的样式,那么如果要使用MPMoviePlayerController就不合适了,如果要对视频有自由的控制则可以使用AVPlayer。AVPlayer存在于AVFoundation中,它更加接近于底层,所

ciwei_numberOne的博客 3853

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

xiaoxin5596的专栏 1772

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

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

基于 AVPlayer 自定义播放器

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

diancannei3748的博客 841

视频播放–AVPlayer

视频播放–AVPlayer 能播放本地、远程的音频、视频文件 基于Layer显示,需要自己编写控制面板 -(AVPlayer *)player { if(_palyer == nil){ // 1.获取本地URL方式一 NSString *filePath = [NSBundle mainBundle] pathForResource:@"welcome" o

vic的博客 1万+

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

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

u011140147的专栏 12万+

AVPlayer v1.4 - 超强媒体播放器 中文版

http://www.51ipa.com/multimedia/avplayer/AVPlayer-iPhone.html

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 4万+

【亲测免费】 最简单的Android AVPlayer:高效、易用的多媒体播放器

最简单的Android AVPlayer:高效、易用的多媒体播放器 项目简介 在移动开发中,高效的媒体播放功能往往是应用的核心部分。 是一个专为Android平台设计的轻量级多媒体播放库。它的目标是提供最简洁的API接口,让开发者能够快速集成并实现视频和音频播放功能。 技术解析 核心特性 基于Android系统自带的AVPlayer框架:此项目利用了Android原生的AudioTrack和V...

gitblog_00082的博客 1万+
上一篇: 《iOS 开发进阶(唐巧)》读书笔记
下一篇: 《AV Foundation 开发秘籍》读书笔记(三)
mayan29
博客等级 码龄11年 13粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值