繁体   English   中英

如何减少使用 ENCODING_PCM_16BIT 和采样率 8000 Hz 录制的音频数据?

[英]How to reduce audio data recorded with ENCODING_PCM_16BIT and sample rate 8000 Hz?

我的目标是减少react-native-recording生成的音频数据大小。

预期结果:音频文件大小应在每 1 秒音频 / Opus Voice 比特率 5.17 KiB 和采样率 8 kHz 的 5200 字节到 5400 字节之间。

实际结果:音频文件大小是预期结果的 3 倍。 例如录制这个单词A guest for Mr. Jerry / 1.6 秒的音频将具有大约 28,000 字节的数据大小。

重要的

我计划编写自定义原生模块来实现这个目标。 如果您喜欢,请随时留下链接供我阅读。

TL:博士

我的最终目标是通过 WebSocket 发送音频数据。 我特意去掉了 WebSocket。

重现步骤:

  1. 添加监听器
  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();
    };
  });
  1. 录制音频
  const startAsync = async () => {
    await PermissionsAndroid.requestMultiple([
      PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
    ]);

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

    Recording.start();
  };
  1. 保存音频
  const saveAudio = async () => {
    const promise = await RNSaveAudio.saveWav(path, audioInt16);
    console.log('save audio', promise, path);
  };
  1. 播放音频
  const playAudio = () => {
    if (player.canPrepare || player.canPlay) {
      player.prepare((err) => {
        if (err) {
          console.log(err);
        }
        console.log('play audio', player.duration);
        player.play();
      });
    }
  };

我的目标是减少react-native-recording生成的音频数据大小。

预期结果:音频文件大小应在每 1 秒音频 / Opus Voice 比特率 5.17 KiB 和采样率 8 kHz 的 5200 字节到 5400 字节之间。

实际结果:音频文件大小是预期结果的3倍。 例如录制这个单词A guest for Mr. Jerry / 1.6 秒的音频将具有大约 28,000 字节的数据大小。

重要的

我计划编写自定义原生模块来实现这个目标。 如果您喜欢,请随时留下链接供我阅读。

TL:博士

我的最终目标是通过 WebSocket 发送音频数据。 我特意去掉了 WebSocket。

重现步骤:

  1. 添加监听器
  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();
    };
  });
  1. 录制音频
  const startAsync = async () => {
    await PermissionsAndroid.requestMultiple([
      PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
    ]);

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

    Recording.start();
  };
  1. 保存音频
  const saveAudio = async () => {
    const promise = await RNSaveAudio.saveWav(path, audioInt16);
    console.log('save audio', promise, path);
  };
  1. 播放音频
  const playAudio = () => {
    if (player.canPrepare || player.canPlay) {
      player.prepare((err) => {
        if (err) {
          console.log(err);
        }
        console.log('play audio', player.duration);
        player.play();
      });
    }
  };

另一种选择是调查袜子。 它是开源的,可以做到这一点以及更多。 http://sox.sourceforge.net/

例如

sox <in file> -r <new sample rate> <out file>

soxi 332188.flac
Input File     : '332188.flac'
Channels       : 1
Sample Rate    : 384000
Precision      : 16-bit
Duration       : 00:00:02.01 = 770048 samples ~ 150.4 CDDA sectors
File Size      : 836k
Bit Rate       : 3.34M
Sample Encoding: 16-bit FLAC
Comment        : 'Comment=Processed by SoX'

sox 332188.flac -r 48000 332188_new_sample_rate.flac

soxi 332188_new_sample_rate.flac
Input File     : '332188_new_sample_rate.flac'
Channels       : 1
Sample Rate    : 48000
Precision      : 16-bit
Duration       : 00:00:02.01 = 96256 samples ~ 150.4 CDDA sectors
File Size      : 114k
Bit Rate       : 456k
Sample Encoding: 16-bit FLAC
Comment        : 'Comment=Processed by SoX'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM