自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android平臺(tái)上音頻錄制與播放的關(guān)鍵類及其功能,助你選擇合適方式進(jìn)行音頻處理任務(wù)

移動(dòng)開發(fā) Android
MediaPlayer主要用于后臺(tái)長(zhǎng)時(shí)間播放本地音樂(lè)文件或在線流媒體文件。提供了一個(gè)高層次的封裝,使播放音頻變得相對(duì)簡(jiǎn)單。MediaPlayer特別適合那些需要連續(xù)播放較長(zhǎng)時(shí)間音頻的應(yīng)用場(chǎng)景,例如音樂(lè)播放器或視頻播放器。

安卓平臺(tái)和聲音錄制與播放相關(guān)的主要是4個(gè)類:MediaRecorder,MediaPlayer,SoundPool,AudioRecord和AudioTrack。

  1. 「MediaRecorder」 可以錄制視頻和音頻到文件
  2. 「MediaPlayer」 可以播放視頻和音頻文件
  3. 「SoundPool」 用于播放比較短的音頻片段
  4. 「AudioRecord」 可以提供接口讀取音頻流數(shù)據(jù)(byte數(shù)組或者short數(shù)組)
  5. 「AudioTrack」 提供接口用于播放音頻流數(shù)據(jù)。

其中MediaRecorder和AudioRecord用于聲音錄制,SoundPool、MediaPlayer和AudioTrack用于聲音播放。AudioRecord和AudioTrack用于操作音頻流數(shù)據(jù),操作對(duì)象是byte數(shù)組(或者short數(shù)組),而MediaRecorder和MediaPlayer提供了經(jīng)過(guò)更高層抽象和封裝接口,直接對(duì)文件進(jìn)行操作,而且它倆功能更豐富,同時(shí)支持音頻和視頻。

MediaRecorder

MediaRecorder是Android提供的一個(gè)用于音視頻錄制的高級(jí)類。封裝了底層的音視頻編碼器(通常是MediaCodec)和其他相關(guān)組件。如果不需要對(duì)音視頻進(jìn)行更底層的控制,只是想要方便地進(jìn)行錄制操作,那么可以選擇使用MediaRecorder。

圖片圖片

MediaRecorder提供了一系列的方法用于配置和控制錄制過(guò)程,例如設(shè)置音頻和視頻源、設(shè)置輸出格式和編碼、開始和停止錄制等。還提供了錯(cuò)誤監(jiān)聽器和信息監(jiān)聽器,以便在錄制過(guò)程中處理錯(cuò)誤事件和獲取錄制信息。

在配置MediaRecorder時(shí),需要先創(chuàng)建一個(gè)MediaRecorder實(shí)例,設(shè)置音頻和視頻源,以及輸出文件的格式和編碼。例如,可以使用setAudioSource()方法設(shè)置音頻來(lái)源,使用setVideoSource()方法設(shè)置視頻來(lái)源,使用setOutputFormat()和setVideoEncoder()等方法設(shè)置輸出格式和視頻編碼。

完成配置后,調(diào)用MediaRecorder的prepare()方法準(zhǔn)備錄制,調(diào)用start()方法開始錄制。當(dāng)錄制完成后調(diào)用stop()方法停止錄制,最后調(diào)用release()方法釋放錄制資源。

MediaRecorder主要方法:

