在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony 3.2 Beta Audio:音頻渲染

電子發(fā)燒友開(kāi)源社區(qū) ? 來(lái)源:未知 ? 2023-03-11 14:15 ? 次閱讀

一、簡(jiǎn)介

Audio是多媒體子系統(tǒng)中的一個(gè)重要模塊,其涉及的內(nèi)容比較多,有音頻的渲染、音頻的采集、音頻的策略管理等。本文主要針對(duì)音頻渲染功能進(jìn)行詳細(xì)地分析,并通過(guò)源碼中提供的例子,對(duì)音頻渲染進(jìn)行流程的梳理。

二、目錄

foundation/multimedia/audio_framework

audio_framework
├── frameworks
│  ├── js             #js 接口
│  │  └── napi
│  │    └── audio_renderer   #audio_renderer NAPI接口
│  │      ├── include
│  │      │  ├── audio_renderer_callback_napi.h
│  │      │  ├── renderer_data_request_callback_napi.h
│  │      │  ├── renderer_period_position_callback_napi.h
│  │      │  └── renderer_position_callback_napi.h
│  │      └── src
│  │        ├── audio_renderer_callback_napi.cpp
│  │        ├── audio_renderer_napi.cpp
│  │        ├── renderer_data_request_callback_napi.cpp
│  │        ├── renderer_period_position_callback_napi.cpp
│  │        └── renderer_position_callback_napi.cpp
│  └── native           #native 接口
│    └── audiorenderer
│      ├── BUILD.gn
│      ├── include
│      │  ├── audio_renderer_private.h
│      │  └── audio_renderer_proxy_obj.h
│      ├── src
│      │  ├── audio_renderer.cpp
│      │  └── audio_renderer_proxy_obj.cpp
│      └── test
│        └── example
│          └── audio_renderer_test.cpp
├── interfaces
│  ├── inner_api          #native實(shí)現(xiàn)的接口
│  │  └── native
│  │    └── audiorenderer    #audio渲染本地實(shí)現(xiàn)的接口定義
│  │      └── include
│  │        └── audio_renderer.h
│  └── kits            #js調(diào)用的接口
│    └── js
│      └── audio_renderer   #audio渲染NAPI接口的定義
│        └── include
│          └── audio_renderer_napi.h
└── services            #服務(wù)端
  └── audio_service
    ├── BUILD.gn
    ├── client         #IPC調(diào)用中的proxy端
    │  ├── include
    │  │  ├── audio_manager_proxy.h
    │  │  ├── audio_service_client.h
    │  └── src
    │    ├── audio_manager_proxy.cpp
    │    ├── audio_service_client.cpp
    └── server         #IPC調(diào)用中的server端
      ├── include
      │  └── audio_server.h
      └── src
        ├── audio_manager_stub.cpp
        └── audio_server.cpp

(左右移動(dòng)查看全部?jī)?nèi)容)

三、音頻渲染總體流程

8946c0e8-bfd2-11ed-bfe3-dac502259ad0.png

四、Native接口使用

在OpenAtom OpenHarmony(以下簡(jiǎn)稱“OpenHarmony”)系統(tǒng)中,音頻模塊提供了功能測(cè)試代碼,本文選取了其中的音頻渲染例子作為切入點(diǎn)來(lái)進(jìn)行介紹,例子采用的是對(duì)wav格式的音頻文件進(jìn)行渲染。wav格式的音頻文件是wav頭文件和音頻的原始數(shù)據(jù),不需要進(jìn)行數(shù)據(jù)解碼,所以音頻渲染直接對(duì)原始數(shù)據(jù)進(jìn)行操作,文件路徑為:foundation/multimedia/audio_framework/frameworks/native/audiorenderer/test/example/audio_renderer_test.cpp

