陪玩网站源码开发,声音采集和录制的实现

声音采集
在陪玩网站源码开发过程中,音视频通话的实现会经历采集、编码、传输、解码、播放等环节,其中音频的采集是在移动设备的麦克风中实现的,在陪玩网站源码中,麦克风在采集到声音后转化为模拟电信号,之后需要将模拟电信号数字化转化为计算机能够识别的模拟信号。
Android中利用AudioRecord可以录制声音,录制出来的声音可以设置为PCM声音。想要将声音用计算机语言表述,则必须将声音进行数字化。将声音数字化,最常见的方式是通过脉冲编码调制PCM(Pulse Code Modulation) 。声音经过麦克风,转换成一连串电压变化的信号。要将这样的电压变化的信号转化成为PCM信号则需要进行三个过程:抽样、量化、编码。要实现这三个过程,则需要使用三个参数,它们是:采样频率、采样位数和声道数。
在这里插入图片描述

1、采样频率
采样频率即取样频率,指每秒钟取得声音样本的次数。采样频率越高,陪玩网站源码中的声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多。由于人耳的分辨率很有限,太高的频率并不能分辨出来。在16位声卡中有22KHz、44KHz等几级,其中,22KHz相当于普通FM广播的音质,44KHz已相当于CD音质了,目前陪玩网站源码的常用采样频率都不超过48KHz。
2、采样位数
采样位数即采样值或取样值(就是将采样样本幅度量化)。它是用来衡量陪玩网站源码中声音波动变化的一个参数,也可以说是声卡的分辨率。它的数值越大,分辨率也就越高,所发出声音的能力越强。
在计算机中采样位数一般有8位和16位之分,8位不是说把纵坐标分成8份,而是分成2的8次方即256份; 同理16位是把纵坐标分成2的16次方65536份。
采样率和采样大小的值越大,记录的波形更接近原始信号。
3、声道数
很好理解,有单声道和立体声之分,单声道的声音只能使用一个喇叭发声(有的也处理成两个喇叭输出同一个声道的声音),立体声的pcm可以使两个喇叭都发声(一般左右声道有分工) ,更能感受到空间效果。
那么,现在我们就可以得到pcm文件所占容量的公式:
存储量 = (采样频率 · 采样位数 · 声道 · 时间)/8 (单位:字节数)
声音录制
Android中使用AudioRecord录制声音,根据上面讲述的声音采集原理,需要传递给AudioRecord采样频率、采样位数和声道数,除此之外还需要传入两个参数,一个是声音源,一个是缓冲区大小。

权限

在Android陪玩网站源码中录制声音需要相应的权限,注意动态申请权限的问题。

<uses-permission android:name="android.permission.RECORD_AUDIO" />

音频源

下面是Android陪玩网站源码支持的音频源:

/** 默认声音 **/
public static final int DEFAULT = 0;
/** 麦克风声音 */
public static final int MIC = 1;
/** 通话上行声音 */
public static final int VOICE_UPLINK = 2;
/** 通话下行声音 */
public static final int VOICE_DOWNLINK = 3;
/** 通话上下行声音 */
public static final int VOICE_CALL = 4;
/** 根据摄像头转向选择麦克风*/
public static final int CAMCORDER = 5;
/** 对麦克风声音进行声音识别,然后进行录制 */
public static final int VOICE_RECOGNITION = 6;
/** 对麦克风中类似ip通话的交流声音进行识别,默认会开启回声消除和自动增益 */
public static final int VOICE_COMMUNICATION = 7;
/** 录制系统内置声音 */
public static final int REMOTE_SUBMIX = 8;

缓冲区大小

接下来便是要设置陪玩网站源码中缓冲区大小。麦克风采集到的数据先放置在一个缓冲区里面,之后我们再从这个缓冲区里面读取数据,从而获取到麦克风录制的音频数据。在Android中不同的声道数、采样位数和采样频率会有不同的最小缓冲区大小,当AudioRecord传入的缓冲区大小小于最小缓冲区大小的时候则会初始化失败。大的缓冲区大小可以达到更为平滑的录制效果,相应的也会带来更大一点的延时。

在这里插入图片描述

通过下面的方法可以获得最小缓冲区的大小:

AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);

当获取失败后会返还负数,根据错误码可以得到相应的错误信息。

初始化

在对AudioRecord进行录音前需要对采样率进行设置,对于采样率,Android官方文档要求所有的手机需要对44100Hz的采样率进行支持,可是国内的一些极其少数的手机依然不支持44100Hz的采样率。以下是几种常见的采样率:

8000, 11025, 16000, 22050, 44100, 48000

在设置采样率之前需要对手机对设置的采样率是否支持进行检测,下面是一段代码是获取手机支持的音频采样率:

public void getValidSampleRates() {
    for (int rate : new int[] {8000, 11025, 16000, 22050, 44100}) {  // add the rates you wish to check against
        int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
        if (bufferSize > 0) {
            // buffer size is valid, Sample rate supported

        }
    }
}

为了达到立体声的效果,Android也是支持多个声道采集的,一些情况下为了完成在所有手机上的视频,我们需要把声道设置为AudioFormat.CHANNEL_CONFIGURATION_MONO(单声道)。
对于采样位数,选的值也是以常量的形式定义在 AudioFormat 类中,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),ENCODING_PCM_16BIT可以保证兼容所有Android手机的。
下面便是AudioRecord的初始化方法:

public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, 
                      int audioFormat, int bufferSizeInBytes) throws IllegalArgumentException

当传入的参数出现问题时会抛出异常。AudioRecord有一个状态量用来表示AudioRecord是否被成功初始化,通过getState()方法可以获取,当返回为STATE_UNINITIALIZED表示未成功初始化,当返回为STATE_INITIALIZED表示已经成功初始化了。

读取数据

AudioRecord通过下面的方法可以读取到相应的录音数据:

public int read(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes) {    
        return read(audioData, offsetInBytes, sizeInBytes, READ_BLOCKING);
}

当读取失败的时候会返回相应的负数错误码。

参数选择

Android手机有很多厂商,对于开发者来说兼容性一直以来都是一个重要的问题。在陪玩网站源码录音过程中,Android推荐的参数如下:

sampleRateInHz = 44100;
channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
audioFormat = AudioFormat.ENCODING_PCM_16BIT

以上就是“陪玩网站源码开发,声音采集和录制的实现”的全部内容,希望对大家有帮助。

本文转载自网络,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理
链接:https://www.jianshu.com/p/2cb75a71009f/

原文地址:https://www.cnblogs.com/yunbao/p/15002162.html