setAudioChannels(int numChannels) //設(shè)置錄制的音頻通道數(shù)
setAudioEncoder(int audio_encoder) //設(shè)置audio的編碼格式
setAudioEncodingBitRate(int bitRate) //設(shè)置錄制的音頻編碼比特率
setAudioSamplingRate(int samplingRate) //設(shè)置錄制的音頻采樣率
setAudioSource(int audio_source) //設(shè)置用于錄制的音源
setAuxiliaryOutputFile(String path) //輔助時(shí)間的推移視頻文件的路徑傳遞
setAuxiliaryOutputFile(FileDescriptor fd)//在文件描述符傳遞的輔助時(shí)間的推移視頻
setCamera(Camera c) //設(shè)置一個(gè)recording的攝像頭
setCaptureRate(double fps) //設(shè)置視頻幀的捕獲率
setMaxDuration(int max_duration_ms) //設(shè)置記錄會(huì)話的最大持續(xù)時(shí)間(毫秒)
setMaxFileSize(long max_filesize_bytes) //設(shè)置記錄會(huì)話的最大大?。ㄒ宰止?jié)為單位)
setOutputFile(FileDescriptor fd) //傳遞要寫入的文件的文件描述符
setOutputFile(String path) //設(shè)置輸出文件的路徑
setOutputFormat(int output_format) //設(shè)置在錄制過(guò)程中產(chǎn)生的輸出文件的格式
setPreviewDisplay(Surface sv) //表面設(shè)置顯示記錄媒體(視頻)的預(yù)覽
setVideoEncoder(int video_encoder) //設(shè)置視頻編碼器,用于錄制
setVideoEncodingBitRate(int bitRate) //設(shè)置錄制的視頻編碼比特率
setVideoFrameRate(int rate) //設(shè)置要捕獲的視頻幀速率
setVideoSize(int width, int height) //設(shè)置要捕獲的視頻的寬度和高度
setVideoSource(int video_source) //開始捕捉和編碼數(shù)據(jù)到setOutputFile(指定的文件)
setLocation(float latitude, float longitude) //設(shè)置并存儲(chǔ)在輸出文件中的地理數(shù)據(jù)(經(jīng)度和緯度)
setProfile(CamcorderProfile profile) //指定CamcorderProfile對(duì)象
setOrientationHint(int degrees) //設(shè)置輸出的視頻播放的方向提示
setOnErrorListener(MediaRecorder.OnErrorListener l) //注冊(cè)一個(gè)用于記錄錄制時(shí)出現(xiàn)的錯(cuò)誤的監(jiān)聽器
setOnInfoListener(MediaRecorder.OnInfoListener listener) //注冊(cè)一個(gè)用于記錄錄制時(shí)出現(xiàn)的信息事件
getMaxAmplitude() //獲取在前一次調(diào)用此方法之后錄音中出現(xiàn)的最大振幅
prepare() //準(zhǔn)備錄制。
release() //釋放資源
reset() //將MediaRecorder設(shè)為空閑狀態(tài)
start() //開始錄制
stop() //停止錄制

MediaRecorder主要配置參數(shù):

  1. 「視頻編碼格式」MediaRecorder.VideoEncoder
default,H263,H264,MPEG_4_SP,VP8
  1. 「音頻編碼格式」MediaRecorder.AudioEncoder
default,AAC,HE_AAC,AAC_ELD,AMR_NB,AMR_WB,VORBIS
  1. 「視頻資源獲取方式」MediaRecorder.VideoSource
default,CAMERA,SURFACE
  1. 「音頻資源獲取方式」MediaRecorder.AudioSource
defalut,camcorder,mic,voice_call,voice_communication,voice_downlink,voice_recognition, voice_uplink
  1. 「資源輸出格式」MediaRecorder.OutputFormat
amr_nb,amr_wb,default,mpeg_4,raw_amr,three_gpp,aac_adif, aac_adts, output_format_rtp_avp, output_format_mpeg2ts ,webm

MediaPlayer

MediaPlayer是Android平臺(tái)上的一個(gè)多媒體框架,支持播放各種常見(jiàn)的媒體類型,如音頻、視頻和圖片,能夠輕松地將這些媒體內(nèi)容集成到應(yīng)用中。

圖片圖片

MediaPlayer提供了豐富的API和功能能夠靈活地控制媒體的播放。通過(guò)MediaPlayer的API可以播放存儲(chǔ)在應(yīng)用資源中的媒體文件、文件系統(tǒng)中的獨(dú)立文件,或者通過(guò)網(wǎng)絡(luò)連接接收到的數(shù)據(jù)流中的音頻或視頻。

