音视频 — AudioRecorder 和 AudioTrack

音视频 — AudioRecorder 和 AudioTrack,第1张

MediaRecorder: 录制的音频文件是经过压缩后的,需要设置编码器。并且录制的音频文件可以用系统自带的Music播放器播放。

优点: 官方提供 API

缺点: 不能实时处理音频,输出格式不多,且PCM可以处理生成

AudioRecord: 录制的是PCM格式的音频文件,需要用AudioTrack来播放。

优点: 可以实时获取音频的数据做到边录边播放,可以对获取的音频做处理,压缩,传输等

缺点: 输出的是原始数据 PCM 所以播放器不能播放,需要通过AudioTrack处理

采集音频的步骤:

1配置 AudioRecorder 构造函数的参数

2初始化缓冲区

3开始采集 ,子线程里将缓冲区的数据取出,写入文件流

4停止采集,释放资源

audioSource: 音频采集的输入源,可选的值以常量的形式定义在 MediaRecorderAudioSource 类中,例如:MIC(由手机麦克风输入),VOICE_COMMUNICATION(用于VoIP应用)等等。

sampleRateInHz: 采样率,注意,目前44100Hz是唯一可以保证兼容所有Android手机的采样率。

channelConfig: 通道数的配置,可选的值以常量的形式定义在 AudioFormat 类中,常用的是CHANNEL_IN_MONO(单通道),CHANNEL_IN_STEREO(双通道)

audioFormat: 返回的音频数据的格式,可选的值也是以常量的形式定义在 AudioFormat 类中,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),注意,前者是可以保证兼容所有Android手机的。

bufferSizeInBytes: AudioRecord 内部的音频缓冲区的大小,该缓冲区的值不能低于一帧“音频帧”(Frame)的大小

参数配置:

AudioRecord 提供了一个类为我们计算最小缓冲区,参数就是我们上面配置的 采样率,声道, 返回的音频数据的格式

直接调用创建好的 AudioRecorder 对象的 startRecording();

开始播放步骤:

1配置参数

2配置缓冲区

3开启子线程,把缓冲区读数据转换成输入流,再调用AudioTrack读 write()写入数据,最后调用 play()

4结束释放资源

参数和 AudioRecorder 差不多,有区别的就是 AudioTrack 是输出声道,还要播放的类型,和播放的模式

streamType: 播放的类型,都定义在 AudioManager 类中

mode: 播放的模式, MODE_STATIC, MODE_STREAM 两种

两者的区别

和上面的 AudioRecorder 的配置一样

Demo >

audio是音频接口,audio是连接麦克风和其他声源与计算机的设备,其在模拟和数字信号之间起到了桥梁连接的作用。

audio接口又分为audio in(音频输入)接口和audio out(音频输出)接口。音频工作站最重要的是还设有AES/EBU以及SPDIF等数字接口,用来进行数字音频信号的输入和输出。

audio音频接口的作用

audio音频接口可将计算机、录像机等的音频信号输入进来,通过自带扬声器播放。还可以通过音频输出接口,连接功放、外接喇叭。简单来说,音频接口是连接麦克风和其他声源与计算机的设备,其在模拟和数字信号之间起到了桥梁连接的作用。音频接口通常与前置麦克风、线路输入和其他一系列的输入设备配合使用。

说明:音频的录制通过AudioRecord对象进行,这里录制出来的数据没有进行编码,是属于PCM格式的数据,可以理解为Android平台上的原始的音频数据,只能通过AudioTrack对象进行播放,AudioTrack对象可以对每一帧音频进行控制,灵活性比MediaXXX强大,缺点是播放的音频数据格式必须是PCM格式,因此如果我们使用AudioTrack播放进行了编码的音频数据,则需要先进行解码成PCM格式数据,这边先来展示一下自己写的小Demo。

功能描述:1、长按开始录制音频,松开结束录制并保存成文件(录制过程中会实时显示当前的分贝值数值,并且根据分贝值更新长按控件状态以及显示录制时长(单位秒))。2、支持文件的删除、重命名、解码成PCM、编码PCM格式数据。3播放支持05倍速,原始倍速,2倍速播放,支持播放与暂停。

