中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

定陶網(wǎng)站建設(shè)怎么制作網(wǎng)頁(yè)

定陶網(wǎng)站建設(shè),怎么制作網(wǎng)頁(yè),江蘇純手工seo,免費(fèi)網(wǎng)站開(kāi)發(fā)軟件常用的音頻通話模式包括 VOIP 通話和蜂窩通話。 ● VOIP 通話:VOIP(Voice over Internet Protocol)通話是指基于互聯(lián)網(wǎng)協(xié)議(IP)進(jìn)行通訊的一種語(yǔ)音通話技術(shù)。VOIP 通話會(huì)將通話信息打包成數(shù)據(jù)包,通過(guò)網(wǎng)絡(luò)進(jìn)…

常用的音頻通話模式包括 VOIP 通話和蜂窩通話。

●?VOIP 通話:VOIP(Voice?over?Internet?Protocol)通話是指基于互聯(lián)網(wǎng)協(xié)議(IP)進(jìn)行通訊的一種語(yǔ)音通話技術(shù)。VOIP 通話會(huì)將通話信息打包成數(shù)據(jù)包,通過(guò)網(wǎng)絡(luò)進(jìn)行傳輸,因此 VOIP 通話對(duì)網(wǎng)絡(luò)要求較高,通話質(zhì)量與網(wǎng)絡(luò)連接速度緊密相關(guān)。

●?蜂窩通話(僅對(duì)系統(tǒng)應(yīng)用開(kāi)放)蜂窩通話是指?jìng)鹘y(tǒng)的電話功能,由運(yùn)營(yíng)商提供服務(wù),目前僅對(duì)系統(tǒng)應(yīng)用開(kāi)放,未向三方應(yīng)用提供開(kāi)發(fā)接口。

在開(kāi)發(fā)音頻通話相關(guān)功能時(shí),開(kāi)發(fā)者可以根據(jù)實(shí)際情況,檢查當(dāng)前的音頻場(chǎng)景模式和鈴聲模式,以使用相應(yīng)的音頻處理策略。

音頻場(chǎng)景模式

應(yīng)用使用音頻通話相關(guān)功能時(shí),系統(tǒng)會(huì)切換至與通話相關(guān)的音頻場(chǎng)景模式(AudioScene),當(dāng)前預(yù)置了多種音頻場(chǎng)景,包括響鈴、通話、語(yǔ)音聊天等,在不同的場(chǎng)景下,系統(tǒng)會(huì)采用不同的策略來(lái)處理音頻。

當(dāng)前預(yù)置的音頻場(chǎng)景:

●?AUDIO_SCENE_DEFAULT:默認(rèn)音頻場(chǎng)景,音頻通話之外的場(chǎng)景均可使用。

●?AUDIO_SCENE_VOICE_CHAT:語(yǔ)音聊天音頻場(chǎng)景,VOIP 通話時(shí)使用。

應(yīng)用可通過(guò)AudioManager的 getAudioScene 來(lái)獲取當(dāng)前的音頻場(chǎng)景模式。當(dāng)應(yīng)用開(kāi)始或結(jié)束使用音頻通話相關(guān)功能時(shí),可通過(guò)此方法檢查系統(tǒng)是否已切換為合適的音頻場(chǎng)景模式。

鈴聲模式

在用戶進(jìn)入到音頻通話時(shí),應(yīng)用可以使用鈴聲或振動(dòng)來(lái)提示用戶。系統(tǒng)通過(guò)調(diào)整鈴聲模式(AudioRingMode),實(shí)現(xiàn)便捷地管理鈴聲音量,并調(diào)整設(shè)備的振動(dòng)模式。

當(dāng)前預(yù)置的三種鈴聲模式:

●?RINGER_MODE_SILENT:靜音模式,此模式下鈴聲音量為零(即靜音)。

●?RINGER_MODE_VIBRATE:振動(dòng)模式,此模式下鈴聲音量為零,設(shè)備振動(dòng)開(kāi)啟(即響鈴時(shí)靜音,觸發(fā)振動(dòng))。