在使用MediaPlayer時(shí),需要?jiǎng)?chuàng)建一個(gè)MediaPlayer實(shí)例,通過(guò)調(diào)用setDataSource()方法來(lái)指定要播放的媒體文件或流的來(lái)源。調(diào)用prepare()或prepareAsync()方法使MediaPlayer對(duì)象進(jìn)入Prepared狀態(tài),準(zhǔn)備播放媒體內(nèi)容。在媒體準(zhǔn)備好之后調(diào)用start()方法來(lái)開始播放。

MediaPlayer還提供了各種控制選項(xiàng),如暫停、恢復(fù)、停止播放,以及調(diào)整音量和播放速度等??梢允褂肕ediaPlayer來(lái)監(jiān)聽媒體播放過(guò)程中的事件,如播放完成、播放錯(cuò)誤等,以便進(jìn)行相應(yīng)的處理。

MediaPlayer主要方法:

  1. 「實(shí)例化方式」
MediaPlayer mp = new MediaPlayer();
//或
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);
  1. 「設(shè)置播放源」
setDataSource(String path)//指定裝載path路徑所代表的文件。
setDataSource(Context context, Uri uri, Map<String, String headers)//指定裝載uri所代表的文件。
setDataSource(Context context, Uri uri)//指定裝載uri所代表的文件。
setDataSource(FileDescriptor fd, long offset, long length)//指定裝載fd所代表的文件中從offset開始長(zhǎng)度為length的文件內(nèi)容。
setDataSource(FileDescriptor fd)//指定裝載fd所代表的文件。
  1. 「配置播放參數(shù)」
setAudioStreamType(int streamtype)//設(shè)置音頻流的類型。
setDisplay(SurfaceHolder sh)//設(shè)置顯示方式。
setLooping(boolean looping)//設(shè)置是否循環(huán)播放。
setNextMediaPlayer(MediaPlayer next)//設(shè)置當(dāng)前流媒體播放完畢,下一個(gè)播放的MediaPlayer。
setScreenOnWhilePlaying(boolean screenOn)//設(shè)置是否使用SurfaceHolder來(lái)顯示。
setSurface(Surface surface)//設(shè)置Surface。
setVideoScalingMode(int mode)//設(shè)置視頻縮放的模式。
setVolume(float leftVolume, float rightVolume)//設(shè)置播放器的音量。
setWakeMode(Context context, int mode)//為MediaPlayer設(shè)置低級(jí)電源管理行為。
  1. 「播放控制函數(shù)」
start()//開始或恢復(fù)播放。
stop()//停止播放。
pause()//暫停播放。
prepare()//準(zhǔn)備播放(裝載音頻),調(diào)用此方法會(huì)使MediaPlayer進(jìn)入Prepared狀態(tài)。
prepareAsync()//準(zhǔn)備播放異步音頻。
release()//釋放媒體資源
reset()//重置MediaPlayer進(jìn)入未初始化狀態(tài)。
seekTo(int msec)//指定的時(shí)間位置。
  1. 「監(jiān)聽事件函數(shù)」
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)//注冊(cè)一個(gè)回調(diào)函數(shù),在網(wǎng)絡(luò)視頻流緩沖變化時(shí)調(diào)用。
setOnCompletionListener(MediaPlayer.OnCompletionListener listener)//為Media Player的播放完成事件綁定事件監(jiān)聽器。
setOnErrorListener(MediaPlayer.OnErrorListener listener)//為MediaPlayer的播放錯(cuò)誤事件綁定事件監(jiān)聽器。
setOnPreparedListener(MediaPlayer.OnPreparedListener listener)//當(dāng)MediaPlayer調(diào)用prepare()方法時(shí)觸發(fā)該監(jiān)聽器。
setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener)//當(dāng)MediaPlayer調(diào)用seek()方法時(shí)觸發(fā)該監(jiān)聽器。
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)//注冊(cè)一個(gè)用于監(jiān)聽視頻大小改變的監(jiān)聽器。
  1. 「獲取參數(shù)函數(shù)」
getCurrentPosition()//獲取當(dāng)前播放的位置。
getDuration()//獲取音頻的時(shí)長(zhǎng)。
getVideoHeight()//獲取視頻的高度。
getVideoWidth()//獲取視頻的寬度。
isLooping()//判斷MediaPlayer是否正在循環(huán)播放。
isPlaying()//判斷MediaPlayer是否正在播放。

