Я пишу интерфейс для игрового движка в Javascript. Движок запускается на сервере и отправляет изображения и звуки в веб-браузер через «SignalR». Я использую платформу React.
При запуске игры сервер отправляет небольшие звуковые сэмплы в формате WAVE, передаваемые в этот компонент через AudioPlayerProps.
У меня две основные проблемы со звуком , Во-первых, звук звучит как «несвязанный». И второе: через некоторое время звук просто перестает играть. Я вижу звук в очереди аудио, но метод playNextAudioTrack не вызывается. В консоли нет ошибок, объясняющих это.
Если это не лучший способ обеспечить звук для игрового интерфейса, пожалуйста, дайте мне знать.
Также, если вы хотите увидеть больше кода, пожалуйста, дайте мне знать. Это огромный многоуровневый проект, поэтому я показываю только то, что, я думаю, вам нужно увидеть.
Сейчас я тестирую в Chrome. На этом этапе мне нужно включить инструменты DEV, чтобы обойти «пользователь не взаимодействовал со страницей, поэтому вы не можете воспроизвести любую проблему со звуком». Я разберусь с этим вопросом в свое время.
import * as React from "react";
import { useEffect, useState } from "react";
export interface AudioPlayerProps {
data: string;
}
export const AudioPlayer = function (props: AudioPlayerProps): JSX.Element {
const [audioQueue, setAudioQueue] = useState<string[]>([])
useEffect(
() => {
if (props.data != undefined) {
audioQueue.push(props.data);
}
}, [props.data]);
const playNextAudioTrack = () => {
if (audioQueue.length > 0) {
const audioBase64 = audioQueue.pop();
const newAudio = new Audio(`data:audio/wav;base64,${audioBase64}`)
newAudio.play().then(playNextAudioTrack).catch(
(error) => {
setTimeout(playNextAudioTrack, 10);
}
)
}
else {
setTimeout(playNextAudioTrack, 10);
}
}
useEffect(playNextAudioTrack, []);
return null;
}