我正在尝试使用 React Native 中的 expo-file-system 通过套接字发送实时录音的块。 问题是,当我在仍在录制时发送音频块时,数据会以某种方式损坏,当我在服务器中对其进行解码时,我什至无法播放该音频。 但如果我等待录音停止然后开始发送数据,音频结果就可以了。
这是功能:
export async function uploadChunksToServer(recordingInstance, chunkSize, delayBetweenChunks) {
let info = await FileSystem.getInfoAsync(recordingInstance.getURI());
let uri = info.uri;
let currentPosition = 0;
let current_file_size = info.size;
let prev_pos = 0;
await sleep(delayBetweenChunks);
do{
try{
let info = await FileSystem.getInfoAsync(recordingInstance.getURI());
current_file_size = info.size;
if (currentPosition + chunkSize >= current_file_size && currentPosition === prev_pos && prev_pos !== 0){
console.log('blocked')
continue;
}
else{
const fileChunk = await FileSystem.readAsStringAsync(uri, {
encoding: FileSystem.EncodingType.Base64,
})
currentPosition += chunkSize;
socket.emit('audioData', fileChunk);
}
prev_pos = currentPosition;
}
catch (e) {
console.log(e);
}
if (recordingInstance._isDoneRecording && current_file_size - currentPosition < chunkSize){
const fileChunk = await FileSystem.readAsStringAsync(uri, {
encoding: FileSystem.EncodingType.Base64,
position: currentPosition,
length: current_file_size - currentPosition
})
currentPosition += current_file_size - currentPosition;
socket.emit('recording', fileChunk);
break
}
} while(currentPosition < current_file_size)
console.log("final report >> ", currentPosition, current_file_size)
console.log('exiting')
const fileChunk = await FileSystem.readAsStringAsync(uri, {
encoding: FileSystem.EncodingType.Base64,
})
socket.emit('done_recording', fileChunk);
}
在这里,我发送了相同的音频两次并将其保存在两个文件中,一次是在录制时,一次是在录制停止后。 我使用 Beyond Compare 比较了它们,甚至在文件内数据的开头也注意到了差异。 任何信息,将不胜感激。谢谢!
const recordingInstance = new Audio.Recording();
await recordingInstance.prepareToRecordAsync({
android:{
extension: '.wav',
linearPCMIsBigEndian:true,
},
ios:{
extension: '.wav',
linearPCMIsBigEndian:false,
},
});
设置
linearPCMIsBigEndian:false,
就可以了