SoundPool

SoundPool是Android提供的一個(gè)音頻播放工具類,主要用于播放較短的音頻文件,例如音效、提示音等。

SoundPool特點(diǎn):

  1. 「低延遲」:SoundPool使用較低的延遲來(lái)播放音頻,特別適合實(shí)時(shí)性要求較高的場(chǎng)景。
  2. 「資源管理」:SoundPool能夠管理多個(gè)音頻資源,并且可以預(yù)加載音頻文件,從而提高播放的響應(yīng)速度。
  3. 「多次播放」:SoundPool支持多次播放同一個(gè)音頻文件,能夠?qū)崿F(xiàn)連續(xù)播放、循環(huán)播放等效果。
  4. 「多聲道支持」:SoundPool支持多聲道播放,可以同時(shí)播放多個(gè)音頻文件。

使用SoundPool的基本流程:創(chuàng)建一個(gè)SoundPool對(duì)象->載入要播放的音頻->播放某個(gè)音頻->在需要時(shí)停止播放某個(gè)音頻。每個(gè)載入的音頻在SoundPool中都會(huì)對(duì)應(yīng)一個(gè)SoundID,播放時(shí)通過(guò)SoundID來(lái)指定要播放的音頻。

SoundPool的應(yīng)用場(chǎng)景廣泛,包括游戲開發(fā)、多媒體應(yīng)用、音頻提示等。在游戲開發(fā)中,可以使用SoundPool來(lái)播放游戲音效、背景音樂(lè)等;在多媒體應(yīng)用中,可以使用SoundPool來(lái)播放短音頻片段,如按鈕點(diǎn)擊音效、提示音等;在音頻提示方面,可以使用SoundPool來(lái)實(shí)現(xiàn)鬧鐘、提醒等功能。

SoundPool加載的音頻資源是加載進(jìn)內(nèi)存,所以要求盡可能的短。每個(gè)音頻資源的大小被限制在1M左右(相當(dāng)于時(shí)長(zhǎng)5.6s、采樣率在44.1kHz的雙聲道音頻資源)。如果超過(guò)這個(gè)限制大小,音頻會(huì)被裁剪。

SoundPool主要方法:

  1. 「實(shí)例化方式」
//參數(shù):
//maxStreams:指定支持多少個(gè)聲音,SoundPool對(duì)象中允許同時(shí)存在的最大流的數(shù)量,該值太大就會(huì)報(bào)錯(cuò)AudioFlinger could not create track, status: -12 ,就聽不到聲音
//streamType:指定聲音類型,流類型可以分為STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC 和STREAM_ALARM四種類型。在AudioManager中定義。
//srcQuality:指定聲音品質(zhì)(采樣率變換質(zhì)量),一般直接設(shè)置為0

SoundPool(int maxStreams, int streamType, int srcQuality)

在低版本中使用上述構(gòu)造方法,API 21(Android 5.0)后這個(gè)構(gòu)造方法過(guò)時(shí)了,使用SoundPool.Builder實(shí)例化SoundPool:

SoundPool.Builder spb = new SoundPool.Builder();
spb.setMaxStreams(10);
spb.setAudioAttributes(null);    //轉(zhuǎn)換音頻格式
SoundPool sp = spb.build();      //創(chuàng)建SoundPool對(duì)象
  1. 「加載音頻資源文件」
load(Context context, int resId, int priority) //從res資源載入
load(String path, int priority) //文件路徑,文件的絕對(duì)路線,如存放在sd卡中的音頻 priority:沒(méi)什么用的一個(gè)參數(shù),建議設(shè)置為1,保持和未來(lái)的兼容性
load(FileDescriptor fd, long offset, long length, int priority) //文件描述符
load(AssetFileDescriptor afd, int priority) //從asset目錄讀取某個(gè)資源文件,context.getAssets().openFd("xxx"),xxx表示文件名

