导航:首页 > 操作系统 > android播放多个音频

android播放多个音频

发布时间:2022-11-19 01:37:31

android播放简短音频-SoulPool

前言

最近新接触的项目中有一个业务功能是语音播报,所以有接触到了SoulPool这个类,写个文章记录一下~

如果项目业务功能中需要播放简短的音频的话,可以使用SoundPool 。SoundPool 是 Android 提供的一个API类,用来播放简短音频的,使用起来简单并且功能强大。

SoundPool 除了可以完成音频的播放、暂停、恢复及停止的操作外,还可以调节左右声道的音量值、调整播放的语速、设置播放的优先级以及播放的次数等等。

创建SoulPool

SoundPool 的创建方式在Android 5.0 以前是直接使用SoundPool 的构建方法即可,在Android5.0之后,则是使用Builder模式来创建。为了更好的兼容性,我们可以判断一下api版本进行对应的创建。

Android5.0之前SoundPool 的构造函数有三个参数分别是maxStreams、streamType和srcQuality。

maxStreams:同时播放流的最大数量,当播放的流大于此设置值时,则会选择性停止优先级较低的流;

streamType:流类型,例如STREAM_MUSIC、STREAM_ALARM、STREAM_NOTIFICATION等;

srcQuality:采样率转换器质量,很少用得上,默认设置0即可;

Android5.0 之后,使用Builder模式进行构造,可以设置多个参数。我这里放两张源码截图,如果需要详细了解的,可以自己点进去追踪一下~

SoundPool.Builder中setMaxStreams和之前Android5.0SoundPool的构造函数maxStreams参数相同。SoundPool.Builder中setAudioAttributes用来设置audio 属性,此值要么不设,要么设置不为null的值,否则会导致异常产生。

音频资源的加载与播放

首先我们要进行音频资源的加载,加载成功之后,才能进行播放。加载音频,我们可以使用SoulPool实例中的load方法。

加载音频资源时异步执行的,此过程需要时间,所以我们可以使用SoulPool中的OnLoadCompleteListener接口进行监听,其中的onLoadComplete方法则是在音频资源加载完成后调用。

我们还可以通过SoulPool中的unload方法,卸载之前加载过的资源。

其实,只要我们点进去SoulPool类中,就能看见它提供的所有方法了,如上图。

音频播放,我们是使用到了SoulPool实例中的play方法,该方法要传比较多的参数,分别是soundID、leftVolume、rightVolume、priority、loop和rate,它们分别代表的意思是:

soundID:是SoulPool加载资源load方法返回的值,指向某个已加载的音频资源;

leftVolume和rightVolume:分别代表左声道和右声道的值,设置范围在0f ~ 1f;

priority:则是流的优先级;

loop:是循环播放的次数, 例如-1是表示无限循环;

rate:则是播放的速率 ,1是正常速率,如果设置2则表示2倍速率;

play方法返回的streamID,若返回0则播放失败,其它值都代表播放成功。

图中方法还有pause、resume、stop分别代表暂停音播放、恢复音频播放和停止音频播放。SoulPool提供的方法,源码中都有,这里就不一一细说了。记得!一定要释放资源(release)

注意事项

1.SoulPool并不是什么格式的音频资源都支持的,MP3这些常见的格式当然是支持的,如果有别的格式的音频可以自己测试一下;

2.SoulPool是Android为了播放简短音频提供的api,所以尽量不要播放时间过长的音频;

3.设置播放流的优先级的问题,如果同时播放的活动流的数目超过设置的maxStreams时,会根据优先级来停止优先级较低的流;如果有多个具有相同低优先级的流,它将选择要停止的最旧流,并且该流不再有效;如果要播放的流的优先级最低,则会播放失败。

4.加载音频资源的数量限制也注意一下,别加载过多。

                                2021年9月15日程序猿小钟带着【播放简短音频类-SoulPool】到此一游~

② Android音频播放

最近需要在Android的客户端中使用PCM声音播放和录制,简单学习了一下。有不正确的地方还请指出。

首先有几个概念需要了解一下:采样频率、声道数、采样位数。

采样频率一般是sample rate, 代表的是数字化音频时每秒采样的次数。常见的有44.1KHz(CD品质)、48KHz等。

