fix: recording format for browser
This commit is contained in:
+1
-1
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user