fix: recording format for browser

This commit is contained in:
jialin
2024-12-04 20:13:08 +08:00
parent 38daa0826e
commit 0294e0d2b3
2 changed files with 40 additions and 5 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ const isProduction = env === 'production';
const t = Date.now(); const t = Date.now();
export default defineConfig({ export default defineConfig({
proxy: { proxy: {
...proxy('http://192.168.50.4') ...proxy()
}, },
history: { history: {
type: 'hash' type: 'hash'
@@ -27,6 +27,21 @@ interface AudioInputProps {
type?: 'text' | 'primary' | 'default'; type?: 'text' | 'primary' | 'default';
} }
const audioFormat: Record<string, string> = {
'audio/mpeg': 'mp3',
'audio/mp4': 'mp4',
'audio/wav': 'wav',
'audio/ogg': 'ogg',
'audio/webm': 'webm',
'audio/aac': 'aac',
'audio/x-flac': 'flac',
'audio/pcm': 'pcm',
'audio/flac': 'flac',
'audio/x-wav': 'wav',
'audio/L16': 'pcm',
'audio/opus': 'opus'
};
const recordingFormat = { const recordingFormat = {
type: 'audio/wav', type: 'audio/wav',
suffix: '.wav' suffix: '.wav'
@@ -52,6 +67,7 @@ const AudioInput: React.FC<AudioInputProps> = (props) => {
analyser.current = audioContext.current.createAnalyser(); analyser.current = audioContext.current.createAnalyser();
analyser.current.fftSize = 512; analyser.current.fftSize = 512;
dataArray.current = new Uint8Array(analyser.current.frequencyBinCount); dataArray.current = new Uint8Array(analyser.current.frequencyBinCount);
console.log('audioContext:', audioContext.current, analyser.current);
}, []); }, []);
const generateVisualData = useCallback(() => { const generateVisualData = useCallback(() => {
@@ -158,10 +174,26 @@ const AudioInput: React.FC<AudioInputProps> = (props) => {
const handleAudioData = (audioData: any) => { const handleAudioData = (audioData: any) => {
props.onAudioData?.(audioData); props.onAudioData?.(audioData);
}; };
const getAudioFormat = () => {
const mimeType = audioRecorder.current?.mimeType;
let resultFormat = recordingFormat;
Object.keys(audioFormat).forEach((key: string) => {
if (mimeType.includes(key)) {
resultFormat = {
type: mimeType,
suffix: `.${audioFormat[key]}`
};
}
});
return resultFormat;
};
const generateFileNameByTime = () => { const generateFileNameByTime = () => {
const res = getAudioFormat();
// format: recording-YYYY-MM-DD-HH_mm_ss.wav // format: recording-YYYY-MM-DD-HH_mm_ss.wav
return `recording-${dayjs().format('YYYY-MM-DD-HH_mm_ss')}${recordingFormat.suffix}`; return `recording-${dayjs().format('YYYY-MM-DD-HH_mm_ss')}${res.suffix}`;
}; };
// start recording // start recording
const StartRecording = async () => { const StartRecording = async () => {
@@ -174,7 +206,7 @@ const AudioInput: React.FC<AudioInputProps> = (props) => {
await EnableAudio(); await EnableAudio();
audioRecorder.current = new MediaRecorder(audioStream.current); audioRecorder.current = new MediaRecorder(audioStream.current);
console.log('audioRecorder:', audioRecorder.current);
const audioChunks: any[] = []; const audioChunks: any[] = [];
audioRecorder.current.ondataavailable = (event: any) => { audioRecorder.current.ondataavailable = (event: any) => {
@@ -188,13 +220,16 @@ const AudioInput: React.FC<AudioInputProps> = (props) => {
// stop recording // stop recording
audioRecorder.current.onstop = () => { audioRecorder.current.onstop = () => {
const audioBlob = new Blob(audioChunks, { type: recordingFormat.type }); const res = getAudioFormat();
const audioBlob = new Blob(audioChunks, {
type: audioRecorder.current.mimeType
});
const audioUrl = URL.createObjectURL(audioBlob); const audioUrl = URL.createObjectURL(audioBlob);
handleAudioData({ handleAudioData({
chunks: audioBlob, chunks: audioBlob,
size: audioBlob.size, size: audioBlob.size,
type: audioBlob.type, type: res.type,
url: audioUrl, url: audioUrl,
name: generateFileNameByTime(), name: generateFileNameByTime(),
duration: Math.floor((Date.now() - startTime.current) / 1000) duration: Math.floor((Date.now() - startTime.current) / 1000)