bool TestPlayback(int argc, char *argv[]) const
{
    FILE* wavFile = fopen(path, "rb");
    //讀取wav文件頭信息
    size_t bytesRead = fread(&wavHeader, 1, headerSize, wavFile);


    //設(shè)置AudioRenderer參數(shù)
    AudioRendererOptions rendererOptions = {};
    rendererOptions.streamInfo.encoding = AudioEncodingType::ENCODING_PCM;
    rendererOptions.streamInfo.samplingRate = static_cast(wavHeader.SamplesPerSec);
    rendererOptions.streamInfo.format = GetSampleFormat(wavHeader.bitsPerSample);
    rendererOptions.streamInfo.channels = static_cast(wavHeader.NumOfChan);
    rendererOptions.rendererInfo.contentType = contentType;
    rendererOptions.rendererInfo.streamUsage = streamUsage;
    rendererOptions.rendererInfo.rendererFlags = 0;


    //創(chuàng)建AudioRender實(shí)例
    unique_ptr audioRenderer = AudioRenderer::Create(rendererOptions);


    shared_ptr cb1 = make_shared();
    //設(shè)置音頻渲染回調(diào)
    ret = audioRenderer->SetRendererCallback(cb1);


    //InitRender方法主要調(diào)用了audioRenderer實(shí)例的Start方法,啟動(dòng)音頻渲染
if(!InitRender(audioRenderer)) {
AUDIO_ERR_LOG("AudioRendererTest: Init render failed");
fclose(wavFile);
      return false;
}


    //StartRender方法主要是讀取wavFile文件的數(shù)據(jù),然后通過(guò)調(diào)用audioRenderer實(shí)例的Write方法進(jìn)行播放
if(!StartRender(audioRenderer, wavFile)) {
AUDIO_ERR_LOG("AudioRendererTest: Start render failed");
fclose(wavFile);
      return false;
}


    //停止渲染
if(!audioRenderer->Stop()) {
AUDIO_ERR_LOG("AudioRendererTest: Stop failed");
}


    //釋放渲染
if(!audioRenderer->Release()) {
AUDIO_ERR_LOG("AudioRendererTest: Release failed");
}


    //關(guān)閉wavFile
fclose(wavFile);
    return true;
}

(左右移動(dòng)查看全部?jī)?nèi)容)

首先讀取wav文件,通過(guò)讀取到wav文件的頭信息對(duì)AudioRendererOptions相關(guān)的參數(shù)進(jìn)行設(shè)置,包括編碼格式、采樣率、采樣格式、通道數(shù)等。根據(jù)AudioRendererOptions設(shè)置的參數(shù)來(lái)創(chuàng)建AudioRenderer實(shí)例(實(shí)際上是AudioRendererPrivate),后續(xù)的音頻渲染主要是通過(guò)AudioRenderer實(shí)例進(jìn)行。創(chuàng)建完成后,調(diào)用AudioRenderer的Start方法,啟動(dòng)音頻渲染。啟動(dòng)后,通過(guò)AudioRenderer實(shí)例的Write方法,將數(shù)據(jù)寫(xiě)入,音頻數(shù)據(jù)會(huì)被播放。

五、調(diào)用流程

895ca62e-bfd2-11ed-bfe3-dac502259ad0.png

1、創(chuàng)建AudioRenderer

std::unique_ptrAudioRenderer::Create(const std::string cachePath,
  const AudioRendererOptions &rendererOptions, const AppInfo &appInfo)
{
  ContentType contentType = rendererOptions.rendererInfo.contentType;


  StreamUsage streamUsage = rendererOptions.rendererInfo.streamUsage;


  AudioStreamType audioStreamType = AudioStream::GetStreamType(contentType, streamUsage);
  auto audioRenderer = std::make_unique(audioStreamType, appInfo);
  if (!cachePath.empty()) {
    AUDIO_DEBUG_LOG("Set application cache path");
    audioRenderer->SetApplicationCachePath(cachePath);
  }


  audioRenderer->rendererInfo_.contentType = contentType;
  audioRenderer->rendererInfo_.streamUsage = streamUsage;
  audioRenderer->rendererInfo_.rendererFlags = rendererOptions.rendererInfo.rendererFlags;


  AudioRendererParams params;
  params.sampleFormat = rendererOptions.streamInfo.format;
  params.sampleRate = rendererOptions.streamInfo.samplingRate;
  params.channelCount = rendererOptions.streamInfo.channels;
  params.encodingType = rendererOptions.streamInfo.encoding;


  if (audioRenderer->SetParams(params) != SUCCESS) {
    AUDIO_ERR_LOG("SetParams failed in renderer");
    audioRenderer = nullptr;
    return nullptr;
  }


  return audioRenderer;
}

