我正在使用React Js构建一个应用程序,它可以记录用户的音频,并将文件或blob上传到云存储,然后从文件URL播放记录的音频。
问题在于当Chrome录制音频时,它只能在Chrome上播放,但在Safari上无法播放。 与此相反,如果从Safari录制音频,则两个浏览器都可以正常播放。
测试环境:
- macOS 11.5.1 Big Sur
- Google Chrome Version 94.0.4606.81 (Official Build) (x86_64)
- Safari Version 14.1.2 (16611.3.10.1.3)
以下是实现代码:
录制部分:
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream);
recorder.addEventListener('dataavailable', ({ data }) => {
const audioBlob = new Blob([data], { type: 'audio/mpeg' });
// or new File([audioBlob], 'name.mp3', { type: 'audio/mpeg' });
// upload blob or file to server
});
// on start
recorder.start();
// on stop
recorder.stop();
recorder.stream.getTracks().forEach((i) => i.stop());
回放部分;
const audioInstanceRef = useRef<HTMLAudioElement | null>(null);
useEffect(() => {
audioInstanceRef.current = new Audio();
}, []);
const play = (url: string) => {
if (!audioInstanceRef.current) return;
audioInstanceRef.current.src = url;
audioInstanceRef.current.play();
};
以下是Safari获取从Chrome录制的音频所做的请求:
当我尝试使用 audio.play()
进行播放时,在控制台中出现了此错误消息。
当我尝试使用 <audio />
元素进行播放时,控制台中没有错误消息,但会触发 stall
事件。
我还使用 File
构造函数创建并下载到 MacBook 上 MP3 文件。
从 Safari 录制的 MP3 文件可以播放,而从 Chrome 录制的则不能。