女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙開發實戰:【音頻組件】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-15 15:53 ? 次閱讀

簡介

音頻組件用于實現音頻相關的功能,包括音頻播放,錄制,音量管理和設備管理。

圖 1 音頻組件架構圖

基本概念

  • 采樣

采樣是指將連續時域上的模擬信號按照一定的時間間隔采樣,獲取到離散時域上離散信號的過程。

  • 采樣率

采樣率為每秒從連續信號中提取并組成離散信號的采樣次數,單位用赫茲(Hz)來表示。通常人耳能聽到頻率范圍大約在20Hz~20kHz之間的聲音。常用的音頻采樣頻率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

  • 聲道

聲道是指聲音在錄制或播放時在不同空間位置采集或回放的相互獨立的音頻信號,所以聲道數也就是聲音錄制時的音源數量或回放時相應的揚聲器數量。

  • 音頻幀

音頻數據是流式的,本身沒有明確的一幀幀的概念,在實際的應用中,為了音頻算法處理/傳輸的方便,一般約定俗成取2.5ms~60ms為單位的數據量為一幀音頻。這個時間被稱之為“采樣時間”,其長度沒有特別的標準,它是根據編解碼器和具體應用的需求來決定的。

  • PCM

PCM(Pulse Code Modulation),即脈沖編碼調制,是一種將模擬信號數字化的方法,是將時間連續、取值連續的模擬信號轉換成時間離散、抽樣值離散的數字信號的過程。

目錄

倉目錄結構如下:

/foundation/multimedia/audio_standard  # 音頻組件業務代碼
├── frameworks                         # 框架代碼
│   ├── native                         # 內部接口實現
│   └── js                             # 外部接口實現
│       └── napi                       # napi 外部接口實現
├── interfaces                         # 接口代碼
│   ├── inner_api                      # 內部接口
│   └── kits                           # 外部接口
├── sa_profile                         # 服務配置文件
├── services                           # 服務代碼
├── LICENSE                            # 證書文件
└── bundle.json                        # 編譯文件

使用說明

音頻播放

可以使用此倉庫內提供的接口將音頻數據轉換為音頻模擬信號,使用輸出設備播放音頻信號,以及管理音頻播放任務。以下步驟描述了如何使用 AudioRenderer 開發音頻播放功能:

  1. 使用 Create 接口和所需流類型來獲取 AudioRenderer 實例。
    AudioStreamType streamType = STREAM_MUSIC; // 流類型示例
    std::unique_ptr< AudioRenderer > audioRenderer = AudioRenderer::Create(streamType);
    
  2. (可選)靜態接口 GetSupportedFormats (), GetSupportedChannels (), GetSupportedEncodingTypes (), GetSupportedSamplingRates () 可用于獲取支持的參數。
  3. 準備設備,調用實例的 SetParams
    AudioRendererParams rendererParams;
    rendererParams.sampleFormat = SAMPLE_S16LE;
    rendererParams.sampleRate = SAMPLE_RATE_44100;
    rendererParams.channelCount = STEREO;
    rendererParams.encodingType = ENCODING_PCM;
    
    audioRenderer- >SetParams(rendererParams);
    
  4. (可選)使用 audioRenderer-> GetParams (rendererParams) 來驗證 SetParams。
  5. (可選)使用 SetAudioEffectModeGetAudioEffectMode 接口來設置和獲取當前音頻流的音效模式。
    AudioEffectMode effectMode = EFFECT_DEFAULT;
    int32_t result = audioRenderer- >SetAudioEffectMode(effectMode);
    AudioEffectMode mode = audioRenderer- >GetAudioEffectMode();
    
  6. AudioRenderer 實例調用 audioRenderer-> Start () 函數來啟動播放任務。
  7. 使用 GetBufferSize 接口獲取要寫入的緩沖區長度。
    audioRenderer- >GetBufferSize(bufferLen);
    
  8. 從源(例如音頻文件)讀取要播放的音頻數據并將其傳輸到字節流中。重復調用Write函數寫入渲染數據。
    bytesToWrite = fread(buffer, 1, bufferLen, wavFile);
    while ((bytesWritten < bytesToWrite) && ((bytesToWrite - bytesWritten) > minBytes)) {
        bytesWritten += audioRenderer- >Write(buffer + bytesWritten, bytesToWrite - bytesWritten);
        if (bytesWritten < 0)
            break;
    }
    
  9. 調用audioRenderer-> Drain ()來清空播放流。
  10. 調用audioRenderer-> Stop ()來停止輸出。
  11. 播放任務完成后,調用AudioRenderer實例的audioRenderer-> Release ()函數來釋放資源。

