99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

通過Capturer接口實(shí)現(xiàn)錄音變速功能的方法

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 作者:OpenAtom OpenHarmony ? 2022-08-18 15:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

簡介

OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)是由開放原子開源基金會(huì)孵化及運(yùn)營的開源項(xiàng)目,是面向全場景、全連接、全智能時(shí)代的智能物聯(lián)網(wǎng)操作系統(tǒng)。

多媒體子系統(tǒng)是OpenHarmony系統(tǒng)中的核心子系統(tǒng),為系統(tǒng)提供了相機(jī)、音頻視頻等多媒體功能。多媒體子系統(tǒng)的音頻模塊、音頻錄音功能可以提供兩套接口,一是由ohos.multimedia.media提供的AudioRecorder接口,能夠直接設(shè)置錄音保存的文件路徑,在錄制結(jié)束以后自動(dòng)生成對(duì)應(yīng)的錄音文件,代碼編寫比較簡單;二是由ohos.multimedia.audio提供的AudioCapturer接口,能夠獲得錄音過程中的PCM數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行處理。由于Capturer接口對(duì)于原始數(shù)據(jù)的處理更加靈活,今天就和大家介紹通過Capturer接口實(shí)現(xiàn)錄音變速的功能的方法。

效果展示

通過Capturer接口實(shí)現(xiàn)音頻的錄制,在錄制過程中對(duì)PCM數(shù)據(jù)進(jìn)行重采樣實(shí)現(xiàn)聲音的快放和慢放。

詳細(xì)效果請看下方視頻:

首先設(shè)置錄音加速或者錄音減速,設(shè)置完成以后點(diǎn)擊“錄音開始”按鈕進(jìn)行錄音,點(diǎn)擊“錄音結(jié)束”按鈕停止錄音,再通過點(diǎn)擊“播放開始”對(duì)錄音的音頻進(jìn)行播放,播放的音頻是設(shè)置后的加速或者減速效果。

代碼已經(jīng)上傳至SIG倉庫,鏈接如下:

https://gitee.com/openharmony-sig/knowledge_demo_entainment/tree/master/FA/AudioChangeDemo

目錄結(jié)構(gòu)

803b51c0-1ea7-11ed-ba43-dac502259ad0.png

調(diào)用流程

1.Start的框架層調(diào)用流程

80544d6a-1ea7-11ed-ba43-dac502259ad0.png

2. Read的框架層調(diào)用流程

805f634e-1ea7-11ed-ba43-dac502259ad0.png

源碼分析

1.首先看一下頁面的布局,主要分為四個(gè)模塊:(1)設(shè)置錄音加速


	
設(shè)置錄音加速:
1.25倍速1.5倍速
1.75倍速2倍速

(2)設(shè)置錄音減速


	
設(shè)置錄音減速:
0.75倍速0.5倍速

(3)錄音


	
錄音:
錄音開始錄音結(jié)束

(4)播放


	
播放:
播放開始播放結(jié)束
class="video" src="{{url}}" autoplay="{{ autoplay }}" controls="{{ controlShow }}" muted="false" onseeked="seeked" onprepared="prepared" >

2.邏輯代碼在JS中:

(1)首先通過AudioCapturer接口獲取到PCM數(shù)據(jù),再通過調(diào)用AudioCapturer的start接口來啟動(dòng)錄音流程。

globalThis.capturer.start().then(function () {    console.log("gyf start");    globalThis.capturer.getBufferSize((err, bufferSize) => {        if (err) {            console.error('gyf getBufferSize error');        } else {            console.log("gyf bufferSize = " + bufferSize);            globalThis.getBuf(bufferSize);        }    });});

(2)啟動(dòng)成功以后,getBuf會(huì)調(diào)用到getData函數(shù),getData函數(shù)通過AudioCapturer的read方法來讀取數(shù)據(jù),成功讀取到數(shù)據(jù)以后,通過handleBuffer函數(shù)對(duì)數(shù)據(jù)進(jìn)行處理。handleBuffer函數(shù)的參數(shù)arrayBuffer就是通過read方法讀取出來的pcm數(shù)據(jù),在handleBuffer中對(duì)數(shù)據(jù)進(jìn)行了快速播放或者慢速播放的處理。

//循環(huán)調(diào)用read,進(jìn)行數(shù)據(jù)的讀取handleBuffer(arrayBuffer) {    console.log("gyf handleBuffer");
    let result = new Uint8Array(arrayBuffer);    console.log("gyf handleBuffer ================== " + result);
    let outData = this.test(result, up, down);
    fileio.writeSync(globalThis.fd, outData.buffer);
    globalThis.capturer.read(globalThis.bufSize, true).then(this.handleBuffer);},
