Ⅰ 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代碼問題可以到即構開發者中心看看
Ⅸ 數字音頻混合的原理
沒什麼演算法,采樣率匹配以後把兩個信號加起來輸出就行了,人的耳朵能分辨出兩種聲音的