上述方法都會(huì)返回一個(gè)Integer類型的音頻ID,后續(xù)使用該ID進(jìn)行播放。

  1. 「播放音頻文件」
//soundID:Load()返回的聲音ID號(hào),以上可以通過(guò)map.get(1)獲取
//leftVolume:左聲道音量設(shè)置  一般為0-1,默認(rèn)填1
//rightVolume:右聲道音量設(shè)置 一般為0-1,默認(rèn)填1
//priority:指定播放聲音的優(yōu)先級(jí),數(shù)值越高,優(yōu)先級(jí)越大。默認(rèn)填0
//loop:指定是否循環(huán):-1表示無(wú)限循環(huán),0表示不循環(huán),其他值表示要重復(fù)播放的次數(shù)
//rate:指定播放速率:1.0的播放率可以使聲音按照其原始頻率,而2.0的播放速率,可以使聲音按照其 原始頻率的兩倍播放。如果為0.5的播放率,則播放速率是原始頻率的一半。播放速率的取值范圍是0.5至2.0。

play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate); //其返回值為一個(gè)int類型的數(shù)字

如果SoundPool剛調(diào)用加載load方法之后,直接調(diào)用SoundPool的play方法可能出現(xiàn)error "sample 1 not READY",建議調(diào)用加載資源函數(shù)load之后,實(shí)現(xiàn)資源加載結(jié)束的監(jiān)聽函數(shù),在監(jiān)聽到資源加載結(jié)束之后,再進(jìn)行播放音頻文件。

soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
    @Override
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
        soundPool.play(1, 1, 1, 0, 0, 1);
    }
});
  1. 卸載音頻或者停止播放重置資源
//streamID:通過(guò)play()返回
soundPool.pause(int streamID)  //暫停指定播放流的音效

//streamID:通過(guò)play()返回
soundPool.resume(int streamID)  //繼續(xù)播放指定播放流的音效

//streamID:通過(guò)play()返回
soundPool.stop(int streamID) //終止指定播放流的音效

//soundID:load()返回的音頻ID
soundPool.unload(int soundID) //卸載一個(gè)指定的音頻資源.

soundPool.release() //釋放SoundPool中的所有音頻資源.

AudioRecord

AudioRecord為Android應(yīng)用提供了一個(gè)強(qiáng)大而靈活的音頻錄制工具。AudioRecord都能提供高質(zhì)量的音頻數(shù)據(jù),可用于語(yǔ)音識(shí)別、電話錄音和其他音頻處理任務(wù)。

  1. 「音頻源」:AudioRecord支持從多種音頻源中錄制音頻數(shù)據(jù),例如麥克風(fēng)、電話線路、語(yǔ)音識(shí)別等。
  2. 「音頻格式」:AudioRecord允許選擇不同的音頻格式來(lái)錄制音頻數(shù)據(jù),如PCM(脈沖編碼調(diào)制)、AAC(高級(jí)音頻編碼)等。這些格式的選擇可以根據(jù)應(yīng)用場(chǎng)景和編碼需求進(jìn)行。
  3. 「緩沖區(qū)」:AudioRecord使用一個(gè)緩沖區(qū)來(lái)存儲(chǔ)錄制的音頻數(shù)據(jù)。可以指定緩沖區(qū)的大小,以適應(yīng)不同的錄制需求。
  4. 「配置參數(shù)」:通過(guò)AudioRecord的API接口可以設(shè)置錄制設(shè)備的參數(shù),包括采樣率、聲道數(shù)、音頻格式等。
  5. 「工作流程」:使用AudioRecord進(jìn)行音頻錄制的工作流程包括配置參數(shù)、初始化內(nèi)部音頻緩沖區(qū)、開始采集音頻數(shù)據(jù)、通過(guò)線程不斷從緩沖區(qū)讀取數(shù)據(jù),并在需要時(shí)停止采集和釋放資源。
  6. 「性能與特點(diǎn)」:由于AudioRecord直接與Android的音頻硬件交互,在性能上具有顯著優(yōu)勢(shì)。AudioRecord還具備線程安全、低延遲錄制、多格式支持、實(shí)時(shí)處理、可擴(kuò)展性強(qiáng)等特點(diǎn),使得它在各種音頻錄制場(chǎng)景中都能表現(xiàn)出色。

