我在使用react-mic录音,现在有一个需求是把录音的分成若干个小单元,类似于生产线上一边生产,一边装箱, 但是我把onData回调里面的blob收集并且切分后,只有第一个blob块转换成的wav文件可以播放,其他的都不可以,提示wav文件损坏,我尝试手动加入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 < chunksList.length; i++) {
const audioBuffer = new Uint8Array(await chunksList[i].arrayBuffer());
const header = createWavHeader(1, 44100, audioBuffer.length); // 假设单声道和 44100Hz
const wavBlob = new Blob([header, audioBuffer], { type: 'audio/wav' });
const url = URL.createObjectURL(wavBlob);
const a = document.createElement('a');
a.href = url;
a.download = `recording${i}.wav`;
a.click();
URL.revokeObjectURL(url);
}
};
const startRecording = () => {
setRecord(true)
audioChunksRef.current = [] // 清空之前的录音数据
// 每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)
// 处理当前录音数据
console.log('分割当前录音数据:', blob)
resRef.current.push(blob)
}, 5000)
}
const stopRecording = () => {
setRecord(false)
intervalRef.current && clearInterval(intervalRef.current) // 清除定时器
}
const onData = (recordedBlob: Blob) => {
audioChunksRef.current.push(recordedBlob) // 保存录音数据
}
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)
// 创建下载链接
const url = URL.createObjectURL(file)
const a = document.createElement('a')
a.href = url
a.download = `recording${i}.wav` // 设置下载文件的名称
a.click() // 触发下载
// 释放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)
// 创建下载链接
const url = URL.createObjectURL(file)
const a = document.createElement('a')
a.href = url
a.download = `recording${Date.now()}.wav` // 设置下载文件的名称
a.click() // 触发下载
// 释放URL资源
URL.revokeObjectURL(url)
}
return (
<div>
<ReactMic record={record} onStop={onStop} onData={onData} mimeType="audio/wav" />
<Button onClick={startRecording}>开始录音</Button>
<Button onClick={stopRecording}>停止录音</Button>
<Button onClick={saveFile}>下载</Button>
<Button onClick={saveFinalResult}>下载Final</Button>
</div>
)
}
export default AudioRecorder
希望提供一点思路
wav 应该不行,因为文件格式限制,可以试试 mp3。
如果期望在前端做的话,考虑一下这个项目? https://github.com/ffmpegwasm/ffmpeg.wasm
本文向大家介绍Java 实现将List平均分成若干个集合,包括了Java 实现将List平均分成若干个集合的使用技巧和注意事项,需要的朋友参考一下 1.初衷是由于调用银行接口的批量处理接口时,每次最多只能处理500条数据,但是当数据总数为510条时。我又不想第一次调用处理500条,第二次调用处理10条数据,我想要的是每次处理255条数据。 下面展示的是我的处理方法 2.写了一个简单的ListUti
将一个整数,分拆为若干整数的和。例如实现: 4=3+1 4=2+2 4=2+1+1 4=1+1+1+1 解决(Python) #! /usr/bin/env python #encoding:utf-8 """ """ def int_divided(m,r,out_list): if(r==0): return True tm=r while tm>0:
下面的怎么改成if的形式,因为有一个条件下我要处理多个逻辑所以下面的写法没办法实现?
问题内容: 我有一个几分钟的.wav文件,我想分割成10秒的另一个.wav文件。 到目前为止,这是我的python代码: 印刷产量: 我知道这是框架列表。我如何为该列表中的每个元素制作一个wav文件(第一个.wav文件将是?Python的模块尚不清楚如何使用框架创建.wav文件。 编辑:这是一个重复的问题,如何在python中将音频文件(wav格式)拼接为1秒拼接? 但是,如果某人的答案不需要,我