以上提供了基本音頻播放使用場景。

  1. 使用 audioRenderer->SetVolume(float) 和 audioRenderer->GetVolume() 來設置和獲取當前音頻流音量, 可選范圍為 0.0 到 1.0。

音頻錄制

可以使用此倉庫內提供的接口,讓應用程序可以完成使用輸入設備進行聲音錄制,將語音轉換為音頻數據,并管理錄制的任務。以下步驟描述了如何使用 AudioCapturer 開發音頻錄制功能:

  1. 使用Create接口和所需流類型來獲取 AudioCapturer 實例。
    AudioStreamType streamType = STREAM_MUSIC;
    std::unique_ptr< AudioCapturer > audioCapturer = AudioCapturer::Create(streamType);
    
  2. (可選)靜態接口 GetSupportedFormats (), GetSupportedChannels (), GetSupportedEncodingTypes (), GetSupportedSamplingRates () 可用于獲取支持的參數。
  3. 準備設備,調用實例的 SetParams
    AudioCapturerParams capturerParams;
    capturerParams.sampleFormat = SAMPLE_S16LE;
    capturerParams.sampleRate = SAMPLE_RATE_44100;
    capturerParams.channelCount = STEREO;
    capturerParams.encodingType = ENCODING_PCM;
    
    audioCapturer- >SetParams(capturerParams);
    
  4. (可選)使用 audioCapturer-> GetParams (capturerParams) 來驗證 SetParams()。
  5. AudioCapturer 實例調用 AudioCapturer-> Start () 函數來啟動錄音任務。
  6. 使用 GetBufferSize 接口獲取要寫入的緩沖區長度。
    audioCapturer- >GetBufferSize(bufferLen);
    
  7. 讀取錄制的音頻數據并將其轉換為字節流。重復調用read函數讀取數據直到主動停止。
    // set isBlocking = true/false for blocking/non-blocking read
    bytesRead = audioCapturer- >Read(*buffer, bufferLen, isBlocking);
    while (numBuffersToCapture) {
        bytesRead = audioCapturer- >Read(*buffer, bufferLen, isBlockingRead);
        if (bytesRead <= 0) {
            break;
        } else if (bytesRead > 0) {
            fwrite(buffer, size, bytesRead, recFile); // example shows writes the recorded data into a file
            numBuffersToCapture--;
        }
    }
    
  8. (可選)audioCapturer-> Flush () 來清空錄音流緩沖區。
  9. AudioCapturer 實例調用 audioCapturer-> Stop () 函數停止錄音。
  10. 錄音任務完成后,調用 AudioCapturer 實例的 audioCapturer-> Release () 函數釋放資源。

音頻管理

可以使用 [ audio_system_manager.h ]內的接口來控制音量和設備。

  1. 使用 GetInstance 接口獲取 AudioSystemManager 實例.
    AudioSystemManager *audioSystemMgr = AudioSystemManager::GetInstance();
    

音量控制

  1. 使用 GetMaxVolumeGetMinVolume 接口去查詢音頻流支持的最大和最小音量等級,在此范圍內設置音量。
    AudioVolumeType streamType = AudioVolumeType::STREAM_MUSIC;
    int32_t maxVol = audioSystemMgr- >GetMaxVolume(streamType);
    int32_t minVol = audioSystemMgr- >GetMinVolume(streamType);
    
  2. 使用 SetVolumeGetVolume 接口來設置和獲取指定音頻流的音量等級。
    int32_t result = audioSystemMgr- >SetVolume(streamType, 10);
    int32_t vol = audioSystemMgr- >GetVolume(streamType);
    
  3. 使用 SetMuteIsStreamMute 接口來設置和獲取指定音頻流的靜音狀態。
    int32_t result = audioSystemMgr- >SetMute(streamType, true);
    bool isMute = audioSystemMgr- >IsStreamMute(streamType);
    
  4. 使用 SetRingerModeGetRingerMode 接口來設置和獲取鈴聲模式。參考在 [ audio_info.h ]定義的 AudioRingerMode 枚舉來獲取支持的鈴聲模式。
    int32_t result = audioSystemMgr- >SetRingerMode(RINGER_MODE_SILENT);
    AudioRingerMode ringMode = audioSystemMgr- >GetRingerMode();
    
  5. 使用 SetMicrophoneMuteIsMicrophoneMute 接口來設置和獲取麥克風的靜音狀態。
    int32_t result = audioSystemMgr- >SetMicrophoneMute(true);
    bool isMicMute = audioSystemMgr- >IsMicrophoneMute();
    

