Android音视频系列(六):PCM音频的存储格式

Android音视频系列(六):PCM音频的存储格式,第1张

我们已经了解了如何使用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的区别和联系、文章怎么测试语音时长等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9610889.html

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

发表评论

登录后才能评论

评论列表(0条)

保存