AudioRecord的工作流程:

(1) 配置參數(shù),初始化內(nèi)部的音頻緩沖區(qū)
(2) 開始采集
(3) 需要一個(gè)線程,不斷地從 AudioRecord 的緩沖區(qū)將音頻數(shù)據(jù)“讀”出來(lái),注意,這個(gè)過(guò)程一定要及時(shí),否則就會(huì)出現(xiàn)“overrun”的錯(cuò)誤,該錯(cuò)誤在音頻開發(fā)中比較常見(jiàn),意味著應(yīng)用層沒(méi)有及時(shí)地“取走”音頻數(shù)據(jù),導(dǎo)致內(nèi)部的音頻緩沖區(qū)溢出。
(4) 停止采集,釋放資源

AudioRecord的參數(shù)配置:

  • 「audioSource」 參數(shù)指的是音頻采集的輸入源,可選的值以常量的形式定義在 MediaRecorder.AudioSource 類中,常用的值包括:DEFAULT(默認(rèn)),VOICE_RECOGNITION(用于語(yǔ)音識(shí)別,等同于DEFAULT),MIC(由手機(jī)麥克風(fēng)輸入),VOICE_COMMUNICATION(用于VoIP應(yīng)用)等等。
  • 「sampleRateInHz」 采樣率,注意,目前44100Hz是唯一可以保證兼容所有Android手機(jī)的采樣率。
  • 「channelConfig」 通道數(shù)的配置,可選的值以常量的形式定義在 AudioFormat 類中,常用的是 CHANNEL_IN_MONO(單通道),CHANNEL_IN_STEREO(雙通道)。
  • 「audioFormat」 這個(gè)參數(shù)是用來(lái)配置“數(shù)據(jù)位寬”的,可選的值也是以常量的形式定義在 AudioFormat 類中,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),注意,前者是可以保證兼容所有Android手機(jī)的。

AudioTrack

AudioTrack是Android平臺(tái)下用于管理和播放單一音頻資源的類,特別適合低延遲的播放和流媒體的播放,提供了強(qiáng)大的控制能力。

  1. 「音頻播放」:AudioTrack主要用于播放已經(jīng)解碼的PCM流。通過(guò)配置AudioTrack實(shí)例,調(diào)用其play方法,將AudioTrack切換到播放狀態(tài),并啟動(dòng)播放線程循環(huán)向AudioTrack的緩沖區(qū)寫入數(shù)據(jù),可以實(shí)現(xiàn)音頻的播放。
  2. 「數(shù)據(jù)加載模式」:AudioTrack提供了兩種數(shù)據(jù)加載模式:MODE_STREAM和MODE_STATIC。MODE_STREAM模式下,音頻數(shù)據(jù)通過(guò)write操作一次次寫入AudioTrack中,在一定程度上會(huì)引入延時(shí)。而MODE_STATIC模式下,所有數(shù)據(jù)在play之前一次性寫入AudioTrack的內(nèi)部緩沖區(qū),后續(xù)無(wú)需再傳遞數(shù)據(jù),需注意一次性寫入的數(shù)據(jù)量不能過(guò)多,以免系統(tǒng)無(wú)法分配足夠內(nèi)存。
  3. 「音頻流類型」:在配置AudioTrack時(shí),需要指定音頻流類型,如系統(tǒng)聲音的音頻流、音樂(lè)播放的音頻流、用于通話的音頻流、用于通知的音頻流等。有助于系統(tǒng)正確管理音頻資源。
  4. 「實(shí)時(shí)處理」:AudioTrack可用于播放本地保存的音頻文件,還適用于實(shí)時(shí)音頻處理和播放。例如,可以實(shí)現(xiàn)音頻錄制和回放功能,將采集到的音頻數(shù)據(jù)寫入AudioTrack對(duì)象并播放出來(lái)。

AudioTrack的工作流程:

