我的目标是减少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();
});
}
};
1条答案
按热度按时间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
您只需编写自己的wave文件编写器,就可以根据本例编写更多关于wave格式的内容:http://soundfile.sapp.org/doc/waveformat/