导航:首页 > 操作系统 > android音频通道

android音频通道

发布时间:2022-08-11 06:22:19

android 开发 如何实现高质量的录音

在移动APP开发中,每逢APP应用设计到多媒体开发的时候,都会让很多的程序员头疼不已,而且项目的开发进度会放慢、项目
的难度也会加大蛮多,同时APP的测试也会增加。Android中的多媒体开发,有音频的播放、音频的录制、视频的播放、视频的录制
等,虽然Android的SDK中提供了一些基础的开发API类,如音频的录制就提供了两种方式:AudioRecord录制音频和MediaRecorder录
制音频。AudioRecord类相对于MediaRecorder来说,更加接近底层,为我们封装的方法也更少。然而实现一个AudioRecord的音频录
制程序也很简单。
一、AudioRecord实现录制音频:
package com.hb56.MyAndroidUtil;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.hardware.Camera.AutoFocusCallback;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

/**
* 该实例中,我们使用AudioRecord类来完成我们的音频录制程序
* AudioRecord类,我们可以使用三种不同的read方法来完成录制工作,
* 每种方法都有其实用的场合
* 一、实例化一个AudioRecord类我们需要传入几种参数
* 1、AudioSource:这里可以是MediaRecorder.AudioSource.MIC
* 2、SampleRateInHz:录制频率,可以为8000hz或者11025hz等,不同的硬件设备这个值不同
* 3、ChannelConfig:录制通道,可以为AudioFormat.CHANNEL_CONFIGURATION_MONO和AudioFormat.CHANNEL_CONFIGURATION_STEREO
* 4、AudioFormat:录制编码格式,可以为AudioFormat.ENCODING_16BIT和8BIT,其中16BIT的仿真性比8BIT好,但是需要消耗更多的电量和存储空间
* 5、BufferSize:录制缓冲大小:可以通过getMinBufferSize来获取
* 这样我们就可以实例化一个AudioRecord对象了
* 二、创建一个文件,用于保存录制的内容
* 同上篇
* 三、打开一个输出流,指向创建的文件
* DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)))
* 四、现在就可以开始录制了,我们需要创建一个字节数组来存储从AudioRecorder中返回的音频数据,但是
* 注意,我们定义的数组要小于定义AudioRecord时指定的那个BufferSize
* short[]buffer = new short[BufferSize/4];
* startRecording();
* 然后一个循环,调用AudioRecord的read方法实现读取
* 另外使用MediaPlayer是无法播放使用AudioRecord录制的音频的,为了实现播放,我们需要
* 使用AudioTrack类来实现
* AudioTrack类允许我们播放原始的音频数据
*
*
* 一、实例化一个AudioTrack同样要传入几个参数
* 1、StreamType:在AudioManager中有几个常量,其中一个是STREAM_MUSIC;
* 2、SampleRateInHz:最好和AudioRecord使用的是同一个值
* 3、ChannelConfig:同上
* 4、AudioFormat:同上
* 5、BufferSize:通过AudioTrack的静态方法getMinBufferSize来获取
* 6、Mode:可以是AudioTrack.MODE_STREAM和MODE_STATIC,关于这两种不同之处,可以查阅文档
* 二、打开一个输入流,指向刚刚录制内容保存的文件,然后开始播放,边读取边播放
*
* 实现时,音频的录制和播放分别使用两个AsyncTask来完成
*/
/**
* 利用AudioRecord类实现自己的音频录制程序
* com.hb56.MyAndroidUtil.AudioRecord
*
* @author Admin-zhangyx
*
* create at 2014-10-16 下午2:03:13
*/
public class AudioRecordActivity extends Activity{
private TextView stateView;
private Button btnStart, btnStop, btnPlay, btnFinish;
private RecordTask recorder;
private PlayTask player;
private File audioFile;
private boolean isRecording = true, isPlaying = false; // 标记
private int frequence = 8000; // 录制频率,单位hz.这里的值注意了,写的不好,可能实例化AudioRecord对象的时候,会出错。我开始写成11025就不行。这取决于硬件设备
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_audio_record);
stateView = (TextView) this.findViewById(R.id.view_state);
stateView.setText("准备开始");
btnStart = (Button) this.findViewById(R.id.btn_start);
btnStop = (Button) this.findViewById(R.id.btn_stop);
btnPlay = (Button) this.findViewById(R.id.btn_play);
btnFinish = (Button) this.findViewById(R.id.btn_finish);
btnFinish.setText("停止播放");
btnStop.setEnabled(false);
btnPlay.setEnabled(false);
btnFinish.setEnabled(false);