getData(bufSize) {    console.log("gyf getData");    globalThis.capturer.read(bufSize, true).then(this.handleBuffer);},
getBuf(bufSize) {    console.log("gyf getBuf");    this.getData(bufSize);},

(3)快速播放或者慢速播放是通過up和down兩個(gè)方法的組合來實(shí)現(xiàn)的,down方法的原理是對(duì)PCM數(shù)據(jù)進(jìn)行插值處理,在相鄰兩點(diǎn)間插入down個(gè)采樣點(diǎn),up方法的原理是間隔抽取,間隔up個(gè)點(diǎn)進(jìn)行抽取采樣。

up(data, up) {    if (1 == up) {        return data;    }    let length = data.byteLength;    let upLength = Math.round(length / up);    var upData = new Uint8Array(upLength);    for (var i = 0, j = 0; i < length; ) {        if (j >= upLength) {            break;        }        upData[j] = data[i];        i += up;        j++;    }    return upData;},
down(data, down) {    if (1 == down) {        return data;    }
    let length = data.byteLength;    let downLength = Math.round(length * down);    var downData = new Uint8Array(downLength);    for (var i = 0, j = 0; i < length - 1; ) {        for (var k = 0; k < down; k++) {            downData[j] = data[i];            j++;        }        i++;    }    return downData;},

(4)將down和up的方法組合調(diào)用,來實(shí)現(xiàn)1.25倍、1.5倍、1.75倍、2倍、0.75倍、0.5倍的速度播放。

test(data, up, down) {    let downData = this.down(data, down);    let upData = this.up(downData, up);    return upData;},

(5)播放wav格式的音頻文件,采集獲取PCM數(shù)據(jù),需要我們根據(jù)設(shè)置的參數(shù)對(duì)pcm數(shù)據(jù)進(jìn)行添加wav的頭部信息,通過創(chuàng)建AudioCapturer實(shí)例的時(shí)候設(shè)置采集音頻的參數(shù),如采樣率、通道數(shù)、采樣格式等。

//音頻采集初始化var audioStreamInfo = {    samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_8000,    channels: audio.AudioChannel.CHANNEL_1,    sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_U8,    encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW}
var audioCapturerInfo = {    source: audio.SourceType.SOURCE_TYPE_MIC,    capturerFlags: 1}
var audioCapturerOptions = {    streamInfo: audioStreamInfo,    capturerInfo: audioCapturerInfo}let that = this;
audio.createAudioCapturer(audioCapturerOptions,(err, data) => {    if (err) {        console.error(`gyf AudioCapturer Created : Error: ${err.message}`);    }    else {        console.info('gyf AudioCapturer Created : Success : SUCCESS');        that.capturer = data;    }});

(6)根據(jù)這些參數(shù)設(shè)置的信息需要對(duì)wav文件寫入文件頭,頭信息一般包含44個(gè)字節(jié),里面需要設(shè)置三個(gè)chunk的信息(RIFF chunk、fmt chunk、data chunk),具體的信息可以查看官網(wǎng)的介紹WAV文件格式介紹(http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html)。

//假設(shè)數(shù)據(jù)為1000秒鐘的時(shí)間(8000 * 1000)encodeWAV() {    var dataLen = 8000000;    var sampleRate = 8000;    var sampleBits = 8;    var buffer = new ArrayBuffer(44);    var data = new DataView(buffer);
    var channelCount = 1;   // 單聲道    var offset = 0;
    // 資源交換文件標(biāo)識(shí)符    this.writeString(data, offset, 'RIFF'); offset += 4;    // 下個(gè)地址開始到文件尾總字節(jié)數(shù),即文件大小-8    data.setUint32(offset, 36 + dataLen, true); offset += 4;    // WAV文件標(biāo)志    this.writeString(data, offset, 'WAVE'); offset += 4;    // 波形格式標(biāo)志    this.writeString(data, offset, 'fmt '); offset += 4;    // 過濾字節(jié),一般為 0x10 = 16    data.setUint32(offset, 16, true); offset += 4;    // 格式類別 (PCM形式采樣數(shù)據(jù))    data.setUint16(offset, 1, true); offset += 2;    // 通道數(shù)    data.setUint16(offset, channelCount, true); offset += 2;    // 采樣率,每秒樣本數(shù),表示每個(gè)通道的播放速度    data.setUint32(offset, sampleRate, true); offset += 4;    // 波形數(shù)據(jù)傳輸率 (每秒平均字節(jié)數(shù)) 單聲道×每秒數(shù)據(jù)位數(shù)×每樣本數(shù)據(jù)位/8    data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true); offset += 4;    // 快數(shù)據(jù)調(diào)整數(shù) 采樣一次占用字節(jié)數(shù) 單聲道×每樣本的數(shù)據(jù)位數(shù)/8    data.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2;    // 每樣本數(shù)據(jù)位數(shù)    data.setUint16(offset, sampleBits, true); offset += 2;    // 數(shù)據(jù)標(biāo)識(shí)符    this.writeString(data, offset, 'data'); offset += 4;    // 采樣數(shù)據(jù)總數(shù),即數(shù)據(jù)總大小-44    data.setUint32(offset, dataLen, true); offset += 4;
    return data;},

