如何减少用16位编码和8000赫兹采样率记录的音频数据?

xzv2uavs  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(708)

我的目标是减少react本机录制生成的音频数据大小。
预期结果:音频文件大小应在5200字节到5400字节/1秒之间,音频/opus语音比特率为5.17 kib,采样率为8 khz。
实际结果:音频文件大小是预期结果的3倍。例如记录这个单词 A guest for Mr. Jerry /1.6秒的音频数据大小约为28000字节。

重要

我计划编写自定义本机模块来实现这一目标。如果你愿意,请留下一个链接给我阅读。

tl:博士

我的最终目标是通过websocket发送音频数据。我故意取下了网袋。
复制步骤:
添加侦听器

let audioInt16: number[] = [];
  let listener;

  React.useEffect(() => {
    // eslint-disable-next-line react-hooks/exhaustive-deps
    listener = Recording.addRecordingEventListener((data: number[]) => {
      console.log('record', data.length);
      // eslint-disable-next-line react-hooks/exhaustive-deps
      audioInt16 = audioInt16.concat(data);
    });

    return () => {
      listener.remove();
    };
  });

录制音频

const startAsync = async () => {
    await PermissionsAndroid.requestMultiple([
      PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
    ]);

    Recording.init({
      bufferSize: 4096,
      sampleRate: 8000,
      bitsPerChannel: 16,
      channelsPerFrame: 1,
    });

    Recording.start();
  };

保存音频

const saveAudio = async () => {
    const promise = await RNSaveAudio.saveWav(path, audioInt16);
    console.log('save audio', promise, path);
  };

播放音频

const playAudio = () => {
    if (player.canPrepare || player.canPlay) {
      player.prepare((err) => {
        if (err) {
          console.log(err);
        }
        console.log('play audio', player.duration);
        player.play();
      });
    }
  };
vbkedwbf

vbkedwbf1#

更新:
我刚刚做了计算,samplerate是8000,单声道每个采样16位(2字节),也就是每秒160000字节,所以1.6秒的音频是25600字节,这就是你得到的。
要获得每秒5200到5400字节的速度,必须向后工作。每个样本选择8位(1字节)。所以你只需要5200到5400个采样器。
pcm数据是原始音频样本。只有通过音频压缩、mp3或aac或其他音频压缩编解码器,才能将更高质量的音频压缩成更少的字节。
原始答复:
看起来rnsaveaudio.savewav的固定采样率为44100:
https://github.com/navrajkambo/rnsaveaudio/blob/master/android/src/main/java/com/navraj/rnsaveaudio/rnsaveaudiomodule.java

output = new DataOutputStream(new FileOutputStream(path));
            // WAVE header
            // see http://ccrma.stanford.edu/courses/422/projects/WaveFormat/
            writeString(output, "RIFF"); // chunk id
            writeInt(output, 36 + data.length); // chunk size
            writeString(output, "WAVE"); // format
            writeString(output, "fmt "); // subchunk 1 id
            writeInt(output, 16); // subchunk 1 size
            writeShort(output, (short) 1); // audio format (1 = PCM)
            writeShort(output, (short) 1); // number of channels
            writeInt(output, 44100); // sample rate
            writeInt(output, 44100 * 2); // byte rate
            writeShort(output, (short) 2); // block align
            writeShort(output, (short) 16); // bits per sample
            writeString(output, "data"); // subchunk 2 id
            writeInt(output, data.length); // subchunk 2 size

您只需编写自己的wave文件编写器,就可以根据本例编写更多关于wave格式的内容:http://soundfile.sapp.org/doc/waveformat/

相关问题