[英]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 字节的数据大小。
我计划编写自定义原生模块来实现这个目标。 如果您喜欢,请随时留下链接供我阅读。
我的最终目标是通过 WebSocket 发送音频数据。 我特意去掉了 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();
});
}
};
我的目标是减少react-native-recording生成的音频数据大小。
预期结果:音频文件大小应在每 1 秒音频 / Opus Voice 比特率 5.17 KiB 和采样率 8 kHz 的 5200 字节到 5400 字节之间。
实际结果:音频文件大小是预期结果的3倍。 例如录制这个单词A guest for Mr. Jerry
/ 1.6 秒的音频将具有大约 28,000 字节的数据大小。
我计划编写自定义原生模块来实现这个目标。 如果您喜欢,请随时留下链接供我阅读。
我的最终目标是通过 WebSocket 发送音频数据。 我特意去掉了 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();
});
}
};
另一种选择是调查袜子。 它是开源的,可以做到这一点以及更多。 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.