《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播放器 注释齐全 歌词随心动 暂停 下一曲 上一曲

西门子smart能搜到cpu但连接当前IP地址失败

将ip地址改到同一网段 本机为192.168.1.119就是192.168.1.1网段,但plc在192.168.0.1网段,所以显示ip连接失败,改为同一网段192.168.1.xxx即可(为避免ip冲突尽量改到200往后最大255)如果显示这一步,那么你的物理连接是没有问题的,应当是plc和电脑并不在同一网段导致的问题。输入ipconfig 查看本机网段与plc是否为同一网段。此电脑就不在同一网段所有造成通讯失败,接下来解决这个问题。win+r打开运行,打开cmd。再次尝试,如果还是报错,那么。

weixin_62678581的博客 9864

AVPlayer 无间隔循环播放

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

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

2023东华大学OJ机试题22-70

东华大学计算机考研复试机试22 约瑟夫环223、整除的尾数24、回文质数25、汽水瓶26、阶乘最后的非0位27、算菜价28、 水果价格29、求奇数的乘积30、求最晚和最早日期31、素数32、计算e33 数字之和34 繁殖问题35 奇妙的数字36 整除的尾数37 黑色星期五38 树39 约瑟夫环40 最大与最小41 环42 求数列项43 最高频率44 三艘船45 回文数46 特殊四位数47 最大值48 数列149 修理牛棚50 按要求输出序列51 部落人乘法52 序列53 双重回文数54 等差数列55 人见人

m0_49263811的博客 2598

iOS 视频播放(AVPlayer)

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

风中的劲草 3万+

STM32版CCD线性摄像头寻线寻迹小车_stm32接ccd

目前大多数的小车寻线寻迹都是用红外对管寻线,这是比较简单也比较成熟的技术方案,且成本也低。本文将介绍使用CCD线性摄像头寻线寻迹。TSL1401 线性传感器由一个 1x128 的光电二极管阵列、相关的电荷放大电路以及一个内部像素数据保功能组成。内部像素数据保功能可以为所有像素点提供同时积分的开始和停止时间。该阵列由 128 个像素组成,每个像素的感光面积为 3,524.3 平方微米。像素之间的间隔为 8μm。内部控制逻辑简化了操作,该模块需要串行输入(SI)信号和时钟信号(CLK)。

2401_87557129的博客 3229

液态神经网络(LNN):打破AI“静态快照”的连续动力学革命---AI大模型系统从零开始0029

MIT研究团队受秀丽隐杆线虫神经系统的启发,开发出革命性的液态神经网络(LNN)。该技术通过连续微分方程建模神经元动态,实现输入响应速度的自适应调节,解决了传统AI模型静态化、高能耗和低解释性的痛点。LNN具有三大突破性优势:仅需少量神经元(如20个)即可完成复杂任务;能处理非均匀时序数据;在自动驾驶、医疗监测等领域展现出卓越的适应性和鲁棒性。这项将生物智能与数学建模完美融合的技术,有望成为下一代AI的核心架构,目前已在无人机导航等场景验证了其高效性,被预测为2026年最具潜力的AI突破方向。

添柴程序猿的专栏 372

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

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

轮子制造工厂 1826

手把手教你双目测距理论及生成视差图,深度图,点云图像

Stereo Vision, 也叫双目立体视觉,它的研究可以帮助我们更好的理解人类的双眼是如何进行深度感知的。双目视觉在许多领域得到了应用,例如城市三维重建、3D模型构建(如kinect fusion)、视角合成、3D跟踪、机器人导航(自动驾驶)、人类运动捕捉(Microsoft Kinect)等等。双目测距也属于双目立体视觉的一个应用领域,双目测距的基本原理主要是三角测量原理,即通过视差来判定物体的远近。

qq_53545309的博客 2280

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

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

轮子制造工厂 2226

Python爬虫实战:构建高可用静态网页爬虫 - 以 Quotes 网站数据采集为例!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 461

camera QXXX架构

This article introduces the QCX camera architecture for Qualcomm’s latest automotive chips including SA8650. It elaborates the layered camera stack under QNX, HGY and HQX systems, covering client applications, stream manager, CamX components and hardware d

qq_39257814的博客 4544

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

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

轮子制造工厂 1798

华为od 面试八股文_前端_01_含答案

华为od 面试八股文_前端_01_含答案

MISAYAONE的博客 2748

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

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

轮子制造工厂 565

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

ciwei_numberOne的博客 3853

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

xiaoxin5596的专栏 1772

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

基于 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、付费专栏及课程。

余额充值