●?RINGER_MODE_NORMAL:響鈴模式,此模式下鈴聲音量正常。

應(yīng)用可以調(diào)用AudioVolumeGroupManager中的 getRingerMode 獲取當(dāng)前的鈴聲模式,以便采取合適的提示策略。

如果應(yīng)用希望及時(shí)獲取鈴聲模式的變化情況,可以通過(guò) AudioVolumeGroupManager 中的 on('ringerModeChange')監(jiān)聽(tīng)鈴聲模式變化事件,使應(yīng)用在鈴聲模式發(fā)生變化時(shí)及時(shí)收到通知,方便應(yīng)用做出相應(yīng)的調(diào)整。

通話場(chǎng)景音頻設(shè)備切換

在通話場(chǎng)景下,系統(tǒng)會(huì)根據(jù)默認(rèn)優(yōu)先級(jí)選擇合適的音頻設(shè)備。應(yīng)用可以根據(jù)需要,自主切換音頻設(shè)備。

通信設(shè)備類(lèi)型(CommunicationDeviceType)是系統(tǒng)預(yù)置的可用于通話場(chǎng)景的設(shè)備,應(yīng)用可以使用AudioRoutingManager的 isCommunicationDeviceActive 函數(shù)獲取指定通信設(shè)備的激活狀態(tài),并且可以使用 AudioRoutingManager 的 setCommunicationDevice 設(shè)置通信設(shè)備的激活狀態(tài),通過(guò)激活設(shè)備來(lái)實(shí)現(xiàn)通話場(chǎng)景音頻設(shè)備的切換。

在音頻通話場(chǎng)景下,音頻輸出(播放對(duì)端聲音)和音頻輸入(錄制本端聲音)會(huì)同時(shí)進(jìn)行,應(yīng)用可以通過(guò)使用 AudioRenderer 來(lái)實(shí)現(xiàn)音頻輸出,通過(guò)使用 AudioCapturer 來(lái)實(shí)現(xiàn)音頻輸入,同時(shí)使用 AudioRenderer 和 AudioCapturer 即可實(shí)現(xiàn)音頻通話功能。

開(kāi)發(fā)音視頻通話功能

在音頻通話開(kāi)始和結(jié)束時(shí),應(yīng)用可以自行檢查當(dāng)前的音頻場(chǎng)景模式和鈴聲模式,以便采取合適的音頻管理及提示策略。

以下代碼示范了同時(shí)使用 AudioRenderer 和 AudioCapturer 實(shí)現(xiàn)音頻通話功能的基本過(guò)程,其中未包含音頻通話數(shù)據(jù)的傳輸過(guò)程,實(shí)際開(kāi)發(fā)中,需要將網(wǎng)絡(luò)傳輸來(lái)的對(duì)端通話數(shù)據(jù)解碼播放,此處僅以讀取音頻文件的數(shù)據(jù)代替;同時(shí)需要將本端錄制的通話數(shù)據(jù)編碼打包,通過(guò)網(wǎng)絡(luò)發(fā)送給對(duì)端,此處僅以將數(shù)據(jù)寫(xiě)入音頻文件代替。

使用 AudioRenderer 播放對(duì)端的通話聲音

該過(guò)程與使用AudioRenderer開(kāi)發(fā)音頻播放功能過(guò)程相似,關(guān)鍵區(qū)別在于 audioRenderInfo 參數(shù)和音頻數(shù)據(jù)來(lái)源。audioRenderInfo 參數(shù)中,音頻內(nèi)容類(lèi)型需設(shè)置為語(yǔ)音,CONTENT_TYPE_SPEECH,音頻流使用類(lèi)型需設(shè)置為語(yǔ)音通信,STREAM_USAGE_VOICE_COMMUNICATION。

