国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
使用javascript切分錄音的blob流並生成5秒的wav文件
首頁 web前端 js教程 如何使用JavaScript將錄音的Blob流切分成多個5秒的WAV文件並確保其正常播放?

如何使用JavaScript將錄音的Blob流切分成多個5秒的WAV文件並確保其正常播放?

Apr 04, 2025 pm 02:39 PM
nodejs 瀏覽器 ai

使用javascript切分錄音的blob流並生成5秒的wav文件

在使用react-mic進行錄音時,遇到一個需求:需要將錄音的blob流切分成多個5秒的wav文件。然而,嘗試之後發(fā)現(xiàn)只有第一個切分的wav文件能夠正常播放,其余文件均提示文件損壞。

在前端實現(xiàn)這個需求時,主要面臨兩個挑戰(zhàn):一是如何正確切分blob流,二是如何確保每個切分後的片段能夠正確生成並播放wav文件。以下是代碼示例和解決思路:

 import React, { useRef, useState } from 'react'
import { ReactMic, ReactMicStopEvent } from 'react-mic'
import { Button } from 'antd'

const AudioRecorder = () => {
    const [record, setRecord] = useState(false)
    const resRef = useRef<blob>([])
    const audioChunksRef = useRef<blob>([])
    const intervalRef = useRef<nodejs.timer null>(null)
    const firstBlob = useRef<blob undefined>(undefined)

    const createWavHeader = (numChannels, sampleRate, byteLength) => {
        const header = new ArrayBuffer(44);
        const view = new DataView(header);

        view.setUint32(0, 1380533830, false); // "RIFF"
        view.setUint32(4, byteLength 36, false);
        view.setUint32(8, 1718449184, false); // "WAVE"
        view.setUint32(12, 1684108385, false); // "fmt "
        view.setUint32(16, 16, true); // 16 for PCM
        view.setUint16(20, 1, true); // PCM
        view.setUint16(22, numChannels, true);
        view.setUint32(24, sampleRate, true);
        view.setUint32(28, sampleRate * numChannels * 2, true);
        view.setUint16(32, numChannels * 2, true);
        view.setUint16(34, 16, true); // 16 bits
        view.setUint32(36, 1684108385, false); // "data"
        view.setUint32(40, byteLength, true);

        return header;
    };

    const saveFile = async () => {
        const chunksList = resRef.current;
        for (let i = 0; i  {
        setRecord(true)
        audioChunksRef.current = [] // 清空之前的錄音數(shù)據(jù)// 每5秒分割一次錄音intervalRef.current = setInterval(() => {
            const curBlob = new Blob(audioChunksRef.current, { type: 'audio/wav' })
            const startIndex = audioChunksRef.current.indexOf(firstBlob.current as Blob)
            const blob = curBlob.slice(startIndex === -1 ? 0 : startIndex, -1, 'audio/wav')
            firstBlob.current = audioChunksRef.current.at(-1)
            // 處理當前錄音數(shù)據(jù)console.log('分割當前錄音數(shù)據(jù):', blob)
            resRef.current.push(blob)
        }, 5000)
    }

    const stopRecording = () => {
        setRecord(false)
        intervalRef.current && clearInterval(intervalRef.current) // 清除定時器}

    const onData = (recordedBlob: Blob) => {
        audioChunksRef.current.push(recordedBlob) // 保存錄音數(shù)據(jù)}

    const onStop = (recordedBlob: ReactMicStopEvent) => {
        console.log('錄音完成:', recordedBlob)
    }

    const saveFile1 = () => {
        const chunksList = resRef.current
        chunksList.map(async (v, i) => {
            const fileName = 'aaa.wav'
            const file: File = new File([v], fileName, { type: 'audio/wav' })
            const fileSize = file.size

            console.log('fileSize', fileSize)
            // 創(chuàng)建下載鏈接const url = URL.createObjectURL(file)
            const a = document.createElement('a')
            a.href = url
            a.download = `recording${i}.wav` // 設置下載文件的名稱a.click() // 觸發(fā)下載// 釋放URL資源URL.revokeObjectURL(url)
        })
    }

    const saveFinalResult = () => {
        const fileName = 'aaa.wav'
        const file: File = new File(audioChunksRef.current, fileName, { type: 'audio/wav' })
        const fileSize = file.size

        console.log('fileSize', fileSize)
        // 創(chuàng)建下載鏈接const url = URL.createObjectURL(file)
        const a = document.createElement('a')
        a.href = url
        a.download = `recording${Date.now()}.wav` // 設置下載文件的名稱a.click() // 觸發(fā)下載// 釋放URL資源URL.revokeObjectURL(url)
    }

    return (
        <div>
            <reactmic record="{record}" onstop="{onStop}" ondata="{onData}" mimetype="audio/wav"></reactmic>
            <button onclick="{startRecording}">開始錄音</button>
            <button onclick="{stopRecording}">停止錄音</button>
            <button onclick="{saveFile}">下載</button>
            <button onclick="{saveFinalResult}">下載Final</button>
        </div>
    )
}

export default AudioRecorder</blob></nodejs.timer></blob></blob>

在嘗試切分blob流和生成wav文件的過程中,發(fā)現(xiàn)手動添加wav頭信息並不能解決問題。其原因在於wav文件的結構比較嚴格,切分後如果不正確地添加頭部信息,文件可能會損壞。

解決這個問題的一個建議是使用ffmpeg的wasm版本,這是一個可以在瀏覽器中運行的音視頻處理庫。通過它,你可以輕鬆地對音頻進行切分並生成正確的wav文件格式。可以考慮使用ffmpeg.wasm項目來實現(xiàn)這個功能。

以上是如何使用JavaScript將錄音的Blob流切分成多個5秒的WAV文件並確保其正常播放?的詳細內(nèi)容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內(nèi)容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

鏈上資金流向大曝光:聰明錢正在下注哪些新代幣? 鏈上資金流向大曝光:聰明錢正在下注哪些新代幣? Jul 16, 2025 am 10:15 AM

普通投資者可通過追蹤“聰明錢”發(fā)現(xiàn)潛力代幣,其為高盈利地址,關注其動向能提供領先指標。 1.使用Nansen、Arkham Intelligence等工具分析鏈上數(shù)據(jù),查看聰明錢的買入與持倉情況;2.通過Dune Analytics獲取社區(qū)創(chuàng)建的儀表板,監(jiān)測資金流向;3.關注Lookonchain等平臺獲取實時情報。近期聰明錢正佈局再質(zhì)押與LRT賽道、DePIN項目、模塊化生態(tài)及RWA協(xié)議,如某LRT協(xié)議獲大量早期存款,某DePIN項目被持續(xù)積累,某遊戲公鏈獲產(chǎn)業(yè)金庫支持,某RWA協(xié)議吸引機構入場

穩(wěn)定幣DAI適合什麼人使用_去中心化穩(wěn)定幣使用場景解析 穩(wěn)定幣DAI適合什麼人使用_去中心化穩(wěn)定幣使用場景解析 Jul 15, 2025 pm 11:27 PM

DAI適合重視去中心化理念、積極參與DeFi生態(tài)、需要跨鏈資產(chǎn)流動性及追求資產(chǎn)透明與自治的用戶。 1. 去中心化理念支持者信任智能合約與社區(qū)治理;2. DeFi用戶可用於借貸、質(zhì)押、流動性挖礦;3. 跨鏈用戶可實現(xiàn)多鏈資產(chǎn)靈活轉(zhuǎn)移;4. 治理參與者可通過投票影響系統(tǒng)決策。其主要場景包括去中心化借貸、資產(chǎn)避險、流動性挖礦、跨境支付及社區(qū)治理,同時需注意系統(tǒng)風險、抵押波動風險和技術門檻問題。

如何辨別假山寨幣?教你避免幣圈騙局 如何辨別假山寨幣?教你避免幣圈騙局 Jul 15, 2025 pm 10:36 PM

要辨別假山寨幣需從六個方面入手。一、查驗證明材料與項目背景,包括白皮書、官網(wǎng)、代碼開源地址及團隊透明度;二、觀察上線平臺,優(yōu)先選擇主流交易所;三、警惕高額回報與拉人頭模式,避免資金盤陷阱;四、分析合約代碼與代幣機制,檢查是否存在惡意函數(shù);五、審查社群與媒體運營,識別虛假熱度;六、遵循防騙實戰(zhàn)建議,如不輕信推薦、使用專業(yè)錢包。通過以上步驟可有效規(guī)避騙局,保護資產(chǎn)安全。

比特幣、Chainlink、RWA共振上漲:加密市場進入機構邏輯? 比特幣、Chainlink、RWA共振上漲:加密市場進入機構邏輯? Jul 16, 2025 am 10:03 AM

比特幣、Chainlink與RWA的聯(lián)動上漲標誌著加密市場正轉(zhuǎn)向機構敘事主導。比特幣作為機構配置的宏觀對沖資產(chǎn),為市場提供穩(wěn)定基礎;Chainlink通過預言機和跨鏈技術成為連接現(xiàn)實與數(shù)字世界的關鍵橋樑;RWA則為傳統(tǒng)資本入場提供合規(guī)路徑。三者共同構建了機構入場的完整邏輯閉環(huán):1)配置BTC穩(wěn)定資產(chǎn)負債表;2)通過RWA拓展鏈上資產(chǎn)管理;3)依賴Chainlink建設底層基礎設施,預示市場進入由真實需求驅(qū)動的新階段。

