真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android混音,android混音增益

Mate10手機(jī)投屏?xí)r,手機(jī)視頻聲音與大屏微信語(yǔ)音信息混音

問(wèn)題現(xiàn)象:

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、雅安服務(wù)器托管、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、尼勒克網(wǎng)站維護(hù)、網(wǎng)站推廣。

手機(jī)投屏?xí)r,大屏播放視頻的同時(shí),手機(jī)播放微信或某些媒體流時(shí),聲音也會(huì)從大屏上輸出,造成混音現(xiàn)象。

問(wèn)題原因:

大屏播放視頻和手機(jī)播放媒體流,使用同一種媒體流,同一種流的輸出策略是一樣的,Android 目前無(wú)法做分流處理,同時(shí)輸出到同一個(gè)設(shè)備,則會(huì)出現(xiàn)混音。

解決方案:

為了更好的視聽(tīng)體驗(yàn),建議您暫時(shí)關(guān)閉其中一個(gè)正在播放音頻的應(yīng)用。

android 播放音樂(lè)時(shí)為什么用不到混音線程mixerthread

MixerThread是按照音頻輸出的核心部分,所有Android的音頻都需要經(jīng)過(guò)MixerThread進(jìn)行混音后再輸出到音頻設(shè)備。 MixerThread的繼承關(guān)系如下: MixerThread---PlaybackThread---ThreadBase---Thread 在PlaybackThread中,重寫(xiě)了Thread的threadLandroid 播放音樂(lè)時(shí)為什么用不到混音線程mixerthread

Android AudioTrack詳解

我們知道播放聲音能夠用MediaPlayer和AudioTrack,MediaPlayer會(huì)在framework層創(chuàng)建相應(yīng)的音頻解碼器。而AudioTrack僅僅能播放已經(jīng)解碼的PCM流,MediaPlayer在framework層還是會(huì)創(chuàng)建AudioTrack,把解碼后的PCM數(shù)流傳遞給AudioTrack。AudioTrack再傳遞給AudioFlinger進(jìn)行混音,然后才傳遞給硬件播放,所以是MediaPlayer包括了AudioTrack

每個(gè)音頻流相應(yīng)著一個(gè)AudioTrack類的一個(gè)實(shí)例,每個(gè)AudioTrack會(huì)在創(chuàng)建時(shí)注冊(cè)到 AudioFlinger中。由AudioFlinger把全部的AudioTrack進(jìn)行混合(Mixer)。然后輸送到AudioHardware中進(jìn)行播放。眼下Android同一時(shí)候最多能夠創(chuàng)建32個(gè)音頻流,也就是說(shuō)。Mixer最多會(huì)同一時(shí)候處理32個(gè)AudioTrack的數(shù)據(jù)流。

在4000到48000之間

AudioTrack有兩種數(shù)據(jù)載入模式:

1.MODE_STREAM

在這樣的模式下,應(yīng)用程序持續(xù)地write音頻數(shù)據(jù)流到AudioTrack中,而且write動(dòng)作將堵塞直到數(shù)據(jù)流從Java層傳輸?shù)絥ative層,同一時(shí)候增加到播放隊(duì)列中。這樣的模式適用于播放大音頻數(shù)據(jù),但該模式也造成了一定的延時(shí);

2.MODE_STATIC

在播放之前,先把全部數(shù)據(jù)一次性write到AudioTrack的內(nèi)部緩沖區(qū)中。適用于播放內(nèi)存占用小、延時(shí)要求較高的音頻數(shù)據(jù)。

Android音視頻【十二】使用OpenSLES和AudioTrack進(jìn)行播放PCM

本節(jié)我們學(xué)習(xí)下如何播放pcm數(shù)據(jù),在Android中有兩種方法:一種是使用java層的 AudioTrack 方法,一種是使用底層的 OpenSLES 直接在 jni 層調(diào)用系統(tǒng)的 OpenSLES的c方法 實(shí)現(xiàn)。

兩種使用場(chǎng)景不一樣:

AudioTrack 一般用于 比如本地播放一個(gè)pcm文件/流,又或者播放解碼后的音頻的pcm流,API較簡(jiǎn)單。

OpenSLES 一般用于一些播放器中開(kāi)發(fā)中,比如音頻/視頻播放器,聲音/音頻的播放采用的OpenSLES,一是播放器一般是c/c++實(shí)現(xiàn),便于直接在c層調(diào)用OpenSLES的API,二也是如果用AudioTrack進(jìn)行播放,務(wù)必會(huì)帶來(lái)java和jni層的反射調(diào)用的開(kāi)銷(xiāo),API較復(fù)雜。

