音频 - Android 8k 8bit mono PCM
伊谢尔伦
伊谢尔伦 2017-04-17 12:05:15
[Android讨论组]

有个场景需要用 Android 手机采样 8k 8bit 单声道原始 PCM 流,但是 Android API 不支持 8bit,只能通过算法由 16bit 手动转换。找了一些转换方法,但都不灵光,大伙帮忙想点办法吧~

采样大致的样子:

private static final int SAMPLERATE = 8000;
private static final int DSAMPLERATE = 16000;
private static final int SOURCE = MediaRecorder.AudioSource.MIC;
private static final int CHANNEL = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private static final int STREAM_TYPE = AudioManager.STREAM_MUSIC;
private static final int TRACK_MODE = AudioTrack.MODE_STREAM;

// 16bit 采样转换成 8bit,比特率会减半,故在采样时用两倍的采样率
int rate = (8 == bit) ? DSAMPLERATE : SAMPLERATE;
minSize = AudioRecord.getMinBufferSize(rate, CHANNEL, AudioFormat.ENCODING_PCM_16BIT);

if (minSize > 128) {
    AudioRecord rec = new AudioRecord(SOURCE, rate, CHANNEL,
        AudioFormat.ENCODING_PCM_16BIT, minSize);
    rec.startRecording();
    while (isRec) {
        rec.read(data, 0, block);
        // balabala
    }
    rec.stop();
    rec.release();
}

转换调用:

for (int i = 0; i < out.length; i++) {
    out[i] = (byte) (data[i * 2 + 1] - 0x80);
}

播放:

AudioTrack track = new AudioTrack(STREAM_TYPE, SAMPLERATE, CHANNEL,
    ((16 == bit) ? AudioFormat.ENCODING_PCM_16BIT
            : AudioFormat.ENCODING_PCM_8BIT), minSize, TRACK_MODE);
track.play();
while(...) {
    track.write(data, offset, length);
}
track.stop();
track.release();

如果 bit 是 16,采样和播放都是没有问题的,换成 8 播放会是一片机械杂音,不知道肿么办鸟。可以确认的是,Android 采样的数据是小端的字节,所以让后面的字节在高位。

已解决,详见上面的代码吧~

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号