Я пытаюсь отправить фрагменты живой записи через сокет, используя файловую систему expo в родной реакции. Проблема в том, что когда я отправляю фрагменты аудио во время записи, данные каким-то образом искажаются, и когда я декодирую их на своем сервере, я даже не могу воспроизвести этот звук. Но если я подожду, пока запись остановится, а затем начну отправлять данные, звук будет в порядке.
Это функция:
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.info('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.info(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.info("final report >> ", currentPosition, current_file_size)
console.info('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 и extension: '.wav' и всё заработает.
ВАЖНО: Длина чанка должна быть кратна 24!