幣安v2.102.5怎麼更新_幣安v2.102.5版本一鍵更新教程 幣安v2.102.5怎麼更新_幣安v2.102.5版本一鍵更新教程 Jul 11, 2025 pm 10:03 PM

幣安最新版本為v2.102.5,更新教程為:1、點擊網(wǎng)頁中的下載鏈接;2、授權“允許未知來源安裝”安裝權限;3、找到下載好的APk點擊安裝;4、點擊安裝好的應用打開即可。

穩(wěn)定幣DAI和USDC哪個好_DAI適合長期持有嗎 穩(wěn)定幣DAI和USDC哪個好_DAI適合長期持有嗎 Jul 15, 2025 pm 11:18 PM

DAI適合長期持有嗎?答案取決於個人需求與風險偏好。 1.DAI是去中心化穩(wěn)定幣,由加密資產(chǎn)超額抵押生成,適合追求抗審查和透明度的用戶;2.其穩(wěn)定性略遜於USDC,可能因抵押品波動出現(xiàn)輕微脫錨;3.適用於DeFi生態(tài)中的借貸、質(zhì)押及治理場景;4.需關注MakerDAO系統(tǒng)升級與治理風險。若追求高穩(wěn)定性與合規(guī)保障,建議選擇USDC;若重視去中心化理念並積極參與DeFi應用,則DAI具備長期持有價值。兩者結合使用亦可提升資產(chǎn)配置的安全性與靈活性。