这个很好理解,单声道Mono就是声音从一个方向传出来;双声道Stereo也叫立体声,声音是从两个方向传来。通常的流行音乐中,仔细听能发现每个声道可能侧重不同的乐曲声部,比如左声道吉他,右声道钢琴,人声似乎两个声道都有,听起来就像站在中间一样。(这里没有考证,随便举例)

每一个采样都是一个数据点,采样位数是指这个数据点使用了几位来记录。AudioTrack类只支持8位和16位的PCM音频。8位就是2的8次方,即256个值;而16位则是2的16次方,有65536个值。

这个在音频的编解码中还是比较常用的。在PCM格式中,1秒钟音频的数据大小是SampleRate×Channel×Bit/8,单位是byte字节。由于PCM本身没有音频帧的概念,所以通过这个公式就能计算出任意时长音频的大小,或者得到任意大小音频的时长。如果规定1个音频帧是“每个声道256个采样”,双声道下就是512个采样,那么1帧的数据量就是256×Channel×Bit/8,同理可以推断出1秒钟有多少音频帧等等。音频帧的概念在各种编解码中各有不同,但计算公式大同小异,这里不展开。

Android中音频的播放使用的是AudioTrack类,具体用法非常简单。
首先设置buffer大小。AudioTrack播放时需要先写入buffer,如果这个buffer没有写满,那么这部分是不会播放的。所以buffer不能设置太小,这样会导致播放不连贯;而buffer也不能设置太小,这样不间断写入会消耗许多CPU资源。AudioTrack自带了getMinBufferSize方法可以给出一个最小buffer,一般用这个值就可以。getMinBufferSize方法三个参数分别是sample rate、channel和bit。

设置完buffer size就可以实例化一个AudioTrack。其中第一个参数streamType是指不同的音频流类型,包括STREAM_MUSIC、STREAM_ALARM、STREAM_VOICE_CALL、STREAM_RING等,是Android对不同音频的分类。中间三个参数很好理解,第四个是buffer size,刚刚计算出来了。最后一个参数mode有两种:MODE_STREAM和MODE_STATIC。前者是以流形式播放,后者则是一次性全部写入然后播放。

调用实例的play()方法就可以开始播放了。不过播放得要有数据吧?要填写数据就要用到write()方法。write方法中第一个参数是一个byte[]类型,是要写入的数据源,可以是从文件流中读取出来的;第二个参数offset是初始位移,即从source的哪个位置开始;第三个参数则是输入长度。

当write方法写满一个AudioTrack的buffer时,就会有声音播放出来了。
当播放完成后记得要把AudioTrack停止并释放。

③ 安卓或苹果 一个手机怎么同时放多个音乐

安卓下载多个播放器就可以,苹果不越狱不行的。
欢迎采纳,谢谢

④ Android MediaPlayer同时播放多首歌曲

不考虑Midware和底层的实现, 在应用层这么搞是很容易失败的, GPU CPU的执行效率这些都是考虑因素。
如果是硬件厂商没有修改,理想情况下是可以播放多个,但是非移动终端一般情况下只允许播放一个,你们所说的mediaplayer 或者surfaceview 都是上层的抽象和绘制,移动终端一般的配置也最多能带起3-5个播放,无论是内存还是硬件解码都不可能会无限制的让你去开n个播放

⑤ Android使用FFmpeg播放视频(二):音频播放

Android使用FFmpeg播放视频(一):视频播放
Android NDK开发:利用OpenSL ES实现声音播放

这里我创建了两个JNI函数,一个是播放的,一个是释放的如下:

这里我在用于播放的JNI函数中依次初始化了FFmpeg和OpenSLES

其中初始化FFmpeg的函数中的逻辑其实和使用FFmpeg播放视频画面中的逻辑差不多,主要区别就是要找到音频的索引以及后面对于解析音频的一些配置;而初始化OpenSLES基本就和之前使用OpenSLES播放PCM数据是一样的,具体如下:

最后再加入释放资源的逻辑即可

这里的案例源码是和之前播放视频画面的分开了
https://gitee.com/itfitness/ffmpeg-audio-demo

⑥ Android 中多个Mp3音频文件合成

