RecorderJs no elétron exporta objetos blob e os salva localmente usando o nó
recorderJs usa node para salvar em arquivos locais
Esta postagem do blog fala principalmente sobre como usar recorderJs para gravar em elétron e salvá-lo em um arquivo local usando o nó. Ele pode ser usado principalmente na função de salvar gravação em elétron, etc. Métodos semelhantes de upload de servidores de nó para salvar áudio e vídeo arquivos também podem ser usados para referência. O nó é necessário para operações de leitura e gravação de arquivos.
O front-end usa recorderJs para gravar áudio
Depois de usar recorderJs para gravar áudio no front-end, você pode usar recorder.exportWAV() para exportar o objeto blob e, em seguida, converter o objeto blob no formato de codificação base64, para que possa ser passado do front-end para o nó para processamento .
function createDownloadLink() {
recorder && recorder.exportWAV(function(cb) {
var a = new FileReader();
readBlobAsBase64(cb, function (dataurl){
audioBuffer = dataurl;
saveRecording(audioBuffer);
});
});
}
// 把blob对象转换为Base64
function readBlobAsBase64(blob, callback) {
var a = new FileReader();
a.onload = function(e) {
callback(e.target.result);};
a.readAsDataURL(blob);
}
O front-end passa para o nó por meio do aplicativo para salvar a operação.
O front end inicia uma operação de solicitação para o aplicativo e passa a codificação base64 obtida anteriormente como parâmetro para o nó. Como o objeto blob não pode ser passado diretamente aqui, o objeto blob é convertido para o formato de codificação base64 para transmissão.
Código de referência para início de solicitação de front-end:
app.once('setAudioCallback', callback);
app.send('setAudioFile', {
data: {
"audiofile": audioBuffer, // base64 编码格式
"savePath": savePath + '\\', // savePath 为保存的文件夹的绝对路径
"outfileName": saveName // saveName 为保存文件的文件名
},
callback: 'setAudioCallback' // 完成保存文件后的回调
});
nó executa uma operação de salvamento
Após o nó obter os parâmetros, ele executa uma operação de salvamento e verifica se os parâmetros recebidos estão vazios antes de realizar a operação de salvamento. Em seguida, converta os parâmetros do formato de codificação base64 em um buffer . Observe que o prefixo do formato de codificação base64 precisa ser removido antes de converter para um buffer . Caso contrário, após a operação de salvamento subsequente, será solicitado que o arquivo não possa ser reproduzido após abertura. Isso pode ocorrer porque o tipo de arquivo não é compatível, a extensão do arquivo está incorreta ou o arquivo está corrompido. . Código de referência do nó:
// 保存录音临时文件
ipc.on("setAudioFile", (event,data) => {
let info = {
"flag": false,
"message": ""
}
var audiofile = data.data.audiofile;
var savePath = data.data.savePath ? data.data.savePath : '';
var outfileName = data.data.outfileName;
if ((!audiofile || (!outfileName))){
info.message = '参数不正确'
event.sender.send(data.callback, info)
}
// base64编码转换为Buffer,需去除base64编码前缀
var dataBuffer = new Buffer(audiofile.replace(/^data:audio\/\w+;base64,/,""), 'base64');
// fs.writeFile异步保存文件
fs.writeFile(savePath + "sdasdaas.wav", dataBuffer, (err) => {
if (err) throw err;
console.log('文件已保存');
info.message = '文件已保存'
event.sender.send(data.callback, JSON.stringify(info))
})
})
fs.writeFile salva o buffer de forma assíncrona ou fs.writeFileSync salva o arquivo de forma síncrona
Aqui, fs.writeFile é usado para salvar arquivos de forma assíncrona ou fs.writeFileSync de forma síncrona . Diferentes métodos precisam ser selecionados em diferentes cenários. Se vários arquivos forem salvos ao mesmo tempo, um retorno de chamada será necessário após o salvamento. É mais conveniente escolher fs.writeFileSync para salvar arquivos de forma síncrona .
fs.writeFile assíncrono
fs.writeFile(savePath + "sdasdaas.wav", dataBuffer, (err) => {
if (err) throw err;
console.log('文件已保存')
info.message = '文件已保存'
event.sender.send(data.callback, JSON.stringify(info))
})
Sincronização fs.writeFileSync
fs.writeFileSync(savePath + "sdasdaas.wav", dataBuffer)
console.log('文件已保存')
info.message = '文件已保存'
event.sender.send(data.callback, JSON.stringify(info))
- Para obter informações sobre a sintaxe fs.writeFile e fs.writeFileSync , consulte aqui .
resumo
Estou pensando sobre esse problema de conversão de formato há vários dias e espero que esta postagem do blog possa ajudar amigos necessitados.