(左右移動(dòng)查看全部?jī)?nèi)容)

首先通過(guò)AudioStream的GetStreamType方法獲取音頻流的類型,根據(jù)音頻流類型創(chuàng)建AudioRendererPrivate對(duì)象,AudioRendererPrivate是AudioRenderer的子類。緊接著對(duì)audioRenderer進(jìn)行參數(shù)設(shè)置,其中包括采樣格式、采樣率、通道數(shù)、編碼格式。設(shè)置完成后返回創(chuàng)建的AudioRendererPrivate實(shí)例。

2、設(shè)置回調(diào)

int32_t AudioRendererPrivate::SetRendererCallback(const std::shared_ptr &callback)
{
  RendererState state = GetStatus();
  if (state == RENDERER_NEW || state == RENDERER_RELEASED) {
    return ERR_ILLEGAL_STATE;
  }
  if (callback == nullptr) {
    return ERR_INVALID_PARAM;
  }


  // Save reference for interrupt callback
  if (audioInterruptCallback_ == nullptr) {
    return ERROR;
  }
  std::shared_ptr cbInterrupt =
    std::static_pointer_cast(audioInterruptCallback_);
  cbInterrupt->SaveCallback(callback);


  // Save and Set reference for stream callback. Order is important here.
  if (audioStreamCallback_ == nullptr) {
    audioStreamCallback_ = std::make_shared();
    if (audioStreamCallback_ == nullptr) {
      return ERROR;
    }
  }
  std::shared_ptr cbStream =
std::static_pointer_cast(audioStreamCallback_);
  cbStream->SaveCallback(callback);
  (void)audioStream_->SetStreamCallback(audioStreamCallback_);


  return SUCCESS;
}

(左右移動(dòng)查看全部?jī)?nèi)容)

參數(shù)傳入的回調(diào)主要涉及到兩個(gè)方面:一方面是AudioInterruptCallbackImpl中設(shè)置了我們傳入的渲染回調(diào),另一方面是AudioStreamCallbackRenderer中也設(shè)置了渲染回調(diào)。

3、啟動(dòng)渲染

bool AudioRendererPrivate::Start(StateChangeCmdType cmdType) const
{
  AUDIO_INFO_LOG("AudioRenderer::Start");
  RendererState state = GetStatus();


  AudioInterrupt audioInterrupt;
  switch (mode_) {
    case InterruptMode:
      audioInterrupt = sharedInterrupt_;
      break;
    case InterruptMode:
      audioInterrupt = audioInterrupt_;
      break;
    default:
      break;
  }
  AUDIO_INFO_LOG("AudioRenderer: %{public}d, streamType: %{public}d, sessionID: %{public}d",
    mode_, audioInterrupt.streamType, audioInterrupt.sessionID);


  if (audioInterrupt.streamType == STREAM_DEFAULT || audioInterrupt.sessionID == INVALID_SESSION_ID) {
    return false;
  }


  int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt);
  if (ret != 0) {
    AUDIO_ERR_LOG("AudioRendererPrivate::ActivateAudioInterrupt Failed");
    return false;
  }


  return audioStream_->StartAudioStream(cmdType);
}

(左右移動(dòng)查看全部?jī)?nèi)容)

AudioPolicyManager::GetInstance().ActivateAudioInterrupt這個(gè)操作主要是根據(jù)AudioInterrupt來(lái)進(jìn)行音頻中斷的激活,這里涉及了音頻策略相關(guān)的內(nèi)容,后續(xù)會(huì)專門出關(guān)于音頻策略的文章進(jìn)行分析。這個(gè)方法的核心是通過(guò)調(diào)用AudioStream的StartAudioStream方法來(lái)啟動(dòng)音頻流。

