Android音频通讯

音频通讯

音频属性

采样频率

也称为采样速度或者采样率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数是采样周期或者叫作采样时间,它是采样之间的时间间隔。通俗的讲采样频率是指计算机每秒钟采集多少个信号样本。

最常用的采样频率是44.1kHz,它的意思是每秒取样44100次。

比特率

指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送数据速度越快。声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数

量,是间接衡量音频质量的一个指标。

数码录音一般使用16比特、20比特或24比特制作音乐。

手机音频通信的硬件通信方式

方波

通常使用曼切斯特编码。

好处是方便简单。可以用单片机直接输出方波,经过衰减后即可使用;

缺点是兼容性不好、容易受干扰。因为手机音频只识别变化的电平信号,当长时间保持在一个非零电平时,手机将会视其为零,而强行拉回零电位。

正弦波

通常采用FSK、DTMF、信号发生器、方波转正弦波等。

模拟信号

指幅度的取值是连续的(幅值可由无限个数值表示),我们通常又把模拟信号称为连续信号,用来表达如温度、湿度、压力、长度、电流、电压等等信息。(在时间和数值上连续的信号)

优点:

(1)直观且容易实现。

缺点:

(1)保密性差。模拟通信,尤其是微波通信和有线明线通信,很容易被窃听。只要收到模拟信号,就容易得到通信内容。

(2)抗干扰能力弱。电信号在沿线路的传输过程中会受到外界的和通信系统内部的各种噪声干扰,噪声和信号混合后难以分开,从而使得通信质量下降。线路越长,噪声的积累也就越多。

数字信号

指幅度的取值是离散的,幅值表示被限制在有限个数值之内。二进制码就是一种数字信号。二进制码受噪声的影响小。易于有数字电路进行处理,所以得到了广泛的应用。(在时间上和数值上不连续的信号)

优点:

(1)加强了通信的保密性。语音信号经A/D变换后,可以先进行加密处理,再进行传输,在接收端解密后再经D/A变换还原成模拟信号。

(2)提高了抗干扰能力。数字信号在传输过程中会混入杂音,可以利用电子电路构成的门限电压(称为阈值)去衡量输入的信号电压,只有达到某一电压幅度,电路才会有输出值,并自动生成一整齐的脉冲(称为整形或再生)。

(3)可构建综合数字通信网。采用时分交换后,传输和交换统一起来,可以形成一个综合数字通信网。

缺点:

(1)占用频带较宽。

(2)技术要求复杂,尤其是同步技术要求精度很高。

(3)进行模/数转换时会带来量化误差。

模拟信号与数字信号之间的相互转换

模拟信号一般通过PCM脉码调制(Pulse Code Modulation)方法量化为数字信号。即让模拟信号的不同幅度分别对应不同的二进制值,例如采用8位编码可将模拟信号量化为2^8=256个量级,实用中常采取24位或30位编码;

数字信号一般通过对载波进行移相(Phase Shift)的方法转换为模拟信号。计算机、计算机局域网与城域网中均使用二进制数字信号,目前在计算机广域网中实际传送的则既有二进制数字信号,也有由数字信号转换而得的模拟信号。但是更具应用发展前景的是数字信号。

调制解调

调制(Modulation)
定义

将各种数字基带信号转换成适于信道传输的数字调制信号(已调信号或频带信号)。

分类

1、根据调制信号的形式,可分为:

(1)模拟调制。

(2)数字调制(FM有2FSK(2进制调制)、4FSK(4进制调制)、8FSK(8进制调制))。

2、根据被调信号的种类,可分为:

(1)脉冲调制。

(2)正弦波调制。

根据所控制的信号参量的不同,调制可分为以下三种。

调幅:使载波的幅度随着调制信号的大小变化而变化的调制方式。

调频:使载波的瞬时频率随着调制信号的大小而变,而幅度保持不变的调制方式。

调相:利用原始信号控制载波信号的相位。

(3)强度调制(如对非相干光调制)。

应用

在模拟电视中,视频信号采用调幅调制,传输信号的幅度随输入信号的幅度变化而变化,音频信号采用调频调制。

而在在收音机中,调频(FM)和调幅(AM)都有,通常情况下调频比调幅音质要好。声音传输的一个特性是高频的声音幅度会比较小,比较容易受干扰。为了改善这个情况,电视台发送信号的时候会人为提高高频的幅度,这叫做声音的预加重(emphasis);对应在接收的时候就必须采用去加重(De-emphasis),把高频的部分还原到正确的幅度。

解调(DeModulation)
定义

在接收端将收到的数字频带信号还原成数字基带信号。

分类

与调制的分类相对应,解调可分为:

(1)正弦波解调(有时也称为连续波解调)。

幅度解调、频率解调、相位解调。

(2)脉冲波解调。

脉冲幅度解调、脉冲相位解调、脉冲宽度解调、脉冲编码解调。

耳机座(公头)的引脚定义

