我们已经了解了如何使用AudioRecord录制pcm音频,所以我们要了解pcm数据的存储格式,才能对其进行转换。
首先看一下:
以上图为例,在初始化AudioRecord的时候可以设置录制的格式:
其中最常用的是ENCODING_PCM_16BIT,在网上查看一下很多的资料,ENCODING_PCM_8BIT已经处于半废弃状态,随着科技的进步,就连小孩子的玩具播放的音频都是16位的。
另外一个参数是声道数:
双声道会以LRLRLR的格式保存左右声道的内容,组合成一个完成的样本。
从上图我们可以总结:8个比特的位置,8位单声道可以存储8个样本,8位双声道能存储个样本,16位双声道能存储4个,16位双声道只能存储2个。
今天的内容非常的简单,主要是为了下一篇做准备,下一篇我们会实际 *** 作:pcm单声道和双声道的转换。
播放声音可以用MediaPlayer和AudioTrack,两者都提供了java API供应用开发者使用。虽然都可以播放声音,但两者还是有很大的区别的。
其中最大的区别是MediaPlayer可以播放多种格式的声音文件,例如MP3,AAC,WAV,OGG,MIDI等。MediaPlayer会在framework层创建对应的音频解码器。
而AudioTrack只能播放已经解码的PCM流,如果是文件的话只支持wav格式的音频文件,因为wav格式的音频文件大部分都是PCM流。AudioTrack不创建解码器,所以只能播放不需要解码的wav文件。
当然两者之间还是有紧密的联系的,MediaPlayer在framework层还是会创建AudioTrack,把解码后的PCM数流传递给AudioTrack,AudioTrack再传递给AudioFlinger进行混音,然后才传递给硬件播放。
所以是MediaPlayer包含了AudioTRack。
通过查看API可以知道,MediaPlayer提供了5个setDataSource方法,分为三类,一类是传递播放文件的字符串路径作为参数,例如直接取sd卡里mp3文件的路径,一类是传递播放文件的FileDescriptor文件描述符作为播放的id,例例如从db中查询的音频文件的id,就可以直接赋给MediaPlayer进行播放。还有一类是Uri类型的资源文件,用于播放content uri文件。
今天在测试同事的微信平台的发送语音的时候,发现有时候语音能发过来,有时候就不行,经过检查,发现丢掉了检测音频时长(微信里面语言时长要限定在60S内),好吧,我补上,闲着也是闲着~
首先是读取语音的时长:
<span style="font-size:14px;"> /// <summary>
/// 获取上传音频的时间长度
/// </summary>
/// <param name="strFullUrl">The STR full URL</param>
/// <returns>SystemString</returns>
/// <remarks>Editor:v-liuhch CreateTime:2015/5/15 17:32:57</remarks>
public string GetLocalVoiceTotalTime(string strFullUrl)
{
ShellClass sh = new ShellClass();
Folder dir = shNameSpace(PathGetDirectoryName(strFullUrl));
FolderItem item = dirParseName(PathGetFileName(strFullUrl));
return dirGetDetailsOf(item, 27); // 获取歌曲时长。
}</span>
使用shellclass的时候要先引用COM组件Microsoft Shell Controls And Automation,并将Embed Interop Type 设为False。
由于上述函数只支持读取本地文件,所以,我们将得到的文件先放在临时文件夹中,判断完成之后立即删除。
<span style="font-size:14px;">/// <summary>
/// 检查上传音频文件的总时间长度是否小于60s
/// </summary>
/// <param name="file">The file</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
/// <remarks>Editor:v-liuhch CreateTime:2015/5/15 17:34:51</remarks>
public bool ChkVideoTotalTime(>
很简单啊:Complex[] complexData = new Complex[audioDatalength];for (int i = 0; i < complexDatalength; i++) { complextData[i] = new Complex(audioData[i], 0);}Complex[] fftResult = FFTfft(complexData);[/code]
以上就是关于Android音视频系列(六):PCM音频的存储格式全部的内容,包括:Android音视频系列(六):PCM音频的存储格式、MediaRecorder和AudioRecord的区别和联系、文章怎么测试语音时长等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)