可以根據(jù)業(yè)務(wù)自行決定來(lái)進(jìn)行選擇。

AudioTrack的方式使用較簡(jiǎn)單,直接在java層。

指定采樣率,采樣位數(shù),聲道數(shù)進(jìn)行創(chuàng)建。

其中44100是采樣率, AudioFormat.CHANNEL_OUT_STEREO 為雙聲道,還有 CHANNEL_OUT_MONO 單聲道。 AudioFormat.ENCODING_PCM_16BIT 為采樣位數(shù)16位,還有 ENCODING_PCM_8BIT 8位。 minBufferSize 是播放器緩沖的大小,也是根據(jù)采樣率和采樣位數(shù),聲道數(shù) 進(jìn)行獲取,只有滿足最小的buffer才去操作底層進(jìn)程播放。

最后一個(gè)參數(shù)mode??梢灾付ǖ闹涤?AudioTrack.MODE_STREAM 和 AudioTrack.MODE_STATIC 。

MODE_STREAM 適用于大多數(shù)的場(chǎng)景,比如動(dòng)態(tài)的處理audio buffer,或者播放很長(zhǎng)的音頻文件,它是將audio buffers從java層傳遞到native層。音頻播放時(shí)音頻數(shù)據(jù)從Java流式傳輸?shù)絥ative層的創(chuàng)建模式。

MODE_STATIC 適用場(chǎng)景,比如播放很短的音頻,它是一次性將全部的音頻資源從java傳遞到native層。音頻數(shù)據(jù)在音頻開(kāi)始播放前僅從Java傳輸?shù)絥ative層的創(chuàng)建模式。

是的,就這么一個(gè)方法。注意此方法是同步方法,是個(gè)耗時(shí)方法,一般是開(kāi)啟一個(gè)線程循環(huán)調(diào)用 write 方法進(jìn)行寫(xiě)入。

注意在調(diào)用 write 方法前需要調(diào)用 audioTrack.play() 方法開(kāi)始播放。

因?yàn)槭莗cm裸數(shù)據(jù),無(wú)法像mediaplayer一樣提供了API。所以需要自己處理下??梢岳?getPlaybackHeadPosition 方法。

getPlaybackHeadPosition() 的意思是返回以幀為單位表示的播放頭位置

getPlaybackRate() 的意思是返回以Hz為單位返回當(dāng)前播放采樣率。

所以當(dāng)前播放時(shí)間可以通過(guò)如下方式獲取

OpenSLES:(Open Sound Library for Embedded Systems).

OpenSLES是跨平臺(tái)是針對(duì)嵌入式系統(tǒng)精心優(yōu)化的硬件音頻加速API。使用OpenSLES進(jìn)行音頻播放的好處是可以不依賴第三方。比如一些音頻或者視頻播放器中都是用OpenSLES進(jìn)行播放解碼后的pcm的,這樣免去了和java層的交互。

在Android中使用OpenSLES首先需要把Android 系統(tǒng)提供的so鏈接到外面自己的so。在CMakeLists.txt腳本中添加鏈接庫(kù)OpenSLES。庫(kù)的名字可以在 類似如下目錄中

需要去掉lib

然后導(dǎo)入頭文件即可使用了OpenSLES提供的底層方法了。

創(chuàng)建使用的步驟大致分為:

一個(gè) SLObjectItf 里面可能包含了多個(gè)Interface,獲取Interface通過(guò) GetInterface 方法,而 GetInterface 方法的地2個(gè)參數(shù) SLInterfaceID 參數(shù)來(lái)指定到的需要獲取Object里面的那個(gè)Interface。比如通過(guò)指定 SL_IID_ENGINE 的類型來(lái)獲取 SLEngineItf 。我們可以通過(guò) SLEngineItf 去創(chuàng)建各種Object,例如播放器、錄音器、混音器的Object,然后在用這些Object去獲取各種Interface去實(shí)現(xiàn)各種功能。

如上所說(shuō),SLEngineItf可以創(chuàng)建混音器的Object。

在創(chuàng)建播放器前需要?jiǎng)?chuàng)建音頻的配置信息(比如采樣率,聲道數(shù),每個(gè)采樣的位數(shù)等)

開(kāi)始播放后會(huì)不斷的回調(diào)這個(gè) pcmBufferCallBack 函數(shù)將音頻數(shù)據(jù)壓入隊(duì)列