bool AudioStream::StartAudioStream(StateChangeCmdType cmdType)
{
  int32_t ret = StartStream(cmdType);


  resetTime_ = true;
  int32_t retCode = clock_gettime(CLOCK_MONOTONIC, &baseTimestamp_);


  if (renderMode_ == RENDER_MODE_CALLBACK) {
    isReadyToWrite_ = true;
    writeThread_ = std::make_unique<std::thread>(&AudioStream::WriteCbTheadLoop, this);
  } else if (captureMode_ == CAPTURE_MODE_CALLBACK) {
    isReadyToRead_ = true;
    readThread_ = std::make_unique<std::thread>(&AudioStream::ReadCbThreadLoop, this);
  }


  isFirstRead_ = true;
  isFirstWrite_ = true;
  state_ = RUNNING;
  AUDIO_INFO_LOG("StartAudioStream SUCCESS");


  if (audioStreamTracker_) {
    AUDIO_DEBUG_LOG("AudioStream:Calling Update tracker for Running");
    audioStreamTracker_->UpdateTracker(sessionId_, state_, rendererInfo_, capturerInfo_);
  }
  return true;
}

(左右移動(dòng)查看全部?jī)?nèi)容)

AudioStream的StartAudioStream主要的工作是調(diào)用StartStream方法,StartStream方法是AudioServiceClient類中的方法。AudioServiceClient類是AudioStream的父類。接下來(lái)看一下AudioServiceClient的StartStream方法。

int32_t AudioServiceClient::StartStream(StateChangeCmdType cmdType)
{
  int error;
  lock_guardlockdata(dataMutex);
  pa_operation *operation = nullptr;


  pa_threaded_mainloop_lock(mainLoop);


  pa_stream_state_t state = pa_stream_get_state(paStream);


  streamCmdStatus = 0;
  stateChangeCmdType_ = cmdType;
  operation = pa_stream_cork(paStream, 0, PAStreamStartSuccessCb, (void *)this);


  while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) {
    pa_threaded_mainloop_wait(mainLoop);
  }
  pa_operation_unref(operation);
  pa_threaded_mainloop_unlock(mainLoop);


  if (!streamCmdStatus) {
    AUDIO_ERR_LOG("Stream Start Failed");
    ResetPAAudioClient();
    return AUDIO_CLIENT_START_STREAM_ERR;
  } else {
    AUDIO_INFO_LOG("Stream Started Successfully");
    return AUDIO_CLIENT_SUCCESS;
  }
}

(左右移動(dòng)查看全部?jī)?nèi)容)

StartStream方法中主要是調(diào)用了pulseaudio庫(kù)的pa_stream_cork方法進(jìn)行流啟動(dòng),后續(xù)就調(diào)用到了pulseaudio庫(kù)中了。pulseaudio庫(kù)我們暫且不分析。

4、寫(xiě)入數(shù)據(jù)

int32_t AudioRendererPrivate::Write(uint8_t *buffer, size_t bufferSize)
{
  return audioStream_->Write(buffer, bufferSize);
}

(左右移動(dòng)查看全部?jī)?nèi)容)

通過(guò)調(diào)用AudioStream的Write方式實(shí)現(xiàn)功能,接下來(lái)看一下AudioStream的Write方法。

size_t AudioStream::Write(uint8_t *buffer, size_t buffer_size)
{
  int32_t writeError;
  StreamBuffer stream;
  stream.buffer = buffer;
  stream.bufferLen = buffer_size;
  isWriteInProgress_ = true;


  if (isFirstWrite_) {
    if (RenderPrebuf(stream.bufferLen)) {
      return ERR_WRITE_FAILED;
    }
    isFirstWrite_ = false;
  }


  size_t bytesWritten = WriteStream(stream, writeError);
  isWriteInProgress_ = false;
  if (writeError != 0) {
    AUDIO_ERR_LOG("WriteStream fail,writeError:%{public}d", writeError);
    return ERR_WRITE_FAILED;
  }
  return bytesWritten;
}