以太坊智能合約的作用 以太坊智能合約的作用 Jul 15, 2025 pm 09:18 PM

以太坊智能合約的作用是實現(xiàn)去中心化、自動化和透明的協(xié)議執(zhí)行,其核心功能包括:1. 作為DApp的核心邏輯層,支持代幣發(fā)行、DeFi、NFT等功能;2. 通過代碼自動執(zhí)行合約,減少人為乾預與欺詐風險;3. 構建DeFi生態(tài),使用戶可直接進行借貸、交易等金融操作;4. 創(chuàng)建與管理數(shù)字資產(chǎn),確保唯一性與可驗證性;5. 提升供應鏈與身份驗證的透明度與安全性;6. 支持DAO治理,實現(xiàn)去中心化決策。

Filecoin、Render、AI存儲預售升溫:Web3基礎設施爆點將至? Filecoin、Render、AI存儲預售升溫:Web3基礎設施爆點將至? Jul 16, 2025 am 09:51 AM

是的,Web3基礎設施正因AI需求升溫而迎來爆發(fā)預期。 Filecoin通過“Compute over Data”計劃整合計算能力,支持AI數(shù)據(jù)處理與訓練;Render Network提供分佈式GPU算力,服務AIGC圖形渲染;Arweave以永久存儲特性支撐AI模型權重和數(shù)據(jù)溯源;三者結合技術升級與生態(tài)資本推動,正從邊緣走向AI底層核心。

See all articles