由于项目需求,需要将多个Mp3文件合并成一个Mp3文件,老项目中使用 FileChannel.transferFrom方法合并,直接导致生成的音频文件无法正确获取进度和时长,调研后选择使用MediaExtractor方法,参考 https://juejin.im/post/5da80562f265da5bb5584a82 。

------------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------------------------------------
本来以为合成的功能已经实现,项目本地播放并没有发现问题,但是把合成的文件放到其他播放器中播放时,问题出现了。文件播放到最后几秒时,音频总时长会莫名的自增,以及合成的文件总时长与多个音频片段相加的时长有几秒偏差。应该是音频文件在流写入时出了问题,有了解的大牛帮忙分析分析。最后放弃这个合并方案, 选择了FFmpeg合并,解决了音频合成问题 。合并命令如下:

⑦ 安卓手机,怎么让手机自带音乐播放器支持多种音频的播放

没办法。除非你把自带替换成第三方。

⑧ android开发中多个音频使用的问题

MediaPlayer有OnCompletionListener接口,每播放完一次就会回调这个接口。定义一个播放方法,把这些音频放到一个列表里,每调用这个方法一次,列表索引加1。这个播放方法在OnCompletionListener接口里调用即可依次播放。

⑨ android音视频开发一安卓常用API

Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风录入的音频数据进行编码压缩(如AMR、MP3等)并存成文件,而后者则更接近底层,能够更加自由灵活地控制,可以得到原始的一帧帧PCM音频数据。如果想简单地做一个录音机,录制成音频文件,则推荐使用 MediaRecorder,而如果需要对音频做进一步的算法处理、或者采用第三方的编码库进行压缩、以及网络传输等应用,则建议使用 AudioRecord,其实 MediaRecorder 底层也是调用了 AudioRecord 与 Android Framework 层的 AudioFlinger 进行交互的。直播中实时采集音频自然是要用AudioRecord了。

2.1 播放声音可以用MediaPlayer和AudioTrack,两者都提供了Java API供应用开发者使用。虽然都可以播放声音,但两者还是有很大的区别的。

2.2 其中最大的区别是MediaPlayer可以播放多种格式的声音文件,例如MP3,AAC,WAV,OGG,MIDI等。MediaPlayer会在framework层创建对应的音频解码器。而AudioTrack只能播放已经解码的PCM流,如果对比支持的文件格式的话则是AudioTrack只支持wav格式的音频文件,因为wav格式的音频文件大部分都是PCM流。AudioTrack不创建解码器,所以只能播放不需要解码的wav文件。

2.3 MediaPlayer在framework层还是会创建AudioTrack,把解码后的PCM数流传递给AudioTrack,AudioTrack再传递给AudioFlinger进行混音,然后才传递给硬件播放,所以是MediaPlayer包含了AudioTrack。

2.4 在接触Android音频播放API的时候,发现SoundPool也可以用于播放音频。下面是三者的使用场景:MediaPlayer 更加适合在后台长时间播放本地音乐文件或者在线的流式资源; SoundPool 则适合播放比较短的音频片段,比如游戏声音、按键声、铃声片段等等,它可以同时播放多个音频; 而 AudioTrack 则更接近底层,提供了非常强大的控制能力,支持低延迟播放,适合流媒体和VoIP语音电话等场景。

使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView、TextureView 来预览 Camera 数据,取到 NV21 的数据回调。

4.1 一个音视频文件是由音频和视频组成的,我们可以通过MediaExtractor、MediaMuxer把音频或视频给单独抽取出来,抽取出来的音频和视频能单独播放; 

4.2 MediaMuxer的作用是生成音频或视频文件;还可以把音频与视频混合成一个音视频文件。

文献资料  https://www.cnblogs.com/renhui/p/7452572.html

⑩ 如何让2个安卓手机同时播放一个音乐(完全的同步)如果能5个手机同时播放就更完美了

咨询记录 · 回答于2021-06-11

阅读全文

与android播放多个音频相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:963
phpffmpeg转码 浏览:671
长沙好玩的解压项目 浏览:145
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:737
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:485
h3c光纤全工半全工设置命令 浏览:143
公司法pdf下载 浏览:382
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:350
风翼app为什么进不去了 浏览:778
im4java压缩图片 浏览:362
数据查询网站源码 浏览:150
伊克塞尔文档怎么进行加密 浏览:892
app转账是什么 浏览:163