總結(jié)

本文介紹了通過使用OpenHarmony音頻模塊的AudioCapturer接口實(shí)現(xiàn)錄音功能。AudioCapturer接口對(duì)于原始數(shù)據(jù)的處理非常靈活,能夠?qū)Σ杉臄?shù)據(jù)進(jìn)行插值/抽值的重采樣處理,并將處理后的音頻處理保存至本地文件。由于本地文件使用的是WAV格式,故在寫數(shù)據(jù)前需要對(duì)WAV文件進(jìn)行頭部信息的添加,這些信息可以根據(jù)創(chuàng)建AudioCapturer時(shí)設(shè)置的參數(shù)來進(jìn)行設(shè)置,以此保證頭部信息的準(zhǔn)確性,最后再通過應(yīng)用層的video組件對(duì)音頻數(shù)據(jù)進(jìn)行播放。

希望這篇文章能為開發(fā)者提供一些新的思路,從而進(jìn)行其他場景的拓展,例如將獲取到采集的數(shù)據(jù)通過這種方式實(shí)現(xiàn)語音識(shí)別、語音轉(zhuǎn)寫等功能,在實(shí)踐開發(fā)的過程中為OpenHarmony生態(tài)的發(fā)展貢獻(xiàn)一份力量。

審核編輯:湯梓紅


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

    關(guān)注

    33

    文章

    9005

    瀏覽量

    153761
  • 音頻模塊
    +關(guān)注

    關(guān)注

    1

    文章

    148

    瀏覽量

    12641
  • OpenHarmony
    +關(guān)注

    關(guān)注

    29

    文章

    3854

    瀏覽量

    18617

原文標(biāo)題:如何通過OpenHarmony的音頻模塊實(shí)現(xiàn)錄音變速功能?

