pcmandroid
1. Android 多媒体音频开发中怎么将PCM转成ADPCM
Adensoft Audio MP3 Converter
Adensoft.Audio.MP3.Converter是一款强大的音频转换工具,能将当前主流的音频格式如WAV PCM, WAV ,GSM, ADPCM, DSP ,MP2,WMA ( win Media Audio ),Ogg Vorbis,VOX ( Dialogic ADPCM ),RAW ( PCM, A-LAW, U-LAW ),MPC (MusicPack),AVI (audio track),G.721,G.723,G.726,AIFF ,AU (UNIX audio format)无损的转换成mp3(支持批量转换)。软件同时提供良好的人机界面和完整的tag编辑功能。
2. 安卓手机上pcm格式的文件有什么用,能不能删除占的空间很大。
可以删除。
PCM文件具有流媒体特性,是数字通信的编码方式之一,删除后不会影响系统运行。
PCM文件被广泛用哪猜于素材保存及音乐欣赏,CD、DVD以及我们常见的 WAV文件中均有应用,PCM文件能够一边读一边播放,而不需要把这个文件全举毁部读出后然后回放,这样就可以做到不用下载 就可以实现收听了。也可以做到一边编码一边播放。
(2)pcmandroid扩展阅读
PCM中文称脉冲编码调制(Pulse Code Molation),是70年代末发展起来的,记录媒体之一的CD,在80年代初由飞利浦和索尼公司共同推出。
脉码调制的音频格式也被DVD-A所采用,它支持立体声和5.1环绕声,1999年由DVD讨论会发布和推出的。脉冲编码调制的比特率,从14-bit发展到16-bit、18-bit、20-bit直到24-bit;采样频率从44.1kHz发展到192kHz。
3. Android音视频【十二】使用OpenSLES和AudioTrack进行播放PCM
本节我们学习下如何播放pcm数据,在Android中有两种方法:一种是使用java层的 AudioTrack 方法,一种是使用底层的 OpenSLES 直接在 jni 层调用系统的 OpenSLES的c方法 实现。
两种使用场景不一样:
AudioTrack 一般用于 比如本地播放一个pcm文件/流,又或者播放解码后的音频的pcm流,API较简单。
OpenSLES 一般用于一些播放器中开发中,比如音频/视频播放器,声音/音频的播放采用的OpenSLES,一是播放器一般是c/c++实现,便于直接在c层调用OpenSLES的API,二也是如果用AudioTrack进行播放,务必会带来java和jni层的反射调用的开销,API较复杂。
可以根据业务自行决定来进行选择。
AudioTrack的方式使用较简单,直接在java层。
指定采样率,采样位数,声道数进行创建。
其中44100是采样率, AudioFormat.CHANNEL_OUT_STEREO 为双声道,还有 CHANNEL_OUT_MONO 单声道。 AudioFormat.ENCODING_PCM_16BIT 为采样位数16位,还有 ENCODING_PCM_8BIT 8位。 minBufferSize 是播放器缓冲的大小,也是根据采样率和采样位数,声道数 进行获取,只有满足最小的buffer才去操作底层进程播放。
最后一个参数mode。可以指定的值有 AudioTrack.MODE_STREAM 和 AudioTrack.MODE_STATIC 。
MODE_STREAM 适用于大多数的场景,比如动态的处理audio buffer,或者播放很长的音频文件,它是将audio buffers从java层传递到native层。音频播放时音频数据从Java流式传输到native层的创建模式。
MODE_STATIC 适用场景,比如播放很短的音频,它是一次性将全部的音频资源从java传递到native层。音频数据在音频开始播放前仅从Java传输到native层的创建模式。
是的,就这么一个方法。注意此方法是同步方法,是个耗时方法,一般是开启一个线程循环调用 write 方法进行写入。
注意在调用 write 方法前需要调用 audioTrack.play() 方法开始播放。
因为是pcm裸数据,无法像mediaplayer一样提供了API。所以需要自己处理下。可以利用 getPlaybackHeadPosition 方法。
getPlaybackHeadPosition() 的意思是返回以帧为单位表示的播放头位置
getPlaybackRate() 的意思是返回以Hz为单位返回当前播放采样率。
所以当前播放时间可以通过如下方式获取
OpenSLES:(Open Sound Library for Embedded Systems).
OpenSLES是跨平台是针对嵌入式系统精心优化的硬件音频加速API。使用OpenSLES进行音频播放的好处是可以不依赖第三方。比如一些音频或者视频播放器中都是用OpenSLES进行播放解码后的pcm的,这样免去了和java层的交互。
在Android中使用OpenSLES首先需要把Android 系统提供的so链接到外面自己的so。在CMakeLists.txt脚本中添加链接库OpenSLES。库的名字可以在 类似如下目录中
需要去掉lib
然后导入头文件即可使用了OpenSLES提供的底层方法了。
创建&使用的步骤大致分为:
一个 SLObjectItf 里面可能包含了多个Interface,获取Interface通过 GetInterface 方法,而 GetInterface 方法的地2个参数 SLInterfaceID 参数来指定到的需要获取Object里面的那个Interface。比如通过指定 SL_IID_ENGINE 的类型来获取 SLEngineItf 。我们可以通过 SLEngineItf 去创建各种Object,例如播放器、录音器、混音器的Object,然后在用这些Object去获取各种Interface去实现各种功能。
如上所说,SLEngineItf可以创建混音器的Object。
在创建播放器前需要创建音频的配置信息(比如采样率,声道数,每个采样的位数等)
开始播放后会不断的回调这个 pcmBufferCallBack 函数将音频数据压入队列
(*pcmBufferQueue)->RegisterCallback(pcmBufferQueue, pcmBufferCallBack, this);
如果想要暂停播放参数直接设置为SL_PLAYSTATE_PAUSED,若暂停后继续播放设置参数为SL_PLAYSTATE_PLAYING即可。若想要停止播放参数设置为SL_PLAYSTATE_STOPPED即可。
首先获取播放器的用于控制音量的接口SLVolumeItf pcmVolumePlay
然后动态设置
首先也是获取播放器的用于控制音量的接口SLMuteSoloItf pcmMutePlay
然后动态设置
看起来控制还是蛮简单的哈。先熟悉这么多,OpenSLES还是蛮强大的。
https://github.com/ta893115871/PCMPlay
4. android 录音pcm源码怎样加入降噪函数
1.PCM 编码实现(M函数) function code=PCMcoding(Range,S) code=zeros(1,8); Normalization=abs(S)/Range; deta=1/2048; if sign(S)==1 code(1)=1; else code(1)=0; end detas=ceil(Normalization/deta); if detas>128 code(2)=1; if detas>51
5. android能播放pcm文件吗
原生系统应该不行,但毕竟是开源系统,你可以下载支持这个文件的播放器
6. 安卓手机如何打开.pcm文件
01安卓手机不能打开.pcm文件,只能在电脑上打开,首先用app把视频文件下下来,然后在手机上找到那个app的文件夹,把下载的pcm格式导出到电脑上,然后在电脑上下一个pcm格式批量提取器,就可以实现把网校的课程下载到电脑上用常用的视频格式给打开了。
7. Android音视频系列(七):PCM音频单声道与双声道的相互转换
上一篇我们已经学习了PCM音频的保存格式,这一篇我们通过掌握的知识,完成PCM音频的单声道和双声道的互相转换。
首先我们把上一篇的最核心部分贴出来:
我们首先完成单声道转双声道的操作。
单声道转双声道的基本原理:
首先我录制了一个音频保存到ArrayList中:
录制的是16位的数据,所以我们每一个采样的数据会占据两位,所以在拷贝的过程中,我们也要每两位拷贝一次:
单声道转声道的操作就完成了。
双声道转单声道的原理:
我们可以按照单声道双声道的做法,每四位取前两位或后两位的数据即可。但是这里我们换一种做法。
这里我们使用了ByteBuffer帮助我们把Byte转成Short。其中有一个很重要的坑,就是设置Byte转Short的规则:
所以我们一定要确保高低位的顺序,否则得到的Short一定是错的,经过测试,录制的音频是低位在前,所以我们修改ByteBuffer默认的高位在前的配置:
相同的原理,我们需要Byte转Int都可以借助对应的Buffer进行读取,非常的方便。
基本流程和第一种方法一样,如果是你用的Java,你还可以通过位运算进行Short和Byte的转换,但是kotlin的对应的运算符却无法正确转换,具体原因还不清楚,这也是为什么我使用了Buffer进行转换的原因。
只要我们掌握了PCM的保存格式,单声道和双声道的互相转换还是非常轻松的,下一篇我们来了解一下新的音频格式:WAV。
8. Android音视频系列(六):PCM音频的存储格式
我们已经了解了如何使用AudioRecord录制pcm音频,所以我们要了解pcm数据的存储格式,才能对其进行链者转换。
首先看一下图片:
以上图为例,在初始化AudioRecord的时候可以设置录制的格式:
其中最常用的是ENCODING_PCM_16BIT,在网上查看一下很多的资料,ENCODING_PCM_8BIT已经处于半废弃状态,随着科技的樱竖进步,就连小孩子的玩具播放的音频都是16位的。
另外一个参数是声道数:
双声道会以LRLRLR的格式保存左右声道的内容,组合成一个完成的样本。
从上图我们可以总结:8个比特的位置,8位单声道可以存储8个样本,8位双声道能存储个样本,16位双声道能存储4个,16位双声道只能存储2个。
今天的内容非常的简单,主要是为了下一篇做准备,下一篇我们会实际操作:pcm单声道和双声道的转换。脊唤大
9. android直接播放pcm语音为什么会有噪音
最近在做手机客户端用G726编码库向机台发送语音消息的DEMO,弄了一周左右才解决.
中间碰到的问题贼多,主要是用AudioRecord采集声音的时候,然后用AudioTrack播放经常会出现噪音,这样的情况让人实在是无法接受。
后来查谷歌实在是没折了,于是再次翻查了下sipdroid的代码,发现sipdroid在采集声音后,每次都会调用一个函数,于是我猜测,这个函数应该跟去除噪音有关,于是写了个DEMO,测试了一下,发现噪音还真消除了.
噪音消除算法:
void calc1(short[] lin,int off,int len) {
int i,j;
for (i = 0; i < len; i++) {
j = lin[i+off];
lin[i+off] = (short)(j>>2);
}
}
自己录制PCM,播放PCM的DEMO。
10. android中怎么对音频数据pcm进行解码
工程代码结构较为简单:
简单说下思路,先把PCM音频数据从指定的路径文件读到内存,然后给AudioPlayer设置数据源,音频参数等,最后执行播放,暂停,停止等操作
贴上部分类代码片段:
publicclassAudioParam{
intmFrequency;//采样率
intmChannel;//声道
intmSampBit;//采样精度
}
publicinterfacePlayState{
publicstaticfinalintMPS_UNINIT=0;//未就绪
publicstaticfinalintMPS_PREPARE=1;//准备就绪(停止)
publicstaticfinalintMPS_PLAYING=2;//播放中
publicstaticfinalintMPS_PAUSE=3;//暂停
}