(左右移動(dòng)查看全部?jī)?nèi)容)

Write方法中分成兩個(gè)階段,首次寫(xiě)數(shù)據(jù),先調(diào)用RenderPrebuf方法,將preBuf_的數(shù)據(jù)寫(xiě)入后再調(diào)用WriteStream進(jìn)行音頻數(shù)據(jù)的寫(xiě)入。

size_t AudioServiceClient::WriteStream(const StreamBuffer &stream, int32_t &pError)
{


  size_t cachedLen = WriteToAudioCache(stream);
  if (!acache.isFull) {
    pError = error;
    return cachedLen;
  }


  pa_threaded_mainloop_lock(mainLoop);




  const uint8_t *buffer = acache.buffer.get();
  size_t length = acache.totalCacheSize;


  error = PaWriteStream(buffer, length);
  acache.readIndex += acache.totalCacheSize;
  acache.isFull = false;


  if (!error && (length >= 0) && !acache.isFull) {
    uint8_t *cacheBuffer = acache.buffer.get();
    uint32_t offset = acache.readIndex;
    uint32_t size = (acache.writeIndex - acache.readIndex);
    if (size > 0) {
      if (memcpy_s(cacheBuffer, acache.totalCacheSize, cacheBuffer + offset, size)) {
        AUDIO_ERR_LOG("Update cache failed");
        pa_threaded_mainloop_unlock(mainLoop);
        pError = AUDIO_CLIENT_WRITE_STREAM_ERR;
        return cachedLen;
      }
      AUDIO_INFO_LOG("rearranging the audio cache");
    }
    acache.readIndex = 0;
    acache.writeIndex = 0;


    if (cachedLen < stream.bufferLen) {
      StreamBuffer str;
      str.buffer = stream.buffer + cachedLen;
      str.bufferLen = stream.bufferLen - cachedLen;
      AUDIO_DEBUG_LOG("writing pending data to audio cache: %{public}d", str.bufferLen);
      cachedLen += WriteToAudioCache(str);
    }
  }


  pa_threaded_mainloop_unlock(mainLoop);
  pError = error;
  return cachedLen;
}

(左右移動(dòng)查看全部?jī)?nèi)容)

WriteStream方法不是直接調(diào)用pulseaudio庫(kù)的寫(xiě)入方法,而是通過(guò)WriteToAudioCache方法將數(shù)據(jù)寫(xiě)入緩存中,如果緩存沒(méi)有寫(xiě)滿則直接返回,不會(huì)進(jìn)入下面的流程,只有當(dāng)緩存寫(xiě)滿后,才會(huì)調(diào)用下面的PaWriteStream方法。該方法涉及對(duì)pulseaudio庫(kù)寫(xiě)入操作的調(diào)用,所以緩存的目的是避免對(duì)pulseaudio庫(kù)頻繁地做IO操作,提高了效率。

六、總結(jié)

本文主要對(duì)OpenHarmony 3.2 Beta多媒體子系統(tǒng)的音頻渲染模塊進(jìn)行介紹,首先梳理了Audio Render的整體流程,然后對(duì)幾個(gè)核心的方法進(jìn)行代碼的分析。整體的流程主要通過(guò)pulseaudio庫(kù)啟動(dòng)流,然后通過(guò)pulseaudio庫(kù)的pa_stream_write方法進(jìn)行數(shù)據(jù)的寫(xiě)入,最后播放出音頻數(shù)據(jù)。

音頻渲染主要分為以下幾個(gè)層次:

  1. AudioRenderer的創(chuàng)建,實(shí)際創(chuàng)建的是它的子類AudioRendererPrivate實(shí)例。

  2. 通過(guò)AudioRendererPrivate設(shè)置渲染的回調(diào)。

  3. 啟動(dòng)渲染,這一部分代碼最終會(huì)調(diào)用到pulseaudio庫(kù)中,相當(dāng)于啟動(dòng)了pulseaudio的流。

  4. 通過(guò)pulseaudio庫(kù)的pa_stream_write方法將數(shù)據(jù)寫(xiě)入設(shè)備,進(jìn)行播放。