(1) 配置參數(shù),初始化內(nèi)部的音頻播放緩沖區(qū)
(2) 開始播放
(3) 需要一個(gè)線程,不斷地向AudioTrack的緩沖區(qū)“寫入”音頻數(shù)據(jù),注意,這個(gè)過(guò)程一定要及時(shí),否則就會(huì)出現(xiàn)“underrun”的錯(cuò)誤,該錯(cuò)誤在音頻開發(fā)中比較常見(jiàn),意味著應(yīng)用層沒(méi)有及時(shí)地“送入”音頻數(shù)據(jù),導(dǎo)致內(nèi)部的音頻播放緩沖區(qū)為空。
(4) 停止播放,釋放資源

AudioTrack的參數(shù)配置:

  • 「streamType」 這個(gè)參數(shù)代表著當(dāng)前應(yīng)用使用的哪一種音頻管理策略,當(dāng)系統(tǒng)有多個(gè)進(jìn)程需要播放音頻時(shí),這個(gè)管理策略會(huì)決定最終的展現(xiàn)效果,該參數(shù)的可選的值以常量的形式定義在 AudioManager 類中,主要包括:
STREAM_VOCIE_CALL:電話聲音
STREAM_SYSTEM:系統(tǒng)聲音
STREAM_RING:鈴聲
STREAM_MUSCI:音樂(lè)聲
STREAM_ALARM:警告聲
STREAM_NOTIFICATION:通知聲
  • 「sampleRateInHz」 采樣率,從AudioTrack源碼的“audioParamCheck”函數(shù)可以看到,這個(gè)采樣率的取值范圍必須在4000Hz~192000Hz之間。
  • 「mode」 AudioTrack提供了兩種播放模式,一種是static方式,一種是streaming方式,前者需要一次性將所有的數(shù)據(jù)都寫入播放緩沖區(qū),簡(jiǎn)單高效,通常用于播放鈴聲、系統(tǒng)提醒的音頻片段; 后者則是按照一定的時(shí)間間隔不間斷地寫入音頻數(shù)據(jù),理論上它可用于任何音頻播放的場(chǎng)景??蛇x的值以常量的形式定義在AudioTrack類中,一個(gè)是MODE_STATIC,另一個(gè)是MODE_STREAM,根據(jù)具體的應(yīng)用傳入對(duì)應(yīng)的值即可。

音頻錄制選擇

MediaRecorder是一個(gè)高級(jí)別的音頻/視頻錄制工具,集成了錄音、編碼、封裝復(fù)用等功能,操作起來(lái)相對(duì)簡(jiǎn)單。錄制的音頻文件經(jīng)過(guò)壓縮處理,并可以直接使用系統(tǒng)自帶的播放器進(jìn)行播放。MediaRecorder的簡(jiǎn)單易用性使其適用于對(duì)音頻處理要求不高的場(chǎng)景。由于它更多地是系統(tǒng)音頻API的封裝,對(duì)于需要實(shí)時(shí)處理音頻、進(jìn)行網(wǎng)絡(luò)傳輸或直播等高級(jí)應(yīng)用場(chǎng)景,可能并不適用。

AudioRecord則更加接近底層,提供了更加靈活和自由的音頻采集和處理能力。支持多種音頻編碼格式,如PCM、WAV、MP3等,可以滿足不同場(chǎng)景下的需求。AudioRecord還設(shè)計(jì)了靈活的數(shù)據(jù)處理接口,可以方便地添加自定義的音頻處理模塊,實(shí)現(xiàn)如混響、均衡器等效果。這使得AudioRecord在需要對(duì)音頻進(jìn)行進(jìn)一步算法處理、采用第三方編碼庫(kù)進(jìn)行壓縮、進(jìn)行網(wǎng)絡(luò)傳輸和直播等高級(jí)應(yīng)用場(chǎng)景中表現(xiàn)出色。AudioRecord還具有線程安全、性能優(yōu)異、可擴(kuò)展性強(qiáng)等特點(diǎn),保證了其在多線程環(huán)境中的穩(wěn)定運(yùn)行,并預(yù)留了豐富的接口供拓展定制。

