接口說(shuō)明
接口名 | 描述 |
---|---|
AudioCapturer(AudioCapturerInfo audioCapturerInfo) throws IllegalArgumentException | 構(gòu)造函數(shù),設(shè)置錄音相關(guān)音頻參數(shù),使用默認(rèn)錄音設(shè)備。 |
AudioCapturer(AudioCapturerInfo audioCapturerInfo, AudioDeviceDescriptor devInfo) throws IllegalArgumentException | 構(gòu)造函數(shù),設(shè)置錄音相關(guān)音頻參數(shù)并指定錄音設(shè)備。 |
getMinBufferSize(int sampleRate, int channelCount, int audioFormat) | 獲取指定參數(shù)條件下所需的最小緩沖區(qū)大小。 |
addSoundEffect(UUID type, String packageName) | 增加錄音的音頻音效。 |
start() | 開(kāi)始錄音。 |
read(byte[] data, int offset, int size) | 讀取音頻數(shù)據(jù)。 |
read?(byte[] data, int offset, int size, boolean isBlocking) | 讀取音頻數(shù)據(jù)并寫(xiě)入傳入的byte數(shù)組中。 |
read?(float[] data, int offsetInFloats, int sizeInFloats) | 阻塞式讀取音頻數(shù)據(jù)并寫(xiě)入傳入的float數(shù)組中。 |
read?(float[] data, int offsetInFloats, int sizeInFloats, boolean isBlocking) | 讀取音頻數(shù)據(jù)并寫(xiě)入傳入的float數(shù)組中。 |
read?(short[] data, int offsetInShorts, int sizeInShorts) | 阻塞式讀取音頻數(shù)據(jù)并寫(xiě)入傳入的short數(shù)組中。 |
read?(short[] data, int offsetInShorts, int sizeInShorts, boolean isBlocking) | 讀取音頻數(shù)據(jù)并寫(xiě)入傳入的short數(shù)組中。 |
read?(java.nio.ByteBuffer buffer, int sizeInBytes) | 阻塞式讀取音頻數(shù)據(jù)并寫(xiě)入傳入的ByteBuffer對(duì)象中。 |
read?(java.nio.ByteBuffer buffer, int sizeInBytes, boolean isBlocking) | 讀取音頻數(shù)據(jù)并寫(xiě)入傳入的ByteBuffer對(duì)象中。 |
stop() | 停止錄音。 |
release() | 釋放錄音資源。 |
getSelectedDevice() | 獲取輸入設(shè)備信息。 |
getCurrentDevice() | 獲取當(dāng)前正在錄制音頻的設(shè)備信息。 |
getCapturerSessionId() | 獲取錄音的session ID。 |
getSoundEffects() | 獲取已經(jīng)激活的音頻音效列表。 |
getState() | 獲取音頻采集狀態(tài)。 |
getSampleRate() | 獲取采樣率。 |
getAudioInputSource() | 獲取錄音的輸入設(shè)備信息。 |
getBufferFrameCount?() | 獲取以幀為單位的緩沖區(qū)大小。 |
getChannelCount?() | 獲取音頻采集通道數(shù)。 |
getEncodingFormat?() | 獲取音頻采集的音頻編碼格式。 |
getAudioTime(Timestamp timestamp, Timestamp.Timebase timebase) | 獲取一個(gè)即時(shí)的捕獲時(shí)間戳。 |
開(kāi)發(fā)步驟
- 構(gòu)造音頻流參數(shù)的數(shù)據(jù)結(jié)構(gòu)AudioStreamInfo,推薦使用AudioStreamInfo.Builder類(lèi)來(lái)構(gòu)造,模板如下,模板中設(shè)置的均為AudioStreamInfo.Builder類(lèi)的默認(rèn)值,根據(jù)音頻流的具體規(guī)格來(lái)設(shè)置具體參數(shù)。
AudioStreamInfo audioStreamInfo = new AudioStreamInfo.Builder()
.sampleRate(AudioStreamInfo.SAMPLE_RATE_UNSPECIFIED)
.audioStreamFlag(AudioStreamInfo.AudioStreamFlag.AUDIO_STREAM_FLAG_NONE)
.encodingFormat(AudioStreamInfo.EncodingFormat.ENCODING_INVALID)
.channelMask(AudioStreamInfo.ChannelMask.CHANNEL_INVALID)
.streamUsage(AudioStreamInfo.StreamUsage.STREAM_USAGE_UNKNOWN)
.build();
復(fù)制
-
(可選)通過(guò)采集的采樣率、聲道數(shù)和數(shù)據(jù)格式,調(diào)用getMinBufferSize方法獲取采集任務(wù)所需的最小buffer,參照該buffer值設(shè)置步驟3中AudioCapturerInfo的bufferSizeInBytes。
-
使用步驟1創(chuàng)建的音頻流構(gòu)建音頻采集的參數(shù)結(jié)構(gòu)AudioCapturerInfo,推薦使用AudioCapturerInfo.Builder類(lèi)來(lái)構(gòu)造,根據(jù)音頻采集的具體規(guī)格來(lái)設(shè)置具體參數(shù)。以真實(shí)的錄制pcm流為例:
AudioStreamInfo audioStreamInfo = new AudioStreamInfo.Builder()
.encodingFormat(AudioStreamInfo.EncodingFormat.ENCODING_PCM_16BIT) // 16-bit PCM
.channelMask(AudioStreamInfo.ChannelMask.CHANNEL_IN_STEREO) // 雙聲道輸入
.sampleRate(44100) // 44.1kHz
.build();
AudioCapturerInfo audioCapturerInfo = new AudioCapturerInfo.Builder().audioStreamInfo(audioStreamInfo)
.build();
復(fù)制
-
(可選)設(shè)置采集設(shè)備,如麥克風(fēng)、耳機(jī)等。通過(guò)AudioManager.getDevices(AudioDeviceDescriptor.DeviceFlag.INPUT_DEVICES_FLAG)獲取到設(shè)備支持的輸入設(shè)備,然后依照AudioDeviceDescriptor.DeviceType選擇要選用的輸入設(shè)備類(lèi)型。
-
通過(guò)構(gòu)造方法獲取AudioCapturer類(lèi)的實(shí)例化對(duì)象(構(gòu)造AudioCapturer類(lèi)的實(shí)例化對(duì)象前需先去配置錄音權(quán)限–ohos.permission.MICROPHONE),其中步驟3的參數(shù)為必選參數(shù),通過(guò)步驟4獲取的指定錄音設(shè)備為可選參數(shù)。
錄音權(quán)限的申請(qǐng),需要開(kāi)發(fā)者在config.json文件中的“reqPermissions”字段中聲明所需要的權(quán)限。
“module”: {
“reqPermissions”: [
{
“name”: “ohos.permission.MICROPHONE”
},
{
…
}
]
}
復(fù)制
增加Ability接口的訪問(wèn)權(quán)限控制:
public class MainAbility extends Ability {
@Override
public void onStart(Intent intent) {
…
requestPermissions(); //在onStart方法中調(diào)用申請(qǐng)的權(quán)限
}
private void requestPermissions() {
String[] permissions = {
SystemPermission.ohos.permission.MICROPHONE, …,…
};
requestPermissionsFromUser(Arrays.stream(permissions)
.filter(permission -> verifySelfPermission(permission) != IBundleManager.PERMISSION_GRANTED).toArray(String[]::new), 0);
}
}
復(fù)制
實(shí)例化AudioCapturer對(duì)象:
AudioCapturer audioCapturer = new AudioCapturer(audioCapturerInfo);
復(fù)制
-
(可選)設(shè)置采集音效,如降噪、回聲消除等。使用addSoundEffect(UUID type, String packageName)進(jìn)行音效設(shè)置,其中UUID參考類(lèi)SoundEffect中提供的靜態(tài)變量。
-
(可選)構(gòu)造音頻采集回調(diào),首先繼承抽象類(lèi)AudioCapturerCallback,并實(shí)現(xiàn)抽象方法onCapturerConfigChanged(List configs),然后調(diào)用AudioManager類(lèi)的registerAudioCapturerCallback(AudioCapturerCallback cb)方法進(jìn)行音頻采集回調(diào)注冊(cè)。代碼示例如下:
private AudioManager audioManager = new AudioManager();
public void main() {
AudioCapturerCallback cb = new AudioCapturerCallback() {
@Override
public void onCapturerConfigChanged(List configs) {
configs.forEach(config -> doSomething(config));
}
};
audioManager.registerAudioCapturerCallback(cb);
}
private void doSomething(AudioCapturerConfig config) {
…
}
復(fù)制
-
調(diào)用 AudioCapturer實(shí)例化對(duì)象的start()方法啟動(dòng)采集任務(wù)。
-
采集的音頻數(shù)據(jù)讀取為byte流,循環(huán)調(diào)用AudioCapturer的read方法進(jìn)行數(shù)據(jù)讀取。
-
調(diào)用AudioCapturer實(shí)例化對(duì)象的stop()方法停止采集。
-
采集任務(wù)結(jié)束后,調(diào)用AudioCapturer實(shí)例化對(duì)象的release()釋放資源。
二、音量管理開(kāi)發(fā)
場(chǎng)景介紹
音量管理的主要工作是音量調(diào)節(jié),輸入/輸出設(shè)備管理,注冊(cè)音頻中斷、音頻采集中斷的回調(diào)等。
接口說(shuō)明
當(dāng)前僅系統(tǒng)應(yīng)用支持設(shè)置靜音或響鈴等模式。
接口名 | 描述 |
---|---|
AudioManager() | 構(gòu)造函數(shù)。 |
AudioManager?(Context context) | 構(gòu)造函數(shù),由使用者指定應(yīng)用上下文Context。 |
AudioManager(String packageName) | 構(gòu)造函數(shù),由使用者指定包信息。 |
activateAudioInterrupt(AudioInterrupt interrupt) | 激活音頻中斷狀態(tài)檢測(cè)。 |
deactivateAudioInterrupt(AudioInterrupt interrupt) | 去激活音頻中斷狀態(tài)檢測(cè)。 |
getAudioParameter(String key) | 獲取音頻硬件中指定參數(shù)keys所對(duì)應(yīng)的參數(shù)值。 |
getDevices(DeviceFlag flag) | 獲取設(shè)備信息。 |
getMaxVolume(AudioVolumeType volumeType) | 獲取指定音頻流音量最大檔位。 |
getMinVolume(AudioVolumeType volumeType) | 獲取指定音頻流音量最小檔位。 |
getRingerMode() | 獲取鈴聲模式。 |
getVersion() | 獲取音頻套件版本。 |
getVolume(AudioVolumeType volumeType) | 獲取指定音頻流的音量檔位。 |
isDeviceActive(int deviceType) | 判斷設(shè)備的開(kāi)關(guān)狀態(tài)。 |
isMute(AudioVolumeType volumeType) | 特定的流是否處于靜音狀態(tài)。 |
mute(AudioVolumeType volumeType) | 將特定流設(shè)置為靜音狀態(tài)。 |
setAudioParameter(String key, String value) | 為音頻硬件設(shè)置可變數(shù)量的參數(shù)值。 |
setDeviceActive(int deviceType, boolean state) | 設(shè)置設(shè)備的開(kāi)關(guān)狀態(tài)。 |
setRingerMode(AudioRingMode mode) | 設(shè)置鈴聲模式。 |
setVolume(AudioVolumeType volumeType, int volume) | 設(shè)置特定流的音量檔位。 |
unmute(AudioVolumeType volumeType) | 將特定流設(shè)置為非靜音狀態(tài)。 |
setMasterMute(boolean isMute) | 將主音頻輸出設(shè)備設(shè)置為靜音或取消靜音狀態(tài)。 |
setMicrophoneMute(boolean isMute) | 將麥克風(fēng)設(shè)置為靜音或取消靜音狀態(tài)。 |
isMicrophoneMute() | 判斷麥克風(fēng)是否處于靜音狀態(tài)。 |
getActiveCapturerConfigs() | 獲取設(shè)備當(dāng)前激活的音頻采集任務(wù)的配置信息。 |
registerAudioCapturerCallback(AudioCapturerCallback cb) | 注冊(cè)音頻采集參數(shù)變更回調(diào)。 |
unregisterAudioCapturerCallback?(AudioCapturerCallback cb) | 去注冊(cè)音頻采集參數(shù)變更回調(diào)。 |
getRingerUri(Context context, RingToneType type) | 獲取指定鈴聲類(lèi)型的Uri。 |
setRingerUri(Context context, RingToneType type, Uri uri) | 設(shè)置指定鈴聲類(lèi)型的Uri。 |
changeVolumeBy?(AudioVolumeType volumeType, int index) | 將當(dāng)前音量增加或減少一定量。 |
connectBluetoothSco?() | 連接到藍(lán)牙SCO通道。 |
disconnectBluetoothSco?() | 斷開(kāi)與藍(lán)牙SCO通道的連接。 |
getActiveRendererConfigs?() | 獲取有關(guān)活動(dòng)音頻流信息,包括使用類(lèi)型、內(nèi)容類(lèi)型和標(biāo)志。 |
getMasterOutputFrameCount?() | 獲取主輸出設(shè)備緩沖區(qū)中的幀數(shù)。 |
getMasterOutputSampleRate?() | 獲取主輸出設(shè)備的采樣率。 |
isMasterMute?() | 檢查音頻流是否全局靜音。 |
isStreamActive?(AudioVolumeType volumeType) | 檢查指定類(lèi)型的音頻流是否處于活動(dòng)狀態(tài)。 |
makeSessionId?() | 創(chuàng)建一個(gè)會(huì)話ID,AudioRendererInfo.Builder.sessionID(int)將使用該會(huì)話ID來(lái)設(shè)置音頻播放參數(shù),而AudioCapturerInfo.Builder.sessionID(int)將使用該會(huì)話ID來(lái)設(shè)置記錄參數(shù)。 |
registerAudioRendererCallback?(AudioRendererCallback cb) | 注冊(cè)音頻播放參數(shù)變更回調(diào)。 |
unregisterAudioRendererCallback?(AudioRendererCallback cb) | 去注冊(cè)音頻播放參數(shù)變更回調(diào)。 |
開(kāi)發(fā)步驟
音量管理提供的都是獨(dú)立的功能,一般作為音頻播放和音頻采集的功能補(bǔ)充來(lái)使用。開(kāi)發(fā)者根據(jù)具體使用場(chǎng)景選擇方法即可。
音頻中斷狀態(tài)檢測(cè)和音頻采集中斷狀態(tài)檢測(cè)的使用樣例,請(qǐng)參考音頻播放和音頻采集的開(kāi)發(fā)步驟。
三、短音播放開(kāi)發(fā)
場(chǎng)景介紹
短音播放主要負(fù)責(zé)管理音頻資源的加載與播放、tone音的生成與播放以及系統(tǒng)音播放。
接口說(shuō)明
短音播放開(kāi)放能力分為音頻資源、tone音和系統(tǒng)音三部分,均定義在SoundPlayer類(lèi)
接口名 | 描述 |
---|---|
SoundPlayer(int taskType) | 構(gòu)造函數(shù),僅用于音頻資源。 |
createSound(String path) | 從指定的路徑加載音頻數(shù)據(jù)生成短音資源。 |
createSound?(Context context, int resourceId) | 根據(jù)應(yīng)用程序上下文合音頻資源ID加載音頻數(shù)據(jù)生成短音資源。 |
createSound?(AssetFD assetFD) | 從指定的AssetFD實(shí)例加載音頻數(shù)據(jù)生成短音資源。 |
createSound?(java.io.FileDescriptor fd, long offset, long length) | 根據(jù)文件描述符從文件加載音頻數(shù)據(jù)生成音頻資源。 |
createSound?(java.lang.String path, AudioRendererInfo rendererInfo) | 根據(jù)從指定路徑和播放信息加載音頻數(shù)據(jù)生成短音資源。 |
setOnCreateCompleteListener?(SoundPlayer.OnCreateCompleteListener listener) | 設(shè)置聲音創(chuàng)建完成的回調(diào)。 |
setOnCreateCompleteListener?(SoundPlayer.OnCreateCompleteListener listener, boolean isDiscarded) | 設(shè)置用于聲音創(chuàng)建完成的回調(diào),并根據(jù)指定的isDiscarded標(biāo)志位確定是否丟棄隊(duì)列中的原始回調(diào)通知消息。 |
deleteSound(int soundID) | 刪除短音同時(shí)釋放短音所占資源。 |
pause(int taskID) | 根據(jù)播放任務(wù)ID暫停對(duì)應(yīng)的短音播放。 |
play(int soundID) | 使用默認(rèn)參數(shù)播放短音。 |
play(int soundID, SoundPlayerParameters parameters) | 使用指定參數(shù)播放短音。 |
resume(int taskID) | 恢復(fù)短音播放任務(wù)。 |
setLoop(int taskID, int loopNum) | 設(shè)置短音播放任務(wù)的循環(huán)次數(shù)。 |
setPlaySpeedRate(int taskID, float speedRate) | 設(shè)置短音播放任務(wù)的播放速度。 |
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過(guò),也去過(guò)華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)HarmonyOS鴻蒙開(kāi)發(fā)工程師,想要提升技能,往往是自己摸索成長(zhǎng)或者是報(bào)班學(xué)習(xí),但對(duì)于培訓(xùn)機(jī)構(gòu)動(dòng)則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年HarmonyOS鴻蒙開(kāi)發(fā)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上HarmonyOS鴻蒙開(kāi)發(fā)知識(shí)點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來(lái),每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且會(huì)持續(xù)更新
如果你覺(jué)得這些內(nèi)容對(duì)你有幫助,可以添加VX:vip204888 (備注鴻蒙獲取)
一個(gè)人可以走的很快,但一群人才能走的更遠(yuǎn)。不論你是正從事IT行業(yè)的老鳥(niǎo)或是對(duì)IT行業(yè)感興趣的新人,都?xì)g迎掃碼加入我們的的圈子(技術(shù)交流、學(xué)習(xí)資源、職場(chǎng)吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習(xí)成長(zhǎng)!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-855830.html
5%以上HarmonyOS鴻蒙開(kāi)發(fā)知識(shí)點(diǎn),真正體系化!**
由于文件比較大,這里只是將部分目錄大綱截圖出來(lái),每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且會(huì)持續(xù)更新
如果你覺(jué)得這些內(nèi)容對(duì)你有幫助,可以添加VX:vip204888 (備注鴻蒙獲?。?/strong>
[外鏈圖片轉(zhuǎn)存中…(img-aUbs4k59-1712669789999)]文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-855830.html
一個(gè)人可以走的很快,但一群人才能走的更遠(yuǎn)。不論你是正從事IT行業(yè)的老鳥(niǎo)或是對(duì)IT行業(yè)感興趣的新人,都?xì)g迎掃碼加入我們的的圈子(技術(shù)交流、學(xué)習(xí)資源、職場(chǎng)吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習(xí)成長(zhǎng)!
到了這里,關(guān)于HarmonyOS學(xué)習(xí)路之開(kāi)發(fā)篇—多媒體開(kāi)發(fā)(音頻開(kāi)發(fā) 二(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!