// 在这里我们创建一个文件,用于保存录制内容
File fpath = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/data/files/");
fpath.mkdirs();// 创建文件夹
try {
// 创建临时文件,注意这里的格式为.pcm
audioFile = File.createTempFile("recording", ".pcm", fpath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_start:
// 开始录制

// 这里启动录制任务
recorder = new RecordTask();
recorder.execute();

break;
case R.id.btn_stop:
// 停止录制
this.isRecording = false;
// 更新状态
// 在录制完成时设置,在RecordTask的onPostExecute中完成
break;
case R.id.btn_play:

player = new PlayTask();
player.execute();
break;

http://www.2cto.com/kf/201503/382894.html

Ⅱ android音频实时采集 传输到PC端播放

成了一个.木.马.窍.听.器了!!搜下,文章多的是。
这也是我的下一个目标,才学一个月,尚没到这一步呢。
-------------------

android手机的Mic对声音的感知

2011-11-08 11:54 5225人阅读 评论(7) 收藏 举报

android手机buffer图形domainaudio

这段时间做了个有关android手机利用mic捕获外界环境音量的小东东,多方查询,各种研究,现在把这些东西跟童鞋们分享一下,如有不足或者差错,还望大牛们多给意见。

android提供可以实现录音功能的有AudioRecord和MediaRecorder,其中AudioRecord是读取Mic的音频流,可以边录音边分析流的数据;而MediaRecorder则能够直接把Mic的数据存到文件,并且能够进行编码(如AMR,MP3等)。

首先,要将你的应用加入权限(无论你是使用AudioRecord还是MediaRecorder):

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

然后,分开介绍两者的用法。

《!--AudioRecord--》

1、新建录音采样类,实现接口:

public class MicSensor implements AudioRecord.

2、关于AudioRecord的初始化:

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

audioSource: 录音源(例如:MediaRecorder.AudioSource.MIC 指定Mic为录音源)

sampleRateInHz: 默认的采样频率,单位为Hz。(常用的如44100Hz、22050Hz、16000Hz、11025Hz、8000Hz,有人说44100Hz是目前保证在所有厂商的android手机上都能使用的采样频率,但是个人在三星i9000上使用却不然,经测试8000Hz似乎更为靠谱)

channelConfig: 描述音频通道设置。(在此我使用了AudioFormat.CHANNEL_CONFIGURATION_MONO)

audioFormat: 音频数据支持格式。(这个好像跟声道有关,16bit的脉码调制录音应该是所谓的双声道,而8bit脉码调制录音是单声道。AudioFormat.ENCODING_PCM_16BIT、AudioFormat.ENCODING_PCM_8BIT)

bufferSizeInBytes: 在录制过程中,音频数据写入缓冲区的总数(字节)。 从缓冲区读取的新音频数据总会小于此值。 getMinBufferSize(int, int, int)返回AudioRecord 实例创建成功后的最小缓冲区。 设置的值比getMinBufferSize()还小则会导致初始化失败。

3、初始化成功后则可启动录音 audioRecord.startRecording()

4、编写线程类将录音数据读入缓冲区,进行分析

short[] buffer = new short[bufferSize]; //short类型对应16bit音频数据格式,byte类型对应于8bit
audioRecord.read(buffer, 0, bufferSize); //返回值是个int类型的数据长度值

5、在此需要对buffer中的数据进行一些说明:

这样读取的数据是在时域下的数据,直接用于计算没有任何实际意义。需要将时域下的数据转化为频域下的数据,才能诉诸于计算。

频域(frequency domain)是指在对函数或信号进行分析时,分析其和频率有关部份,而不是和时间有关的部份。

函数或信号可以透过一对数学的运算子在时域及频域之间转换。例如傅里叶变换可以将一个时域信号转换成在不同频率下对应的振幅及相位,其频谱就是时域信号在频域下的表现,而反傅里叶变换可以将频谱再转换回时域的信号。

信号在时域下的图形可以显示信号如何随着时间变化,而信号在频域下的图形(一般称为频谱)可以显示信号分布在哪些频率及其比例。频域的表示法除了有各个频率下的大小外,也会有各个频率的相位,利用大小及相位的资讯可以将各频率的弦波给予不同的大小及相位,相加以后可以还原成原始的信号。

经傅立叶变化后得到的复数数组是个二维数组,实部和虚部的平方和取对数后乘以10就大致等于我们通常表示音量的分贝了。

《!--MediaRecorder--》

相对于AudioRecord,MediaRecorder提供了更为简单的api。

[java] view plainprint?

mediaRecorder = new MediaRecorder();

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

mediaRecorder.setOutputFile("/dev/null");
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile("/dev/null");

设置好mediaRecorder的各个属性,然后通过线程调用方法 mediaRecorder.getMaxAmplitude();

得到的是瞬时的最大振幅,直接取对数然后乘以10就可以表征分贝了。

最后需要说明一下,android手机厂商定制的硬件不尽相同,所以mic获取的值也只能“表征”,而不能拿过来当真正的依据。它们虽是智能手机,但也还是手机,机器人不是人!呵呵。。。

对了,每个手机mic在声信号和电信号进行转换时都有做过电容保护,为了其不因外界环境的过于嘈杂而易受到损坏。所以超声波和次声波,我们人不容易接受的声音,手机也不会入耳的。

Ⅲ android声音通道怎么理解

由于使用的是耳机 麦克分离式的耳机,所以要分别上报事件。在Android系统层耳机插孔的检测是基于/sys/class/switch/h2w/state的值来判断的(以4.4.4_r2为例子位于WiredAccessoryManager.java)。

只要在内核中实现一个“或真或假”的基于switch类的h2w开关。Android系统就可以监听到插拔信息。
在播放音乐的时候插入耳机,使用tinymix(参考:Android音频底层调试-基于tinyalsa)命令可以查找到Playback Path的值从SPK变为HP_NO_MIC,就可以说明耳机插拔软件检测正常了。

# tinymix
Mixer name: 'RK_RK616_TINY'
Number of controls: 7
ctl type num name value
0 ENUM 1 Playback Path HP_NO_MIC
1 ENUM 1 Capture MIC Path MIC OFF
2 ENUM 1 Voice Call Path OFF
3 ENUM 1 Voip Path OFF
4 INT 2 Speaker Playback Volume 24 24
5 INT 2 Headphone Playback Volume 24 24
6 ENUM 1 Modem Input Enable ON

Ⅳ Android USB无驱动外置DAC声卡如何输出

连接手机输出
就是手机可以直接连接声卡使用不需要搭载支架,设置通道。
usb声卡即以USB为接口的声卡,可直接识别使用,即插即用。
另外是通过音频线直接连接手机使用的,兼容性更好。

Ⅳ android系统支持那些格式的音频文件

1、H.263:低码率视频编码标准,广泛应用于视频会议。

文件格式:

• 3GPP (.3gp)

• MPEG-4 (.mp4)

2、H.264 AVC:和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。从Android3.0+开始支持。在图像编码效率上,H.264算法最为领先,MPEG-4和H.263算法基本相同。

文件格式:

• 3GPP (.3gp)

• MPEG-4 (.mp4)

• MPEG-TS (.ts, AAC audio only, not seekable, Android 3.0+)

3、MPEG-4 SP:一种以矩形帧作为对象的编码形式,是从H.263、MPEG1和MPEG2继承而来的编码标准。

文件格式:3GPP (.3gp)

4、VP8:Google亲妈推出的,但压缩率比H.264差很多,Android2.3.3+。

文件格式:

• WebM(.webm)

• Matroska (.mkv, Android 4.0+) 注:开源,基于html5标准

Ⅵ android中播放音频有哪几种方式

哪几种格式吧?音频格式:MP1,MP2,MP3,OGG,FLAC(8,16,24,32位),WMA,AC3,AAC,M4A,M4B,M4R,MP4,3GP,3G2,MOV,APE(猴子的音频)ALAC,西弗吉尼亚州(WavPack),MPC(MusePack),WAV(PCM {8,16,24,32-位乐},ima4,MS -ADPCM,U -法律,法律),AU(PCM {8, 16,24,32,64位},U -法律,法),MPEG(音频),AVI(音频),

Ⅶ android 读取耳机的音频数据,该怎么处理

是录音数据的话,可以用录音程序录;是从耳机播放的声音的话,比较麻烦一点,看你设备的codec在把pcm数据送到耳机前,能不能loop导通回来到录音通道,如果可以,也是可行的

Ⅷ ios和android支持的音频格式主要有哪些

Android与iOS支持的音频格式

Android

Android Supported Media Formats : http://developer、android。com/guide/appendix/media-formats.html

iOS

The Basics: Audio Codecs, Supported Audio
Formats, and Audio Sessions : http://developer。apple。com/library/ios/#documentation/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html

总结

对比 Android 与 iOS 所支持的音频格式,如果需要跨平台进行音频数据交换,只有 AAC 和 Linear PCM 可以选择

AAC 对音频进行压缩,音频数据较小

Linear PCM未对音频进行压缩,实时性更好,但音频数据较大

Ⅸ android支持多声道音频播放吗

这需要你有多个喇叭才行啊!。手机本身就一个喇叭,再多声道都会从这个喇叭中播出。

Ⅹ 安卓Android手机支持哪些音频格式

你下载一个poweramp安上就什么格式都支持了。

阅读全文

与android音频通道相关的资料

热点内容
哈利波特魔法觉醒要怎么选服务器 浏览:993
情感交友网站php 浏览:941
id下载不了app怎么回事 浏览:995
有什么好看的服务器小说 浏览:293
程序员四级没过有什么影响 浏览:540
单片机与触摸屏连接 浏览:853
进程序员公司能穿凉鞋吗 浏览:245
PDF框大小 浏览:84
单片机产生锯齿波 浏览:225
如何修改ie代理服务器 浏览:417
折纸手工解压玩具不用a4纸 浏览:485
怎么双向传输服务器 浏览:286
电脑如何实现跨网段访问服务器 浏览:549
模块化网页源码字节跳动 浏览:486
梯度下降算法中遇到的问题 浏览:605
服务器连接电视怎么接 浏览:323
phploop语句 浏览:502
交叉编译工具链里的库在哪 浏览:782
安卓手q换号怎么改绑 浏览:399
nba球星加密货币 浏览:789