設備控制

  1. 使用 GetDevices , deviceType_deviceRole_ 接口來獲取音頻輸入輸出設備信息。 內定義的DeviceFlag, DeviceType 和 DeviceRole 枚舉。
    DeviceFlag deviceFlag = OUTPUT_DEVICES_FLAG;
    vector< sptr< AudioDeviceDescriptor >> audioDeviceDescriptors
        = audioSystemMgr- >GetDevices(deviceFlag);
    sptr< AudioDeviceDescriptor > audioDeviceDescriptor = audioDeviceDescriptors[0];
    cout < < audioDeviceDescriptor- >deviceType_;
    cout < < audioDeviceDescriptor- >deviceRole_;
    
  2. 使用 SetDeviceActiveIsDeviceActive 接口去激活/去激活音頻設備和獲取音頻設備激活狀態。
    ActiveDeviceType deviceType = SPEAKER;
    int32_t result = audioSystemMgr- >SetDeviceActive(deviceType, true);
    bool isDevActive = audioSystemMgr- >IsDeviceActive(deviceType);
    
  3. 提供其他用途的接口如 IsStreamActive , SetAudioParameter and GetAudioParameter
  4. 應用程序可以使用 AudioManagerNapi::On注冊系統音量的更改。 在此,如果應用程序監聽到系統音量更改的事件,就會用以下參數通知應用程序: volumeType : 更改的系統音量的類型 volume : 當前的音量等級 updateUi : 是否需要顯示變化詳細信息。(如果音量被增大/減小,將updateUi標志設置為true,在其他情況下,updateUi設置為false)。
const audioManager = audio.getAudioManager();