對(duì)于音頻處理要求不高的場(chǎng)景,可以選擇使用MediaRecorder,簡(jiǎn)單易用,能夠直接錄制并播放壓縮后的音頻文件。對(duì)于需要對(duì)音頻進(jìn)行進(jìn)一步算法處理、采用第三方編碼庫(kù)進(jìn)行壓縮、進(jìn)行網(wǎng)絡(luò)傳輸和直播等高級(jí)應(yīng)用場(chǎng)景,推薦使用AudioRecord,提供了更加靈活和自由的音頻采集和處理能力。

音頻播放選擇

在選擇時(shí)需要考慮以下因素:

  • 「音頻文件的類型」:如果需要播放長(zhǎng)時(shí)間的音樂(lè)或視頻文件,MediaPlayer可能是更好的選擇;如果需要播放短音頻片段,可以考慮使用SoundPool。
  • 「播放需求」:如果需要同時(shí)播放多個(gè)音頻,SoundPool是一個(gè)很好的選擇;如果需要對(duì)音頻進(jìn)行更精細(xì)的控制,例如調(diào)整音量、播放速率等,那么AudioTrack可能更適合。
  • 「性能需求」:SoundPool通常具有較低的CPU占用率和反應(yīng)延遲,適合性能要求較高的應(yīng)用;而AudioTrack由于更底層,可能需要更多的開發(fā)工作,但可以實(shí)現(xiàn)更高級(jí)別的音頻處理和控制。

MediaPlayer主要用于后臺(tái)長(zhǎng)時(shí)間播放本地音樂(lè)文件或在線流媒體文件。提供了一個(gè)高層次的封裝,使播放音頻變得相對(duì)簡(jiǎn)單。MediaPlayer特別適合那些需要連續(xù)播放較長(zhǎng)時(shí)間音頻的應(yīng)用場(chǎng)景,例如音樂(lè)播放器或視頻播放器。

SoundPool更適合播放較短的音頻片段,如游戲聲音、按鍵聲音、鈴聲片段等。SoundPool可以同時(shí)播放多個(gè)音頻,并且具有較低的CPU占用率和反應(yīng)延遲。在需要頻繁播放短音頻的應(yīng)用中表現(xiàn)出色,例如游戲或通知提示音。

AudioTrack是更加底層的API,主要用于管理和播放單一音頻資源。提供了非常強(qiáng)大的控制能力,適合流媒體播放等場(chǎng)景。AudioTrack需要結(jié)合解碼器來(lái)使用,對(duì)于需要進(jìn)行底層音頻處理的開發(fā)者來(lái)說(shuō)更為適用。


責(zé)任編輯:武曉燕 來(lái)源: 沐雨花飛蝶
相關(guān)推薦

2021-07-09 09:24:41

鴻蒙HarmonyOS應(yīng)用

2021-04-12 17:59:39

WindowsYouTube谷歌

2022-08-15 19:25:56

Android音頻PCM

2015-06-16 10:27:13

iOSAndroid音頻

2023-08-16 08:00:39

API網(wǎng)頁(yè)端音頻錄制

2024-02-06 10:04:21

微軟視頻編輯工具

2016-09-12 14:42:24

LinuxOctave音頻文件

2011-12-20 20:40:07

Android

2016-10-31 19:41:50

LinuxOctave音頻文件

2023-01-05 16:51:04

機(jī)器學(xué)習(xí)人工智能

2018-06-06 15:49:06

FPGA音頻處理器

2022-12-25 17:49:55

Ubuntu媒體音頻Linux

2010-01-27 15:15:13

Android多媒體錄

2009-06-12 08:57:56

Unix字符串處理

2011-08-01 14:42:47

iPhone 應(yīng)用程序 聲音

2015-09-16 16:38:10

QmmpWinampUbuntu

2011-09-05 18:08:01

MTK音頻播放器

2011-07-27 09:50:31

iPhone AVAudioPla 音頻

2011-08-02 16:58:15

iPhone AVAudioPla 音頻播放

2011-08-08 18:19:09

iPhone音頻播放
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)