(*pcmBufferQueue)-RegisterCallback(pcmBufferQueue, pcmBufferCallBack, this);

如果想要暫停播放參數(shù)直接設(shè)置為SL_PLAYSTATE_PAUSED,若暫停后繼續(xù)播放設(shè)置參數(shù)為SL_PLAYSTATE_PLAYING即可。若想要停止播放參數(shù)設(shè)置為SL_PLAYSTATE_STOPPED即可。

首先獲取播放器的用于控制音量的接口SLVolumeItf pcmVolumePlay

然后動(dòng)態(tài)設(shè)置

首先也是獲取播放器的用于控制音量的接口SLMuteSoloItf pcmMutePlay

然后動(dòng)態(tài)設(shè)置

看起來(lái)控制還是蠻簡(jiǎn)單的哈。先熟悉這么多,OpenSLES還是蠻強(qiáng)大的。

android開(kāi)發(fā)中怎樣實(shí)現(xiàn)混音

音頻混音的原理: 量化的語(yǔ)音信號(hào)的疊加等價(jià)于空氣中聲波的疊加。

下面是代碼,可以參照來(lái)學(xué)習(xí):

public?void?mixAudios(File[]?rawAudioFiles){

final?int?fileSize?=?rawAudioFiles.length;

FileInputStream[]?audioFileStreams?=?new?FileInputStream[fileSize];

File?audioFile?=?null;

FileInputStream?inputStream; byte[][]?allAudioBytes?=?new?byte[fileSize][]; boolean[]?streamDoneArray?=?new?boolean[fileSize]; byte[]?buffer?=?new?byte[512]; int?offset;

try?{

for?(int?fileIndex?=?0;?fileIndex??fileSize;?++fileIndex)?{

audioFile?=?rawAudioFiles[fileIndex];

audioFileStreams[fileIndex]?=?new?FileInputStream(audioFile);

} while(true){

for(int?streamIndex?=?0?;?streamIndex??fileSize?;?++streamIndex){

inputStream?=?audioFileStreams[streamIndex]; if(!streamDoneArray[streamIndex]??(offset?=?inputStream.read(buffer))?!=?-1){

allAudioBytes[streamIndex]?=?Arrays.copyOf(buffer,buffer.length);

}else{

streamDoneArray[streamIndex]?=?true;

allAudioBytes[streamIndex]?=?new?byte[512];

}

}

byte[]?mixBytes?=?mixRawAudioBytes(allAudioBytes);

//mixBytes?就是混合后的數(shù)據(jù)

boolean?done?=?true; for(boolean?streamEnd?:?streamDoneArray){ if(!streamEnd){

done?=?false;

}

}

if(done){ break;

}

}

}?catch?(IOException?e)?{

e.printStackTrace(); if(mOnAudioMixListener?!=?null)

mOnAudioMixListener.onMixError(1);

}finally{ try?{ for(FileInputStream?in?:?audioFileStreams){ if(in?!=?null)

in.close();

}

}?catch?(IOException?e)?{

e.printStackTrace();

}

}

}/**

*?每一行是一個(gè)音頻的數(shù)據(jù)

*/byte[]?averageMix(byte[][]?bMulRoadAudioes)?{

if?(bMulRoadAudioes?==?null?||?bMulRoadAudioes.length?==?0) return?null; byte[]?realMixAudio?=?bMulRoadAudioes[0];

if(bMulRoadAudioes.length?==?1) return?realMixAudio;

for(int?rw?=?0?;?rw??bMulRoadAudioes.length?;?++rw){ if(bMulRoadAudioes[rw].length?!=?realMixAudio.length){

Log.e("app",?"column?of?the?road?of?audio?+?"?+?rw?+"?is?diffrent."); return?null;

}

}

int?row?=?bMulRoadAudioes.length; int?coloum?=?realMixAudio.length?/?2; short[][]?sMulRoadAudioes?=?new?short[row][coloum]; for?(int?r?=?0;?r??row;?++r)?{ for?(int?c?=?0;?c??coloum;?++c)?{

sMulRoadAudioes[r][c]?=?(short)?((bMulRoadAudioes[r][c?*?2]??0xff)?|?(bMulRoadAudioes[r][c?*?2?+?1]??0xff)??8);

}

} short[]?sMixAudio?=?new?short[coloum]; int?mixVal; int?sr?=?0; for?(int?sc?=?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);

} return?realMixAudio;

}


分享文章:android混音,android混音增益
網(wǎng)站網(wǎng)址:http://weahome.cn/article/dseiiej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部