import?audio?from '@ohos.multimedia.audio';import?fs?from '@ohos.file.fs';const TAG = 'VoiceCallDemoForAudioRenderer';//?與使用AudioRenderer開(kāi)發(fā)音頻播放功能過(guò)程相似,關(guān)鍵區(qū)別在于audioRendererInfo參數(shù)和音頻數(shù)據(jù)來(lái)源export default class VoiceCallDemoForAudioRenderer {  private?renderModel?= undefined;  private?audioStreamInfo?= {????samplingRate:?audio.AudioSamplingRate.SAMPLE_RATE_48000, //?采樣率????channels:?audio.AudioChannel.CHANNEL_2, //?通道????sampleFormat:?audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, //?采樣格式????encodingType:?audio.AudioEncodingType.ENCODING_TYPE_RAW //?編碼格式  }  private?audioRendererInfo?= {    //?需使用通話場(chǎng)景相應(yīng)的參數(shù)????content:?audio.ContentType.CONTENT_TYPE_SPEECH, //?音頻內(nèi)容類(lèi)型:語(yǔ)音????usage:?audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION, //?音頻流使用類(lèi)型:語(yǔ)音通信????rendererFlags: 0 //?音頻渲染器標(biāo)志:默認(rèn)為0即可  }  private?audioRendererOptions?= {????streamInfo: this.audioStreamInfo,????rendererInfo: this.audioRendererInfo  }  //?初始化,創(chuàng)建實(shí)例,設(shè)置監(jiān)聽(tīng)事件  init() {????audio.createAudioRenderer(this.audioRendererOptions, (err,?renderer) => { //?創(chuàng)建AudioRenderer實(shí)例      if (!err) {        console.info(`${TAG}:?creating?AudioRenderer?success`);        this.renderModel?=?renderer;        this.renderModel.on('stateChange', (state) => { //?設(shè)置監(jiān)聽(tīng)事件,當(dāng)轉(zhuǎn)換到指定的狀態(tài)時(shí)觸發(fā)回調(diào)          if (state?== 1) {            console.info('audio?renderer?state?is:?STATE_PREPARED');          }          if (state?== 2) {            console.info('audio?renderer?state?is:?STATE_RUNNING');          }        });        this.renderModel.on('markReach', 1000, (position) => { //?訂閱markReach事件,當(dāng)渲染的幀數(shù)達(dá)到1000幀時(shí)觸發(fā)回調(diào)          if (position?== 1000) {            console.info('ON?Triggered?successfully');          }        });      } else {        console.info(`${TAG}:?creating?AudioRenderer?failed,?error:?${err.message}`);      }    });  }  //?開(kāi)始一次音頻渲染  async start() {    let?stateGroup?= [audio.AudioState.STATE_PREPARED,?audio.AudioState.STATE_PAUSED,?audio.AudioState.STATE_STOPPED];    if (stateGroup.indexOf(this.renderModel.state) === -1) { //?當(dāng)且僅當(dāng)狀態(tài)為STATE_PREPARED、STATE_PAUSED和STATE_STOPPED之一時(shí)才能啟動(dòng)渲染      console.error(TAG + 'start?failed');      return;    }    await this.renderModel.start(); //?啟動(dòng)渲染    const?bufferSize?= await this.renderModel.getBufferSize();    //?此處僅以讀取音頻文件的數(shù)據(jù)舉例,實(shí)際音頻通話開(kāi)發(fā)中,需要讀取的是通話對(duì)端傳輸來(lái)的音頻數(shù)據(jù)    let?context?= getContext(this);    let?path?=?context.filesDir;    const?filePath?=?path?+ '/voice_call_data.wav'; //?沙箱路徑,實(shí)際路徑為/data/storage/el2/base/haps/entry/files/voice_call_data.wav    let?file?=?fs.openSync(filePath,?fs.OpenMode.READ_ONLY);    let?stat?= await?fs.stat(filePath);    let?buf?= new ArrayBuffer(bufferSize);    let?len?=?stat.size?%?bufferSize?=== 0 ??Math.floor(stat.size?/?bufferSize) :?Math.floor(stat.size?/?bufferSize?+ 1);    for (let?i?= 0;?i?<?len;?i++) {      let?options?= {????????offset:?i?*?bufferSize,????????length:?bufferSize      };      let?readsize?= await?fs.read(file.fd,?buf,?options);      //?buf是要寫(xiě)入緩沖區(qū)的音頻數(shù)據(jù),在調(diào)用AudioRenderer.write()方法前可以進(jìn)行音頻數(shù)據(jù)的預(yù)處理,實(shí)現(xiàn)個(gè)性化的音頻播放功能,AudioRenderer會(huì)讀出寫(xiě)入緩沖區(qū)的音頻數(shù)據(jù)進(jìn)行渲染      let?writeSize?= await new Promise((resolve,?reject) => {        this.renderModel.write(buf, (err,?writeSize) => {          if (err) {            reject(err);          } else {            resolve(writeSize);          }        });      });      if (this.renderModel.state?===?audio.AudioState.STATE_RELEASED) { //?如果渲染器狀態(tài)為STATE_RELEASED,停止渲染????????fs.close(file);        await this.renderModel.stop();      }      if (this.renderModel.state?===?audio.AudioState.STATE_RUNNING) {        if (i?===?len?- 1) { //?如果音頻文件已經(jīng)被讀取完,停止渲染??????????fs.close(file);          await this.renderModel.stop();        }      }    }  }  //?暫停渲染  async pause() {    //?只有渲染器狀態(tài)為STATE_RUNNING的時(shí)候才能暫停    if (this.renderModel.state?!==?audio.AudioState.STATE_RUNNING) {      console.info('Renderer?is?not?running');      return;    }    await this.renderModel.pause(); //?暫停渲染    if (this.renderModel.state?===?audio.AudioState.STATE_PAUSED) {      console.info('Renderer?is?paused.');    } else {      console.error('Pausing?renderer?failed.');    }  }  //?停止渲染  async stop() {    //?只有渲染器狀態(tài)為STATE_RUNNING或STATE_PAUSED的時(shí)候才可以停止    if (this.renderModel.state?!==?audio.AudioState.STATE_RUNNING && this.renderModel.state?!==?audio.AudioState.STATE_PAUSED) {      console.info('Renderer?is?not?running?or?paused.');      return;    }    await this.renderModel.stop(); //?停止渲染    if (this.renderModel.state?===?audio.AudioState.STATE_STOPPED) {      console.info('Renderer?stopped.');    } else {      console.error('Stopping?renderer?failed.');    }  }  //?銷(xiāo)毀實(shí)例,釋放資源  async release() {    //?渲染器狀態(tài)不是STATE_RELEASED狀態(tài),才能release    if (this.renderModel.state?===?audio.AudioState.STATE_RELEASED) {      console.info('Renderer?already?released');      return;    }    await this.renderModel.release(); //?釋放資源    if (this.renderModel.state?===?audio.AudioState.STATE_RELEASED) {      console.info('Renderer?released');    } else {      console.error('Renderer?release?failed.');    }  }}

