Ⅰ android开发中怎样实现混音
音频混音的原理: 量化的语音信号的叠加等价于空气中声波的叠加。
下面是代码,可以参照来学习:
java">publicvoidmixAudios(File[]rawAudioFiles){
finalintfileSize=rawAudioFiles.length;
FileInputStream[]audioFileStreams=newFileInputStream[fileSize];
FileaudioFile=null;
FileInputStreaminputStream; byte[][]allAudioBytes=newbyte[fileSize][]; boolean[]streamDoneArray=newboolean[fileSize]; byte[]buffer=newbyte[512]; intoffset;
try{
for(intfileIndex=0;fileIndex<fileSize;++fileIndex){
audioFile=rawAudioFiles[fileIndex];
audioFileStreams[fileIndex]=newFileInputStream(audioFile);
} while(true){
for(intstreamIndex=0;streamIndex<fileSize;++streamIndex){
inputStream=audioFileStreams[streamIndex]; if(!streamDoneArray[streamIndex]&&(offset=inputStream.read(buffer))!=-1){
allAudioBytes[streamIndex]=Arrays.Of(buffer,buffer.length);
}else{
streamDoneArray[streamIndex]=true;
allAudioBytes[streamIndex]=newbyte[512];
}
}
byte[]mixBytes=mixRawAudioBytes(allAudioBytes);
//mixBytes就是混合后的数据
booleandone=true; for(booleanstreamEnd:streamDoneArray){ if(!streamEnd){
done=false;
}
}
if(done){ break;
}
}
}catch(IOExceptione){
e.printStackTrace(); if(mOnAudioMixListener!=null)
mOnAudioMixListener.onMixError(1);
}finally{ try{ for(FileInputStreamin:audioFileStreams){ if(in!=null)
in.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}/**
*每一行是一个音频的数据
*/byte[]averageMix(byte[][]bMulRoadAudioes){
if(bMulRoadAudioes==null||bMulRoadAudioes.length==0) returnnull; byte[]realMixAudio=bMulRoadAudioes[0];
if(bMulRoadAudioes.length==1) returnrealMixAudio;
for(intrw=0;rw<bMulRoadAudioes.length;++rw){ if(bMulRoadAudioes[rw].length!=realMixAudio.length){
Log.e("app","columnoftheroadofaudio+"+rw+"isdiffrent."); returnnull;
}
}
introw=bMulRoadAudioes.length; intcoloum=realMixAudio.length/2; short[][]sMulRoadAudioes=newshort[row][coloum]; for(intr=0;r<row;++r){ for(intc=0;c<coloum;++c){
sMulRoadAudioes[r][c]=(short)((bMulRoadAudioes[r][c*2]&0xff)|(bMulRoadAudioes[r][c*2+1]&0xff)<<8);
}
} short[]sMixAudio=newshort[coloum]; intmixVal; intsr=0; for(intsc=0;sc<coloum;++sc){
mixVal=0;
sr=0; for(;sr<row;++sr){
mixVal+=sMulRoadAudioes[sr][sc];
}
sMixAudio[sc]=(short)(mixVal/row);
} for(sr=0;sr<coloum;++sr){
realMixAudio[sr*2]=(byte)(sMixAudio[sr]&0x00FF);
realMixAudio[sr*2+1]=(byte)((sMixAudio[sr]&0xFF00)>>8);
} returnrealMixAudio;
}
Ⅱ android开发中怎样实现混音
android开发中怎样实现混音,实例代码如下:
[mw_shl_code=java,true]public class MixRunnable implements Runnable {
private MixRecorder context;
/**
* AudioRecord创建参数类
*
* @author christ
*/
private static class RecorderParameter {
// 音频获取源
private static int audioSource = MediaRecorder.AudioSource.MIC;
// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
private static final int sampleRateInHz = 44100;
// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
private static final int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
// 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
private static final int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// 缓冲区字节大小
private static int bufferSizeInBytes;
}
// 设置运行状态
private boolean isRunning = true;
// AudioRecord对象
private static AudioRecord recorder;
// 设置MediaPlayer对象
private static MediaPlayer mediaPlayer;
// 伴奏文件
private FileInputStream accompany;
// 原唱文件
private FileInputStream original;
// 得分
private int score;
private boolean isFirst = true;
/**
* 混音评分线程的构造方法
*
* @param accompany
* :伴奏文件路径
* @param original
* :原唱文件路径
* @throws FileNotFoundException
*/
public MixRunnable(MixRecorder context, String accompany, String original) throws FileNotFoundException {
this.context = context;
this.accompany = new FileInputStream(accompany);
this.original = new FileInputStream(original);
creatAudioRecord();
mediaPlayer = new MediaPlayer();
}
@Override
public void run() {
try {
// MediaPlayer准备
mediaPlayer.reset();
mediaPlayer.setDataSource("/sdcard/111.wav");
// mediaPlayer.setDataSource(accompany.getFD());
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
isRunning = false;
}
});
mediaPlayer.prepare();
// 跳过头
accompany.read(new byte[44]);
original.read(new byte[44]);
FileOutputStream fos = new FileOutputStream(new File("/sdcard/love.raw"));
// 开始读
byte[] sourceReader = new byte[RecorderParameter.bufferSizeInBytes * 2];
short[] sourceShortArray;
short[] audioReader = new short[sourceReader.length / 4];
mediaPlayer.start();
recorder.startRecording();
while (isRunning) {
int sourceReadSize = accompany.read(sourceReader, 0, sourceReader.length);
if (sourceReadSize < 0) {
isRunning = false;
continue;
}
sourceShortArray = byteToShortArray(sourceReader, sourceReadSize / 2);
recorder.read(audioReader, 0, audioReader.length);
short[] oneSecond = mixVoice(sourceShortArray, audioReader, sourceReadSize / 2);
byte[] outStream = new byte[oneSecond.length * 2];
for (int i = 0; i < oneSecond.length; i++) {
byte[] b = shortToByteArray(oneSecond<i>);
outStream[2 * i] = b[0];
outStream[2 * i + 1] = b[1];
}
Ⅲ 软件混音和硬件混音有什么不同,哪个好
硬件混音的算法是固定的,优点是硬件对音频的处理速率是很高的,音频保留最好;软件混音算法是用户调整的,缺点是实时处理差,音频保留差。如果只是简单的混音软件就行,追求高质量效果可用硬件方案
Ⅳ 将两个声音文件在指定位置进行混合叫混响还是混音
应该叫混音,那么应该如何将两段音频进行混流呢?具体如何实现,详细方法是什么?
如果此时的你正需要这个实现方法,那么本文你算是看对了,今天小编就来分享音频混流的方法,操作很简单,软件很好用,想学习的小伙伴,快来看看吧!
借助工具:闪电音频剪辑软件
操作方法:
第一步、双击打开软件,点击“添加文件”将需要处理的音频文件上传进来;
图片
第二步、然后,选中需要混音的音频片段,点击“混流”功能;
图片
第三步、在这里,我们可以对两首不的音频进行混音,也可在同一首音频中进行部分混音;
图片
第四步、这里以两首不同的音频为例。添加新的音频后,可设置音频的大小,然后点击“确定”;
图片
第五步、添加后,点击播放可预览效果;
Ⅳ thinkpad E520 要录音 实现立体声混音, 请教怎么做, 您能说的详细些吗,谢谢!
如果你是要录音的话,混音的问题是可以解决的
我的是thinkpad E520,内置的声卡和你是一样的,上官网下驱动,然后记住千万不要直接安装,右键以管理员身份运行,装好后重启,再次进入系统后打开控制面板-硬件和声音,在最下方有个SmartAudio,果断打开,SmartAudio下方有四个图标,选第二个,有个录音的选项,都选好后,打开你的录音软件,打开你的播放器,happy music.....
Ⅵ 什么是gan 音频技术
Protech(美国宝德)2016型自动混音器专门为中小场地和提供租赁服务设计。该设备围绕专利产品Dugan语音系统设计。
像一个有经验的控制台操作员一样,Dugan技术允许调高正在工作通道的增益,同时将未用通道的衰减。通过减掉未用通道的额外增益,该设备减少了回音并重新分配那些增益给工作中的通道。这比其它品牌的自动门控混音器能够在反馈前提供更多的增益电平。
可以最多连接8台2016型去组成一个更强大的系统。
Dugan操作
Dugan语音系统的精确算法如何实现出众的音频性能?
首先,这种算法为使用中的输入端提供了更多可用的增益。不像自动门控混音器那样,Dugan语音系统通过对未用输入端衰减增益,将这部分增益分配给使用中的输入端。而自动门控混音器将这部分增益留给未用输入端,因此不能实现反馈前的相同输出电平。
尝试处理相关信号过程中,门控混音器也出现了问题(见下页)。门控混音器不能识别相关和非相关信号的区别。这些在录制过程或电话会议应用中尤为显着。
第二,依靠对削减未用输入端增益并将之转移到激活输入端,室内回音得到了很好的控制。而门控混音器让未用输入端保持在较高增益水平,会产生更多的室内噪音。在使用Dugan自动混音器时,电话会议传来的信号到达本地混音总线。当传来的信号出现时,系统会降低话筒的增益,从而极大地降低声音回音。或许描述Dugan语音系统实际效果最好的方式就是拿它和混音器旁的音频专业人员实际操效果作比较。当演员或艺人走过舞台,跟随他们的动作,混音控制人员会调节不同输入端的增益控制。当演员直接站在单个话筒前时,相应通道的增益调节器被调高,而其他通道的增益调节器被调低。当演员走过舞台,离开一个话筒位置走向另一个新位置的过程中,混音控制人员会调低原位置麦克风的增益而调高新位置处相应麦克风的增益。这个过程是从一个位置相应通道增益到另一个的平滑过渡,而不是增益突然改变。Dugan语音系统就能做同样地事情,而且是自动的。
Ⅶ 求混音器原理,是直接将两路输入信号叠加在一起的吗
软件类型的混音器,是将多个音频文件、线路输入音频信号混音后,合成单独的音频文件;硬件类型的混音器,是一种将各种音频信号(4路输入,一路输出);能过机子内部电路,调节各分路音量旋扭,将所输入的音频信号混合起来输出。
Ⅷ 求解,JAVA语言多人语音聊天怎么解决混音问
两路音视频流,符合以下条件才能混合:
格式相同,要解压成 PCM 格式。
采样率相同,要转换成相同的采样率。主流采样率包括:16k Hz、32k Hz、44.1k Hz 和 48k Hz。
帧长相同,帧长由编码格式决定,PCM 没有帧长的概念,开发者自行决定帧长。为了和主流音频编码格式的帧长保持一致,推荐采用 20ms 为帧长。
位深(Bit-Depth)或采样格式 (Sample Format) 相同,承载每个采样点数据的 bit 数目要相同。
声道数相同,必须同样是单声道或者双声道 (立体声)。这样,把格式、采样率、帧长、位深和声道数对齐了以后,两个音频流就可以混合了。
JAVA代码问题可以到即构开发者中心看看
Ⅸ 数字音频混合的原理
没什么算法,采样率匹配以后把两个信号加起来输出就行了,人的耳朵能分辨出两种声音的