Android手机上用的耳机大多都是3.5mm的四芯座,四个芯分别是:地(GND)、左声道(L)、右声道(R)和线控开关(MIC),常见的排列有以下两种:

1、国家标准:L-R-MIC-GND

2、国际标准:L-R-GND-MIC

PS

设备 -> 手机用MIC,DSP(数字信号处理),通过A\D模块转换成音频传输给手机。

手机 -> 设备用L或R或GND的任意一个,通过A\D模块转换成数据信号传输到设备。

数字信号编码

是用来解决数字数据的数字信号表示问题,即通过对数字信号进行编码来表示数据(数字信号编码的工作一般由硬件完成)。

归零编码 RZ

正电平代表逻辑 1,负电平代表逻辑 0,并且,每传输完一位数据,信号返回到零电平,也就是说,信号线上有 3 种电平:正电平、负电平、零电平。

RZ的波形如下:


不归零编码 NRZ

Non-return-to-zeroCode。与 RZ 的区别是,NRZ 不需要归零。(不归零编码是效率最高的编码。)

不归零反转编码 NRZI

Non-Return-to-ZeroInverted Code。与NRZ 的区别是,NRZI 用信号的翻转代表一个逻辑,信号保持不变代表另外一个逻辑。USB 传输的编码就是 NRZI 格式,在 USB 中,电平翻转代表逻辑 0,电平不变代表逻辑1(NRZI 遇 0 翻转,遇 1 不变)。

NRZ与NRZI的波形如下:


曼切斯特编码

Manchester Encoding,也叫做相位编码( Phase Encode,简写PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既用作时钟信号,又用作数据信号。

1、曼切斯特编码:在 IEEE802.3 标准中,逻辑“0”为下降沿(位中间电平从高到低),逻辑“1”为上升沿(位中间电平从低到高);

2、标准曼切斯特编码:而在清华大学出版的《计算机通信与网络教程》《计算机网络(第4版)》中却与之相反。

曼切斯特的波形如下:


差分曼彻斯特编码

是改进型的曼彻斯特编码,其特点是在每一位周期的中间,波形都有变化,如果在两位周期交界处电平没有变化,则表示“1”:有变化,则表示“0”(在信号位中间总是将信号反相;在信号位开始时不改变信号极性,表示逻辑“1”:在信号位开始时改变信号极性,表示逻辑“0”)。

差分曼切斯特的波形如下(差分曼切斯特看边界/虚线,虚线变实线了就是0,虚线就是1。):

图示中(a)是不归零码;(b)是曼切斯特码;(c)差分曼切斯特码。


当要发送数据到设备端时,将数据调制成声波数据,播放声音,左右声道根据声音数据的大小输出相应的电压波形,设备端再将波形数据化,得到数据,即可以完成数据的接收。

当设备要发送数据到手机端时,同时根据数据形成bit流,以方波或是正弦波的形式发送出去,手机进行录音,分析波形得到相应的通迅数据。

Android 应用

播放

在Android中提供了两个播放声音的API:MediaPlayer和AudioTrack。它们的区别是MediaPlayer可以播放多种格式的声音文件,例如MP3,AAC,WAV,OGG,MIDI等。MediaPlayer会在framework层创建对应的音频解码器。而AudioTrack只能播放已经解码的PCM流,如果是文件的话只支持wav格式的音频文件,因为wav格式的音频文件大部分都是PCM流。

AudioTrack不创建解码器,所以只能播放不需要解码的wav文件。当然两者之间还是有紧密的联系,MediaPlayer在framework层还是会创建AudioTrack,把解码后的PCM数流传递给AudioTrack,AudioTrack再传递给AudioFlinger进行混音,然后才传递给硬件播放,所以是MediaPlayer包含了AudioTrack。

AudioTrack有两种数据加载模式:

1、MODE_STREAM

在这种模式下,应用程序持续地write音频数据流到AudioTrack中,并且write动作将阻塞直到数据流从Java层传输到native层,同时加入到播放队列中。这种模式适用于播放大音频数据,但该模式也造成了一定的延时。

2、MODE_STATIC

在播放之前,先把所有数据一次性write到AudioTrack的内部缓冲区中。适用于播放内存占用小、延时要求较高的音频数据。

AudioTrack播放音乐实例:

AudioTrack audio = new AudioTrack(

    AudioManager.STREAM_MUSIC, // 指定流的类型

    32000, // 设置音频数据的采样率32k,如果是44.1k就是44100

    AudioFormat.CHANNEL_OUT_STEREO, // 设置输出声道为双声道立体声,而CHANNEL_OUT_MONO类型是单声道

    AudioFormat.ENCODING_PCM_16BIT, // 设置音频数据块是8位还是16位,这里设置为16位。好像现在绝大多数的音频都是16位的了

    AudioTrack.MODE_STREAM // 设置模式类型,在这里设置为流类型,另外一种MODE_STATIC貌似没有什么效果

    );

audio.play(); // 启动音频设备,下面就可以真正开始音频数据的播放了

// 打开mp3文件,读取数据,解码等操作省略 ...

byte[] buffer = new buffer[4096];

int count;

while(true)

{

   // 最关键的是将解码后的数据,从缓冲区写入到AudioTrack对象中

   audio.write(buffer, 0, 4096);

   if(文件结束)break;

}

//关闭并释放资源

audio.stop();

audio.release();

录音

在Android中提供了两个录制声音的API:MediaRecorder和AudioRecord。

区别如下:

1、AudioRecord

主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音)。