文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    請問如何通過hdmi接口實(shí)現(xiàn)控制單反拍照及錄像

    如何通過hdmi接口實(shí)現(xiàn)控制單反拍照及錄像,這個(gè)功能如何實(shí)現(xiàn)?對(duì)于多個(gè)單反可以同時(shí)控制又是如何實(shí)現(xiàn)呢?我想
    發(fā)表于 02-19 01:08

    怎樣使用IWeb接口實(shí)現(xiàn)HTTPS的功能

    的應(yīng)用程序中都保留副本。手持設(shè)備僅包含常用根證書的一小部分,從而防止占用過多的空間。SSL的實(shí)現(xiàn)有兩種方法,一種是面向socket的實(shí)現(xiàn),另一種是面向http的實(shí)現(xiàn)及HTTPS。這里
    發(fā)表于 08-05 06:52

    STM32通過口實(shí)現(xiàn)雙機(jī)通信的方法是什么

    STM32通過口實(shí)現(xiàn)雙機(jī)通信的方法是什么
    發(fā)表于 12-16 06:27

    esp32能否通過AT接口實(shí)現(xiàn)modbusTCP slaver的功能

    的可行性:方法一 :1 針對(duì)esp32的源碼工程添加ModbusTCP工程,4種寄存器的起始地址和數(shù)量通過AT指令參數(shù)實(shí)現(xiàn)。2 設(shè)計(jì)對(duì)應(yīng)的自定義AT接口,包括配置的IP地址端口,超時(shí)時(shí)
    發(fā)表于 05-23 09:34

    如何通過OpenHarmony的音頻模塊實(shí)現(xiàn)錄音變速功能?

    錄音變速功能方法。效果展示通過Capturer接口實(shí)現(xiàn)音頻的錄制,在錄制過程中對(duì)PCM數(shù)據(jù)進(jìn)
    發(fā)表于 08-25 11:45

    小波變換在語音變速上的應(yīng)用

    小波變換在語音變速上的應(yīng)用:對(duì)語音生成及其特征進(jìn)行描述, 提出了一種基于保持音調(diào)前提下的語音變速方法L利用基頻估值可以得到語音的基音周期, 適當(dāng)?shù)貜?fù)制或刪除若干個(gè)基音
    發(fā)表于 10-25 12:21 ?10次下載

    基于FPGA的VGA接口實(shí)現(xiàn)和字符顯示

    基于FPGA的VGA接口實(shí)現(xiàn)和字符顯示論文
    發(fā)表于 10-29 17:18 ?8次下載

    如何通過STM32的串口實(shí)現(xiàn)簡易脫機(jī)編程器

    如何通過STM32的串口實(shí)現(xiàn)簡易脫機(jī)編程器如何通過STM32的串口實(shí)現(xiàn)簡易脫機(jī)編程器如何通過STM32的串
    發(fā)表于 04-25 09:38 ?60次下載

    SPI總線接口實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)?b class='flag-5'>實(shí)現(xiàn)方法

    本文介紹了通過SPI總線接口實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)?b class='flag-5'>實(shí)現(xiàn)方法,給出了用MCS51單片機(jī)匯編語言模擬SPI串行總線的輸入、輸出,輸入/輸出以傳送8位數(shù)據(jù)的子程序。實(shí)際上,也可以根據(jù)SPI串行總線的
    發(fā)表于 11-16 13:34 ?8次下載

    音變換的語音篡改檢測方法

    針對(duì)使用語音變換技術(shù)的語音篡改,提出一種自動(dòng)檢測方法。在分析語音變換基本模型和變換語音失真的基礎(chǔ)上,提取語音信號(hào)的聲道參數(shù)以及相關(guān)的信號(hào)統(tǒng)計(jì)量,并通過支持向量機(jī)遞歸特征消除法,選擇出對(duì)
    發(fā)表于 03-02 11:26 ?2次下載
    語<b class='flag-5'>音變</b>換的語音篡改檢測<b class='flag-5'>方法</b>

    ARM與FPGA的接口實(shí)現(xiàn)的解析

    ARM與FPGA的接口實(shí)現(xiàn)的解析(應(yīng)廣單片機(jī))-該文檔為ARM與FPGA的接口實(shí)現(xiàn)的解析詳述資料,講解的還不錯(cuò),感興趣的可以下載看看…………………………
    發(fā)表于 07-22 09:47 ?14次下載
    ARM與FPGA的<b class='flag-5'>接口實(shí)現(xiàn)</b>的解析

    C#-Interface接口實(shí)現(xiàn)

    C#-Interface接口實(shí)現(xiàn)(安徽理士電源技術(shù)有限公司招聘信息)-該文檔為C#-Interface接口實(shí)現(xiàn)講解文檔,是一份還算不錯(cuò)的參考文檔,感興趣的可以下載看看,,,,,,,,,,,,,,,,,,
    發(fā)表于 09-28 09:42 ?3次下載
    C#-Interface<b class='flag-5'>接口實(shí)現(xiàn)</b>

    通過標(biāo)準(zhǔn)的CAN接口實(shí)現(xiàn)的測試臺(tái)自動(dòng)化解決方案

    通過標(biāo)準(zhǔn)的CAN接口實(shí)現(xiàn)的測試臺(tái)自動(dòng)化解決方案
    的頭像 發(fā)表于 10-11 14:17 ?2247次閱讀

    基于XML語言描述的接口實(shí)現(xiàn)方法

    電子發(fā)燒友網(wǎng)站提供《基于XML語言描述的接口實(shí)現(xiàn)方法.pdf》資料免費(fèi)下載
    發(fā)表于 11-06 10:39 ?0次下載
    基于XML語言描述的<b class='flag-5'>接口實(shí)現(xiàn)</b><b class='flag-5'>方法</b>

    RK3399 Ubuntu通過Python實(shí)現(xiàn)錄音和播放功能

    本文基于IDO-SBC3968Ubuntu系統(tǒng)通過Python腳本實(shí)現(xiàn)錄音和播放功能。IDO-SBC3968采用RK3399國產(chǎn)六核64位CPU高性能處理器,支持4KHDMI2.0顯示
    的頭像 發(fā)表于 11-25 08:32 ?1223次閱讀
    RK3399 Ubuntu<b class='flag-5'>通過</b>Python<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>錄音</b>和播放<b class='flag-5'>功能</b>