Tô tentando enviar o audio do meu front para o back para depois mandar em formato de arquivo para a lib, segue meu código:
Primero crio o audio e envio do front para o back
const btn = document.getElementById('btn-audio');
let chunks = []
let stream
let mediaRecoder
btn.onclick = () => {
OnRecoder ? stopListening() : startListening()
}
function startListening() {
if (navigator.mediaDevices) {
navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
stream = mediaStream
let mr = new MediaRecorder(stream)
mediaRecoder = mr
if (!OnRecoder) {
mediaRecoder.start()
OnRecoder = true
}
mediaRecoder.ondataavailable = (e) => {
chunks.push(e.data);
};
})
}
}
function stopListening() {
mediaRecoder.stop()
OnRecoder = false
mediaRecoder.onstop = (e) => {
const blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" })
chunks = []
const reader = new FileReader()
reader.readAsDataURL(blob)
reader.onloadend = async () => {
await fetch('/postAudio', {
method: "POST",
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ data: reader.result })
})
.then(response => {
response.ok ? alert('deu certo') : alert('deu errado')
})
};
stream.getTracks().forEach(tack => tack.stop())
}
}
depois recebo no back, converto em audio para salvar o arquivo
router.post('/postAudio', jsonParser, async (req, res) => {
var body = req.body
let date = Date.now()
console.log(body);
let savedFile = await saveBase64File(`audio_${date}`, body.data)
body.filepath = savedFile.filepath
body.filename = savedFile.filename
console.log(body);
emiter.emit('sendNewAudioMessage', body)
res.status(200).send({ audio: 'Audio recebido' })
})
async function saveBase64File(filename, base64Data) {
let split64 = base64Data.split(';')
let extensao = split64[0].split('/')[1]
//console.log(base64Data.split(',')[1]);
try {
let folderPath = path.join(__dirname, '..', '..', 'mideas');
try {
await fs1.access(folderPath);
} catch (error) {
await fs1.mkdir(folderPath);
}
const filepath = path.join(__dirname, '..', '..', 'mideas', `${filename}.${extensao}`);
try {
await fs1.access(filepath);
console.log('Arquivo já existe, não é necessário salvar novamente:', filepath);
return { filepath, filename };
} catch (error) {
await fs1.writeFile(filepath, base64Data.split(',')[1], 'base64');
return {
filepath: filepath,
filename: `${filename}.${extensao}`
};
}
} catch (error) {
console.error(`ERRO AO SALVAR ARQUIVO:\n ${error}`);
return { filepath: false, filename: false };
}
}
e por ultimo envio:
emiter.on('sendNewAudioMessage', (object) => {
console.log('aqui');
client.sendFile(object.to, object.filePath)
})
Porém ele sempre dá erro, poderiam me ajudar a entender se é meu base64? Desde já muito grato!