在ios设备上,播放blob音频数据,如果blobQueue.current.shift()取到的blob数据太多,audio播放的音频时间长,会出现播放的过程中突然没有声音的问题,并且进度播完的时候,不会触发onEnded
import { useEventBus } from 'event-bus-hooks';
import { useSelector } from 'react-redux';
const IosAudio = () => {
const player = useRef(null);
const blobQueue = useRef([]); // 用于存储 Blob 的队列
const currentIndex = useRef(0);
const handlePlay = () => {
if (currentIndex.current > blobQueue.current.length - 1) {
currentIndex.current = 0;
return;
}
console.log('------------ 下一个 -------------');
let obj = blobQueue.current.shift();
console.log(obj, obj.length);
const blob = new Blob(obj, { type: 'audio/mp3' }); // 合并队列中的 Blob
player.current.src = URL.createObjectURL(blob);
player.current.load();
};
// 接收二进制的音频数据(Blob 格式),并处理
useEventBus('Global/tts_BlobList', (blobDataArr) => {
blobQueue.current.push(blobDataArr);
});
const handleStop = () => {
if (!player.current) return;
blobQueue.current = [];
player.current.pause();
// 释放资源
URL.revokeObjectURL(player.current.src);
};
const loadedmetadata = () => {
console.log('音频元数据加载完成');
player.current
.play()
.then(() => {
console.log('播放成功');
})
.catch((error) => {
console.error('播放失败:', error);
});
};
// 播放结束
const onended = () => {
currentIndex.current++;
handlePlay();
};
// 监听播放和暂停
useEventBus('Global/audio-play', ({ type }) => {
if (type === 'start') {
handlePlay();
} else if (type === 'end') {
handleStop();
}
});
const isMute = useSelector((state) => state.chat.isMute);
useEffect(() => {
player.current.muted = !!isMute;
}, [isMute]);
return (
<audio
ref={player}
src=""
onLoadedMetadata={loadedmetadata}
onEnded={onended}
onError={(e) => console.error('数字人播放音频错误:', e.message)}
controls
/>
);
};
export default IosAudio;
测试过程中,音频时长超过17秒,就会出现问题,有没有大佬懂这是什么原因,是因为内存原因么
重叠分片试试:
加分片处理试试我设置的是15s,优化一下内存,还有错误处理,试试能不能解决。
工具函数: