Отправка данных аудиозаписи в реальном времени через сокет

Я пытаюсь отправить фрагменты живой записи через сокет, используя файловую систему 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 и заметил различия даже в начале данных внутри файлов. Любая дополнительная информация будет очень полезна. Спасибо!

Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
0
0
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  const recordingInstance = new Audio.Recording();
  await recordingInstance.prepareToRecordAsync({
    android:{
      extension: '.wav',
      linearPCMIsBigEndian:true,

    },
    ios:{
      extension: '.wav',
      linearPCMIsBigEndian:false,
      },

  });

Установите linearPCMIsBigEndian:false и extension: '.wav' и всё заработает.

ВАЖНО: Длина чанка должна быть кратна 24!

Другие вопросы по теме

Похожие вопросы