优点:语音的实时处理,可以用代码实现各种音频的封装。

缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩。

2、MediaRecorder

已经集成了录音、编码、压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp。

优点:大部分已经集成,直接调用相关接口即可,代码量小。

缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件。

AudioRecord播放音乐实例:

mBufferSizeInBytes =AudioRecord.getMinBufferSize(44100,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);

 // 构造一个AudioRecord对象,如果buffer容量过小,将导致对象构造的失败。

mAudioRecord = newAudioRecord(MediaRecorder.AudioSource.MIC,44100, AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT,mBufferSizeInBytes* 4);

record.startRecording(); // 开始录音

 

while (isRecording) {// 定义循环,根据isRecording的值来判断是否继续录制

short[] audiodata = newshort[mBufferSizeInBytes]; // 定义缓存

mReadSize = mAudioRecord.read(audiodata,0,mBufferSizeInBytes); // 从AudioRecord中读取声音数据到audiodata

if (mReadSize > 0) {

try {

mAudioQueue.put(audiodata); // 如读取到声音,将audiodata中数据入队列以便解码

} catch (InterruptedException e) {

e.printStackTrace();

}

} else {

stopThread();

}

}

 

private void closeRecord() {

if (mAudioRecord != null) {

            mAudioRecord.stop();

            mAudioRecord.release();

       }

   }

权限

要使用Android的音频API,需要在AndroidManifest文件添加以下权限:

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

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

通信流程

读卡器是以耳机接口为传输介质,利用音频的编解码传输数据到手机端。其中数据编码方式使用曼切斯特编码,同时规定手机端数据采样频率为44100HZ,使数据按照双方约定好的字符格式与帧格式进行通信。刷卡通信流程如下:

1、手机应用调用AudioTrack对象的write方法将编码后的指令写入,并调用play方法发送给刷卡器;

2、刷卡器的通讯模块拿到指令,解码后发现是刷卡通知,就等待刷卡层传来刷卡信息;

3、在刷卡槽刷卡后,卡的信息传递给刷卡器;

4、刷卡器拿到卡的信息,编码成音频信号,通过耳机的MIC引脚发送给手机;

5、手机APP通过调用AudioRecord对象的read方法将接收到的音频信号进行采样并写入缓冲区中;

6、手机APP程序通过解码,拿到实际的数据信息,即卡的信息。

 

文章参考自

http://baike.baidu.com/link?url=hUd4nt3aZQEsQfDextFD2sQINYaPhB9SEoXyDo9mr0cbD0RId773QBrnNiZl4imEi25eQ6ixCTqSy2RxUho-Pq

http://baike.baidu.com/subview/141313/141313.htm

http://www.2cto.com/kf/201410/342659.html

http://www.cnblogs.com/Amandaliu/archive/2013/02/04/2891604.html

http://blog.csdn.net/zhandoushi1982/article/details/5517020

http://baike.baidu.com/link?url=UegjOpsiC5BlXRMIr1mXqp9cD7l8wTLCmJVjn5C3urnFO9MnjNRxoYOsfa0Akimgl-m4lEVjDikJ2N6diALylK

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 3.5 音频通信是指在Android操作系统中使用音频功能进行通信。随着Android系统的发展,音频通信功能越来越丰富和全面。 在Android 3.5中,音频通信可以通过多种方式实现。其中最常见的是通过手机上的通话功能进行语音通信。用户可以使用手机上的拨号程序拨打电话,并通过手机的麦克风和扬声器进行语音收发。此功能可以通过安卓自带的电话应用或第三方电话应用实现,确保用户可以通过语音与他人进行沟通。 另外,Android 3.5还支持使用其他应用进行音频通信。例如,使用社交媒体或即时通讯应用进行语音通话。这些应用程序通常提供高质量的语音通信功能,并且支持多方通话。用户可以通过这些应用与朋友、亲人或同事进行语音交流,无论他们是在同一个城市还是在不同的国家。 此外,Android 3.5还支持通过网络进行音频通信。用户可以使用网络电话服务或VoIP(Voice over Internet Protocol)应用程序进行语音通话。这些应用利用互联网连接,不受地理位置的限制,可以实现远程通信。通过使用网络进行音频通信,用户可以通过Android设备与世界各地的人进行沟通,节省国际通话费用。 总之,Android 3.5音频通信提供了多种方式进行语音通话,包括手机通话、使用其他应用进行通话以及通过网络进行通话。这些功能使得人们可以轻松地与他人进行语音交流,并节省通话费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值