使用 AudioCapturer 錄制本端的通話聲音

該過(guò)程與使用AudioCapturer開(kāi)發(fā)音頻錄制功能過(guò)程相似,關(guān)鍵區(qū)別在于 audioCapturerInfo 參數(shù)和音頻數(shù)據(jù)流向。audioCapturerInfo 參數(shù)中音源類(lèi)型需設(shè)置為語(yǔ)音通話,SOURCE_TYPE_VOICE_COMMUNICATION。

import?audio?from '@ohos.multimedia.audio';import?fs?from '@ohos.file.fs';const TAG = 'VoiceCallDemoForAudioCapturer';//?與使用AudioCapturer開(kāi)發(fā)音頻錄制功能過(guò)程相似,關(guān)鍵區(qū)別在于audioCapturerInfo參數(shù)和音頻數(shù)據(jù)流向export default class VoiceCallDemoForAudioCapturer {  private?audioCapturer?= undefined;  private?audioStreamInfo?= {????samplingRate:?audio.AudioSamplingRate.SAMPLE_RATE_44100, //?采樣率????channels:?audio.AudioChannel.CHANNEL_1, //?通道????sampleFormat:?audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, //?采樣格式????encodingType:?audio.AudioEncodingType.ENCODING_TYPE_RAW //?編碼格式  }  private?audioCapturerInfo?= {    //?需使用通話場(chǎng)景相應(yīng)的參數(shù)????source:?audio.SourceType.SOURCE_TYPE_VOICE_COMMUNICATION, //?音源類(lèi)型:語(yǔ)音通話????capturerFlags: 0 //?音頻采集器標(biāo)志:默認(rèn)為0即可  }  private?audioCapturerOptions?= {????streamInfo: this.audioStreamInfo,????capturerInfo: this.audioCapturerInfo  }  //?初始化,創(chuàng)建實(shí)例,設(shè)置監(jiān)聽(tīng)事件  init() {????audio.createAudioCapturer(this.audioCapturerOptions, (err,?capturer) => { //?創(chuàng)建AudioCapturer實(shí)例      if (err) {        console.error(`Invoke?createAudioCapturer?failed,?code?is?${err.code},?message?is?${err.message}`);        return;      }      console.info(`${TAG}:?create?AudioCapturer?success`);      this.audioCapturer?=?capturer;      this.audioCapturer.on('markReach', 1000, (position) => { //?訂閱markReach事件,當(dāng)采集的幀數(shù)達(dá)到1000時(shí)觸發(fā)回調(diào)        if (position?=== 1000) {          console.info('ON?Triggered?successfully');        }      });      this.audioCapturer.on('periodReach', 2000, (position) => { //?訂閱periodReach事件,當(dāng)采集的幀數(shù)達(dá)到2000時(shí)觸發(fā)回調(diào)        if (position?=== 2000) {          console.info('ON?Triggered?successfully');        }      });    });  }  //?開(kāi)始一次音頻采集  async start() {    let?stateGroup?= [audio.AudioState.STATE_PREPARED,?audio.AudioState.STATE_PAUSED,?audio.AudioState.STATE_STOPPED];    if (stateGroup.indexOf(this.audioCapturer.state) === -1) { //?當(dāng)且僅當(dāng)狀態(tài)為STATE_PREPARED、STATE_PAUSED和STATE_STOPPED之一時(shí)才能啟動(dòng)采集      console.error(`${TAG}:?start?failed`);      return;    }    await this.audioCapturer.start(); //?啟動(dòng)采集    //?此處僅以將音頻數(shù)據(jù)寫(xiě)入文件舉例,實(shí)際音頻通話開(kāi)發(fā)中,需要將本端采集的音頻數(shù)據(jù)編碼打包,通過(guò)網(wǎng)絡(luò)發(fā)送給通話對(duì)端    let?context?= getContext(this);    const?path?=?context.filesDir?+ '/voice_call_data.wav'; //?采集到的音頻文件存儲(chǔ)路徑    let?file?=?fs.openSync(path, 0o2 | 0o100); //?如果文件不存在則創(chuàng)建文件    let?fd?=?file.fd;    let?numBuffersToCapture?= 150; //?循環(huán)寫(xiě)入150次    let?count?= 0;    while (numBuffersToCapture) {      let?bufferSize?= await this.audioCapturer.getBufferSize();      let?buffer?= await this.audioCapturer.read(bufferSize, true);      let?options?= {????????offset:?count?*?bufferSize,????????length:?bufferSize      };      if (buffer?=== undefined) {        console.error(`${TAG}:?read?buffer?failed`);      } else {        let number =?fs.writeSync(fd,?buffer,?options);        console.info(`${TAG}:?write?date:?${number}`);      }??????numBuffersToCapture--;??????count++;    }  }  //?停止采集  async stop() {    //?只有采集器狀態(tài)為STATE_RUNNING或STATE_PAUSED的時(shí)候才可以停止    if (this.audioCapturer.state?!==?audio.AudioState.STATE_RUNNING && this.audioCapturer.state?!==?audio.AudioState.STATE_PAUSED) {      console.info('Capturer?is?not?running?or?paused');      return;    }    await this.audioCapturer.stop(); //?停止采集    if (this.audioCapturer.state?===?audio.AudioState.STATE_STOPPED) {      console.info('Capturer?stopped');    } else {      console.error('Capturer?stop?failed');    }  }  //?銷(xiāo)毀實(shí)例,釋放資源  async release() {    //?采集器狀態(tài)不是STATE_RELEASED或STATE_NEW狀態(tài),才能release    if (this.audioCapturer.state?===?audio.AudioState.STATE_RELEASED || this.audioCapturer.state?===?audio.AudioState.STATE_NEW) {      console.info('Capturer?already?released');      return;    }    await this.audioCapturer.release(); //?釋放資源    if (this.audioCapturer.state?==?audio.AudioState.STATE_RELEASED) {      console.info('Capturer?released');    } else {      console.error('Capturer?release?failed');    }  }}
http://m.risenshineclean.com/news/63808.html