export default {
  onCreate() {
    audioManager.on('volumeChange', (volumeChange) == > {
      console.info('volumeType = '+volumeChange.volumeType);
      console.info('volume = '+volumeChange.volume);
      console.info('updateUi = '+volumeChange.updateUi);
    }
  }
}

音頻場景

  1. 使用 SetAudioScenegetAudioScene 接口去更改和檢查音頻策略。
    int32_t result = audioSystemMgr- >SetAudioScene(AUDIO_SCENE_PHONE_CALL);
    AudioScene audioScene = audioSystemMgr- >GetAudioScene();
    

有關支持的音頻場景,請參閱 AudioScene 中的枚舉[ audio_info.h ]

音頻流管理

可以使用[ audio_stream_manager.h ]提供的接口用于流管理功能。

  1. 使用 GetInstance 接口獲得 AudioSystemManager 實例。
    AudioStreamManager *audioStreamMgr = AudioStreamManager::GetInstance();
    
  2. 使用 RegisterAudioRendererEventListener 為渲染器狀態更改注冊偵聽器。渲染器狀態更改回調,該回調將在渲染器流狀態更改時調用, 通過重寫 AudioRendererStateChangeCallback 類中的函數 OnRendererStateChange
    const int32_t clientPid;
    
    class RendererStateChangeCallback : public AudioRendererStateChangeCallback {
    public:
        RendererStateChangeCallback = default;
        ~RendererStateChangeCallback = default;
    void OnRendererStateChange(
        const std::vector< std::unique_ptr< AudioRendererChangeInfo >> &audioRendererChangeInfos) override
    {
        cout< "OnRendererStateChange entered"<
    
  3. 使用 RegisterAudioCapturerEventListener 為捕獲器狀態更改注冊偵聽器。 捕獲器狀態更改回調,該回調將在捕獲器流狀態更改時調用, 通過重寫 AudioCapturerStateChangeCallback 類中的函數 OnCapturerStateChange
    const int32_t clientPid;
    
    class CapturerStateChangeCallback : public AudioCapturerStateChangeCallback {
    public:
        CapturerStateChangeCallback = default;
        ~CapturerStateChangeCallback = default;
    void OnCapturerStateChange(
        const std::vector< std::unique_ptr< AudioCapturerChangeInfo >> &audioCapturerChangeInfos) override
    {
        cout< "OnCapturerStateChange entered"<
    
  4. 使用 GetCurrentRendererChangeInfos 獲取所有當前正在運行的流渲染器信息,包括clientuid、sessionid、renderinfo、renderstate和輸出設備詳細信息。
    std::vector< std::unique_ptr< AudioRendererChangeInfo >> audioRendererChangeInfos;
    int32_t currentRendererChangeInfo = audioStreamMgr- >GetCurrentRendererChangeInfos(audioRendererChangeInfos);
    
  5. 使用 GetCurrentCapturerChangeInfos 獲取所有當前正在運行的流捕獲器信息,包括clientuid、sessionid、capturerInfo、capturerState和輸入設備詳細信息。
    std::vector< std::unique_ptr< AudioCapturerChangeInfo >> audioCapturerChangeInfos;
    int32_t currentCapturerChangeInfo = audioStreamMgr- >GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
    
  6. 使用 IsAudioRendererLowLatencySupported 檢查低延遲功能是否支持。
    const AudioStreamInfo &audioStreamInfo;
    bool isLatencySupport = audioStreamMgr- >IsAudioRendererLowLatencySupported(audioStreamInfo);
    
  7. 使用 GetEffectInfoArray 接口查詢指定[ StreamUsage ]下可以支持的音效模式。
    AudioSceneEffectInfo audioSceneEffectInfo;
    int32_t status = audioStreamMgr- >GetEffectInfoArray(audioSceneEffectInfo,streamUsage);
    

JavaScript 用法:

JavaScript應用可以使用系統提供的音頻管理接口,來控制音量和設備。
請參考 [ js-apis-audio.md ]來獲取音量和設備管理相關JavaScript接口的用法。

藍牙SCO呼叫

可以使用提供的接口 [ audio_bluetooth_manager.h ] 實現同步連接導向鏈路(SCO)的藍牙呼叫。

  1. 為監聽SCO狀態更改,您可以使用 OnScoStateChanged .
const BluetoothRemoteDevice &device;
int state;
void OnScoStateChanged(const BluetoothRemoteDevice &device, int state);
  1. (可選) 靜態接口 RegisterBluetoothScoAgListener (), UnregisterBluetoothScoAgListener (), 可用于注冊藍牙SCO的偵聽器。

支持設備

以下是音頻子系統支持的設備類型列表。

  1. USB Type-C Headset
    數字耳機,包括自己的DAC數模轉換器)和作為耳機一部分的放大器

  2. WIRED Headset
    模擬耳機內部不包含任何DAC。它可以有3.5mm插孔或不帶DAC的C型插孔。

  3. Bluetooth Headset
    藍牙A2DP(高級音頻分配模式)耳機,用于無線傳輸音頻。

  4. Internal Speaker and MIC
    支持內置揚聲器和麥克風,并將分別用作播放和錄制的默認設備。

    審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 音頻
    +關注

    關注

    29

    文章

    3022

    瀏覽量

    83040
  • 模擬信號
    +關注

    關注

    8

    文章

    1158

    瀏覽量

    53280
  • 鴻蒙
    +關注

    關注

    59

    文章

    2508

    瀏覽量

    43772
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    鴻蒙5開發案例分享揭秘---一多開發實例(商務辦公)

    ?【鴻蒙開發寶藏案例大揭秘】原來官方文檔里藏了這么多好東西! 大家好呀~最近在肝鴻蒙項目時意外扒出了官方文檔里的\"藏寶庫\"!原來那些讓人頭禿的跨端適配難題,官方早就準備好
    發表于 06-03 16:24

    鴻蒙5開發寶藏案例分享---一多開發實例(即時通訊)

    ?鴻蒙\"一多\"開發寶藏指南:原來官方案例還能這么玩!? 大家好呀!我是剛在鴻蒙開發路上踩完坑的某不知名碼農,今天要給大家分享一個重大發現——原來HarmonyOS官方早就給我
    發表于 06-03 16:01

    鴻蒙5開發寶藏案例分享---一多分欄開發實踐

    ?【HarmonyOS開發者的寶藏指南】一次搞定多設備分欄布局,原來還能這么玩! 大家好呀!今天在鴻蒙社區挖到一個超實用的大寶藏——原來官方早就藏了一堆分欄布局的實戰案例!作為被多端適配折磨
    發表于 06-03 12:03

    2025開源鴻蒙開發者大會圓滿落幕

    近日,開源鴻蒙開發者大會2025(OHDC.2025,簡稱“大會”)在深圳隆重開幕。大會正式發布了開源鴻蒙5.1 Release版本,舉行了開源鴻蒙應用技術
    的頭像 發表于 05-26 17:03 ?307次閱讀

    開源啦!!!基于鴻蒙ArkTS封裝的圖表組件《McCharts》,大家快來一起共創

    的地方請大家高抬貴手,寬容一下,謝謝。 這次主要是給大家帶來一個重磅消息,就是我自己使用鴻蒙ArkTS語法開發的圖表組件今日正式開源了。為什么?原因有兩點吧! 鴻蒙是國產的操作系統,
    發表于 03-15 15:21

    名單公布!【書籍評測活動NO.56】極速探索HarmonyOS NEXT:純血鴻蒙應用開發實踐

    開發的核心技術,以及鴻蒙應用在實際開發中的應用方法。 本書共分為四篇,共計16章,分別為鴻蒙開發基礎篇、
    發表于 01-20 16:53

    LwIP應用開發實戰指南—基于野火STM32

    LwIP應用開發實戰指南—基于野火STM32—20210122
    發表于 01-17 14:34 ?8次下載

    AIGC入門及鴻蒙入門

    JDK、配置SDK等。 3. 開發實踐: 學習鴻蒙系統的架構和API,了解其組件化、分布式等特性。 通過官方文檔和社區資源,學習和掌握鴻蒙應用的開發
    發表于 01-13 10:32

    鴻蒙Flutter實戰:14-現有Flutter 項目支持鴻蒙 II

    分別安裝官方的3.22版本,以及鴻蒙社區的 3.22.0 版本 3.搭建 Flutter鴻蒙開發環境 參考文章《鴻蒙Flutter實戰:0
    發表于 12-26 14:59

    鴻蒙原生開發手記:01-元服務開發

    簡介 元服務是鴻蒙中的一種輕量應用形態,無需下載,直接運行。類似于微信小程序,但與小程序不同的是,元服務更加輕量。 元服務使用原生開發,是系統級提供的,無論從易用性、性能、體驗上,都要比小程序好
    發表于 11-14 17:28

    鴻蒙Flutter實戰:11-使用 Flutter SDK 3.22.0

    # 使用 Flutter SDK 3.22.0 ## SDK 安裝 參考[鴻蒙Flutter實戰:01-搭建開發環境]文章的說明,首先安裝 Flutter SDK 3.22.0。 目前
    發表于 11-01 15:03

    鴻蒙Flutter實戰:09-現有Flutter項目支持鴻蒙

    # 鴻蒙Flutter實戰:現有Flutter項目支持鴻蒙 ## 背景 原來使用Flutter開發的項目,需要適配鴻蒙。 ## 環境搭
    發表于 10-23 16:36

    鴻蒙Flutter實戰:08-如何調試代碼

    # 鴻蒙Flutter實戰:如何調試代碼 ## 1.環境搭建 參考文章[鴻蒙Flutter實戰:01-搭建開發環境](https://g
    發表于 10-23 16:29

    鴻蒙Flutter實戰:07混合開發

    # 鴻蒙Flutter實戰:混合開發 鴻蒙Flutter混合開發主要有兩種形式。 ## 1.基于har 將flutter module
    發表于 10-23 16:00

    鴻蒙Flutter實戰:05-使用第三方插件

    # 鴻蒙Flutter 實戰:使用第三方插件 在鴻蒙Flutter開發中,如果涉及到使用原生功能,就要使用插件。使用插件有兩種方式,一種是自己編寫原生ArkTS代碼,在Dart側調用
    發表于 10-22 21:54