通过socket发送录音实时数据

问题描述 投票:0回答:1

我正在尝试使用 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 比较了它们,甚至在文件内数据的开头也注意到了差异。 任何信息,将不胜感激。谢谢!

react-native audio expo audio-streaming
1个回答
0
投票
  const recordingInstance = new Audio.Recording();
  await recordingInstance.prepareToRecordAsync({
    android:{
      extension: '.wav',
      linearPCMIsBigEndian:true,

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

  });

设置

linearPCMIsBigEndian:false,
就可以了

© www.soinside.com 2019 - 2024. All rights reserved.