相關(guān)文章:

  • 網(wǎng)站百度知道怎么做推廣營(yíng)銷(xiāo)軟文廣告
  • 網(wǎng)站的推廣方式組合網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣渠道有哪些
  • 深圳網(wǎng)站建設(shè) 設(shè)計(jì)科技外貿(mào)網(wǎng)站建站和推廣
  • 網(wǎng)站搭建語(yǔ)言網(wǎng)絡(luò)營(yíng)銷(xiāo)成功案例介紹
  • 美橙互聯(lián)網(wǎng)站建設(shè)案例游戲推廣怎么快速拉人
  • 電商網(wǎng)站策劃書(shū)俄羅斯搜索引擎yandex推廣
  • 珠寶玉器監(jiān)測(cè)網(wǎng)站建設(shè)方案2024年2月疫情又開(kāi)始了嗎
  • php外貿(mào)網(wǎng)站模板如何開(kāi)發(fā)自己的小程序
  • wordpress 文檔導(dǎo)入樹(shù)枝seo
  • 酒店網(wǎng)站設(shè)計(jì)的目的和意義如何在百度上添加店鋪的位置
  • 有關(guān)網(wǎng)站建設(shè)的書(shū)網(wǎng)站提交收錄軟件
  • 來(lái)賓網(wǎng)站建設(shè)seo網(wǎng)站關(guān)鍵詞排名軟件
  • 網(wǎng)站怎么做才 吸引人友情鏈接的網(wǎng)站
  • 多用戶批發(fā)商城aso優(yōu)化平臺(tái)
  • 蘇州室內(nèi)設(shè)計(jì)學(xué)校濟(jì)南網(wǎng)站優(yōu)化
  • 廣州市政府網(wǎng)站建設(shè)概括電腦版百度
  • 營(yíng)銷(xiāo)型網(wǎng)站策劃方案網(wǎng)站源碼
  • 個(gè)人網(wǎng)站建設(shè)與企業(yè)網(wǎng)站營(yíng)銷(xiāo)方式有哪幾種
  • 自己怎么做獨(dú)立網(wǎng)站站內(nèi)搜索引擎
  • 網(wǎng)站開(kāi)發(fā)簡(jiǎn)易軟件今天新聞?lì)^條最新消息
  • 網(wǎng)站開(kāi)發(fā)公司對(duì)比新開(kāi)發(fā)的app怎么推廣
  • 功能型網(wǎng)站制作多少錢(qián)2019年度最火關(guān)鍵詞
  • WordPress板塊加密seo搜索引擎優(yōu)化平臺(tái)
  • 唯一做魅惑的網(wǎng)站如何在網(wǎng)上推廣自己的產(chǎn)品
  • 網(wǎng)站降權(quán)的原因品牌策劃方案
  • 做音響的是哪個(gè)網(wǎng)站南昌搜索引擎優(yōu)化
  • 可以做彩頁(yè)的網(wǎng)站企業(yè)品牌類(lèi)網(wǎng)站有哪些
  • 企業(yè)網(wǎng)站建設(shè)多少家如何注冊(cè)網(wǎng)址
  • 網(wǎng)站建設(shè)中的主要功能西安seo培訓(xùn)學(xué)校
  • 發(fā)新聞稿做新聞源對(duì)網(wǎng)站有啥幫助完整企業(yè)網(wǎng)站模板