视频展示:

附上获取分贝值 demo

如果使用 Audio API 播放时获取的时间出现错乱,可能是因为时间戳不正确或者播放过程中出现了意外的异常。您可以采取以下措施来解决:

1 检查时间戳

在使用 Audio API 播放音频文件时,可以使用 `audiocurrentTime` 获取音频的当前播放时间,该值是从音频开始播放的时间点的秒数计算出来的。如果该值出现错乱,则可能是因为结束时间戳没有正确设置或者开始时间戳不在音频文件开头的位置。您可以在程序中检查一下是不是出现了这两种情况。

2 检查异常情况

在播放音频文件时,有可能会出现一些异常情况,如请求超时、网络不稳定等。这些因素可能会导致播放时间出现错乱,因此您需要在代码中进行相应的错误处理,使得程序可以更加健壮和稳定。

如果以上措施仍然无法解决问题,您可以在描述问题时提供更多信息,如具体的错误提示或截图,以便我更好地帮助您解决问题。

  公司的项目需要使用这个标签。在使用的过程中遇到了两个问题:一个是 部分手机浏览器无法实现自动播放(同样也无法使用js控制实现自动播放) ,还有一个是 部分浏览器audio标签无法正常响应ended(播放结束)事件,无法获取audio标签的duration属性的值 。这里分享一下我的处理方法,希望能够帮助到同样遇到类似问题的同学

  知道了原因那么自然就很好处理了。对于这个问题,网上大多处理方式都是先监听用户的DOM *** 作,如果事件响应了音频还没有播放,则播放音频。

  而我们这边的业务需求,需要一开始就获取自动播放的权限(音频是我们应用的一个关键功能),所以我们的处理方式是页面开始就引导用户点击。

  这里,用户点击之后才能使用我们服务。用户点击之后,我们也就获取到了js控制自动播放的权限了。

  如果你们的业务需求无法使用以上方式在一开始就让用户点击、获取播放权限,而且音频并非页面加载完就必须播放(例如背景音乐之类的)。那么可以先判断一下当前浏览器是否支持自动播放,如果支持则页面加载完立即播放音频,如果不支持则监听用户的DOM *** 作再播放音频。

  这里我写一个audioPlayPluginjs,对audio标签的常用 *** 作进行了一些简单的封装。 github地址 , coding地址

  因为业务需求,我必须监听音频的各种状态(播放中timeupdate、暂停pause、播放结束ended、缓冲waiting)等,但是在部分手机浏览器(例如MIUI的系统浏览器)中监听不了ended事件。也无法获取audio标签的duration属性的值(如果能够获取duration属性的值,就可以通过监听timeupdate事件,判断currrentTime和duration是否相等来模拟ended事件)。

  起初看到文章说是 Response Headers的content-type属性值为audio/x-mpeg导致的(浏览器不支持x-mpeg模式),把值设置为audio/mpeg即可。然而,找到后端说了这事儿,他弄了半天把content-type属性值设为audio/mpeg,然而问题并没有解决。

  最后我做了一个测试,同一个音频直接放在网站目录下用相对路径就可以正常监听ended事件,也能正常获取duration属性值。生产环境我们的文件是在阿里云上,使用绝对路径。对比了一下headers信息,发现唯一不同的地方就是Status Code不同。能正常监听的Status Code是206,不正常的是200。206是分段加载,具体各种status code可以戳 这里 。

  第二天,后端主动问我那个问题解决了没。我就说了我的发现,最后后端将音频文件的返回方式调整为206后,问题成功解决。

  总结一下: 发生这个问题的原因是音频类型文件请求的响应方式不对 。其实默认的响应方式就是206,只是我们后端在设置文件响应方式的默认配置时,直接copy了一些配置文件,其实并不知道他修改了音频文件的响应方式。

  以上是我使用<audio>标签时遇到的两个问题,和我的解决方案。希望能够帮助到各位同学。

  

以上就是关于音视频 — AudioRecorder 和 AudioTrack全部的内容,包括:音视频 — AudioRecorder 和 AudioTrack、如何使用Audio Unit 混合音频、audio是什么接口等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9591031.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存