更多熱點(diǎn)文章閱讀
  • OS內(nèi)核及視窗分論壇詳解之OpenHarmony 3D顯示支持
  • 應(yīng)用模型開(kāi)發(fā)指南上新介紹
  • 技術(shù)構(gòu)筑萬(wàn)物智聯(lián),第一屆OpenHarmony技術(shù)峰會(huì)圓滿舉行
  • OpenHarmony L1(3.0)串口功能開(kāi)發(fā)
  • 小白指南:手把手教你用低代碼開(kāi)發(fā)一個(gè)應(yīng)用頁(yè)面

提示:本文由電子發(fā)燒友論壇發(fā)布,轉(zhuǎn)載請(qǐng)注明來(lái)源。如需社區(qū)合作及入群交流,請(qǐng)?zhí)砑游⑿臙EFans0806,或者發(fā)郵箱liuyong@huaqiu.com。


原文標(biāo)題:OpenHarmony 3.2 Beta Audio:音頻渲染

文章出處:【微信公眾號(hào):電子發(fā)燒友開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:OpenHarmony 3.2 Beta Audio:音頻渲染

文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    藍(lán)牙LE Audio技術(shù)簡(jiǎn)介和優(yōu)勢(shì)分析

    藍(lán)牙LE Audio,也稱為低功耗音頻(Bluetooth Low Energy Audio),是藍(lán)牙技術(shù)家族中的最新成員,專門為音頻傳輸而設(shè)計(jì)。它繼承了藍(lán)牙低功耗(Bluetooth
    的頭像 發(fā)表于 05-21 16:08 ?239次閱讀

    CPU渲染、GPU渲染、XPU渲染詳細(xì)對(duì)比:哪個(gè)渲染最快,哪個(gè)效果最好?

    動(dòng)畫(huà)渲染動(dòng)畫(huà)3D渲染技術(shù)需要應(yīng)對(duì)復(fù)雜的計(jì)算任務(wù)和精細(xì)的圖像處理,作為渲染技術(shù)人員,選擇合適的渲染模式,會(huì)直接影響制作效率和成品質(zhì)量。在主流的渲染
    的頭像 發(fā)表于 04-15 09:28 ?283次閱讀
    CPU<b class='flag-5'>渲染</b>、GPU<b class='flag-5'>渲染</b>、XPU<b class='flag-5'>渲染</b>詳細(xì)對(duì)比:哪個(gè)<b class='flag-5'>渲染</b>最快,哪個(gè)效果最好?

    STM32如何移植Audio框架?

    最近在學(xué)習(xí)音頻解碼,想用一下Audio框架。 1、這個(gè)該如何移植到自己創(chuàng)建的BSP并對(duì)接到device框架中?看了官方移植文檔沒(méi)有對(duì)沒(méi)有對(duì)該部分的描述。 2、我只想實(shí)現(xiàn)一個(gè)簡(jiǎn)單的播放功能,只用一個(gè)DAC芯片(比如CS4344)是否就能達(dá)到我的需求?
    發(fā)表于 04-01 08:08

    PCB設(shè)計(jì)丨AUDIO音頻接口

    音頻接口(audio interface)是連接麥克風(fēng)、其他聲源和計(jì)算機(jī)的設(shè)備,它可以在模擬信號(hào)和數(shù)字信號(hào)之間起到橋梁連接的作用。主要作用是將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),并將其傳輸?shù)接?jì)算機(jī)中進(jìn)行處理
    發(fā)表于 03-19 14:31

    PCB設(shè)計(jì)丨AUDIO音頻接口

    音頻接口(audio interface)是連接麥克風(fēng)、其他聲源和計(jì)算機(jī)的設(shè)備,它可以在模擬信號(hào)和數(shù)字信號(hào)之間起到橋梁連接的作用。主要作用是將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),并將其傳輸?shù)接?jì)算機(jī)中進(jìn)行處理
    的頭像 發(fā)表于 03-19 14:30 ?2174次閱讀
    PCB設(shè)計(jì)丨<b class='flag-5'>AUDIO</b><b class='flag-5'>音頻</b>接口

    LE Audio Combo模組智能座艙的應(yīng)用

    ,憑借其先進(jìn)的LE Audio技術(shù)和經(jīng)典藍(lán)牙支持,為智能座艙提供了卓越的解決方案,滿足了用戶在音質(zhì)、連接穩(wěn)定性上的高標(biāo)準(zhǔn)需求。 LE AudioCombo模組:引領(lǐng)智能座艙音頻體驗(yàn)的未來(lái) 藍(lán)牙技術(shù)的每次迭代都帶來(lái)了巨大的性能提升,而藍(lán)牙5.2版本中引入的LE
    的頭像 發(fā)表于 03-07 14:02 ?360次閱讀

    【北京迅為】itop-3568 開(kāi)發(fā)板openharmony鴻蒙燒寫(xiě)及測(cè)試-第2章OpenHarmony v3.2-Beta4版本測(cè)試

    【北京迅為】itop-3568 開(kāi)發(fā)板openharmony鴻蒙燒寫(xiě)及測(cè)試-第2章OpenHarmony v3.2-Beta4版本測(cè)試
    的頭像 發(fā)表于 03-05 10:53 ?355次閱讀
    【北京迅為】itop-3568 開(kāi)發(fā)板<b class='flag-5'>openharmony</b>鴻蒙燒寫(xiě)及測(cè)試-第2章<b class='flag-5'>OpenHarmony</b> v<b class='flag-5'>3.2-Beta</b>4版本測(cè)試

    大聯(lián)大品佳集團(tuán)推出基于達(dá)發(fā)科技(Airoha)產(chǎn)品的LE Audio耳機(jī)方案

    的LE Audio耳機(jī)方案的展示板圖 LE Audio(低功耗音頻)技術(shù)標(biāo)準(zhǔn)的誕生為業(yè)內(nèi)帶來(lái)低復(fù)雜性通信編解碼器(LC3)、多重串流音頻、助聽(tīng)器功能擴(kuò)展和廣播
    的頭像 發(fā)表于 02-22 11:06 ?574次閱讀
    大聯(lián)大品佳集團(tuán)推出基于達(dá)發(fā)科技(Airoha)產(chǎn)品的LE <b class='flag-5'>Audio</b>耳機(jī)方案

    e絡(luò)盟大幅擴(kuò)充PUI Audio產(chǎn)品系列以強(qiáng)化音頻產(chǎn)品組合

    安富利旗下全球電子元器件產(chǎn)品與解決方案分銷商e絡(luò)盟大幅擴(kuò)充了 PUI Audio產(chǎn)品種類。作為音頻、觸覺(jué)反饋及傳感器解決方案領(lǐng)域的全球創(chuàng)新者和供應(yīng)商,PUI Audio產(chǎn)品的加入進(jìn)一步豐富e絡(luò)盟的產(chǎn)品組合。新擴(kuò)展的產(chǎn)品線使客戶能
    的頭像 發(fā)表于 02-18 16:29 ?453次閱讀
    e絡(luò)盟大幅擴(kuò)充PUI <b class='flag-5'>Audio</b>產(chǎn)品系列以強(qiáng)化<b class='flag-5'>音頻</b>產(chǎn)品組合

    請(qǐng)問(wèn)cc3200 audio boosterpack音頻采集是不是底噪很大?

    基于TLV320AIC3254的音頻開(kāi)發(fā)辦,我燒入wifi_audio_app例程(例程中關(guān)掉板載咪頭輸入,并將音量調(diào)到最大),另兩入輸入接口沒(méi)有接音頻信號(hào),但是板子一直吱吱吱的響,是板子本身底噪就這么大嗎?
    發(fā)表于 10-25 06:28

    TPS6595 Audio Codec輸出音頻偶發(fā)混入7Khz雜波是怎么回事?

    主芯片是DM3730, 音頻使用的是TPS65950的Audio 外設(shè)。 DM3730使用MCBSP輸出8Khz音頻數(shù)據(jù),通過(guò)I2C設(shè)置 TPS65950相關(guān)寄存器。 采用Audio
    發(fā)表于 10-15 07:08

    Auracast廣播音頻創(chuàng)造全新音頻體驗(yàn)

    音頻(LE Audio)發(fā)布以來(lái),Auracast廣播音頻音頻市場(chǎng)持續(xù)發(fā)力,對(duì)音頻設(shè)備和相關(guān)產(chǎn)品產(chǎn)生了深遠(yuǎn)影響。
    的頭像 發(fā)表于 10-12 14:36 ?1133次閱讀

    【龍芯2K0300蜂鳥(niǎo)板試用】OpenHarmony代碼

    fetch origin OpenHarmony-3.2-Release:OpenHarmony-3.2-Release git switch OpenHarmony-3.2
    發(fā)表于 09-18 11:42

    LE Audio音頻技術(shù)助推影音、助聽(tīng)市場(chǎng),藍(lán)牙+助聽(tīng)芯片成為趨勢(shì)

    3.0版本支持高速數(shù)據(jù)傳輸和更低的功耗,藍(lán)牙4.0版本引入了低功耗模式(BLE),藍(lán)牙5.0版本提高了傳輸速度。再到藍(lán)牙5.2版本提出了LE Audio,增強(qiáng)了藍(lán)牙音頻體驗(yàn)。 進(jìn)入無(wú)損時(shí)代,LE Audio帶來(lái)低延遲、高音質(zhì)體驗(yàn)
    的頭像 發(fā)表于 07-08 07:41 ?3610次閱讀
    LE <b class='flag-5'>Audio</b><b class='flag-5'>音頻</b>技術(shù)助推影音、助聽(tīng)市場(chǎng),藍(lán)牙+助聽(tīng)芯片成為趨勢(shì)

    HarmonyOS NEXT Developer Beta1中的Kit

    管理服務(wù))、Network Kit(網(wǎng)絡(luò)服務(wù))等。 媒體相關(guān)Kit開(kāi)放能力:Audio Kit(音頻服務(wù))、Media Library Kit(媒體文件管理服務(wù))等。 圖形相關(guān)Kit開(kāi)放能力
    發(fā)表于 06-26 10:47
    主站蜘蛛池模板: 美国一级毛片片aa久久综合 | 午夜影院一区二区三区 | 香蕉视频网站在线播放 | 一级特级片 | 天天躁狠狠躁夜夜躁2021 | 黄网免费观看 | 久草福利在线播放 | 天天天干干干 | 六月婷婷网视频在线观看 | 久久va| 特级全黄一级毛片视频 | 欧美日韩一区二区不卡 | 俄罗斯欧美色黄激情 | 亚洲一区免费视频 | 天天干天天碰 | 国产美女在线观看 | 欧美中字 | 黄色免费网站视频 | 91久久麻豆 | 在线视频精品视频 | 色图综合网 | 免费看美女禁处爆涌视频 | 毛片毛片毛片毛片毛片毛片 | 中文字幕网资源站永久资源 | 黄色免费网站在线 | 天堂资源在线bt种子8 | 亚洲男人的天堂在线观看 | 欧美色图日韩 | 免费播放一区二区三区 | 精品国产免费观看久久久 | 69xxxxtube日本免费| 日本一区二区三区在线网 | 狠狠色狠狠色综合婷婷tag | 欧美亚洲第一区 | 日本高清在线3344www | 日本不卡免费新一区二区三区 | 男人的天堂黄色 | 手机看片日韩国产 | 两人性世界 | 四虎精品成人a在线观看 | 在线a网 |