PCM无符号16位小端存储文件读取和解析总结

本文详细解析了小端存储方式下PCM音频文件的读取与解析过程,通过实例讲解了如何正确理解存储数据,并提供了将PCM音频数据音量减半的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PCM无符号16位小端存储文件读取和解析总结

假设小端存储方式的文件中存储了0xF3FF ,存储的真实的数据是多少呢?真实的数据应该是-13,因为是小端存储方式所以
应该把高位和低位互换即0xFFF3,由于最高位为1,所以要求补码才对,即0x800D,即十进制的-13。

再假设把0xF3FF读取到内存中, 读取到指针位置为0x00000001中,如果cpu是小端存储的方式,那么高字节存储高位,低字节存储低位,那么0x00000001存储oxFF, 0x00000002存储0xF3,这个时候存储的数据和真实存储的数据一样的。都是0xFFF3。所以这时候对其进行算术运算加减乘除是没有问题的。不需要再对其高字节和低字节互换了。

小例子,对pcm数据的音量减半

extern "C"
JNIEXPORT void JNICALL
Java_com_liuxin_audiolib_LXPlayer_testAudio(JNIEnv *env, jobject thiz, jstring source,
                                            jstring dest) {
    const char *sourceUrl = env->GetStringUTFChars(source, NULL);
    const char *destUrl = env->GetStringUTFChars(dest, NULL);

    FILE *fp = fopen(sourceUrl, "rb+");

    FILE *fp_stat = fopen(destUrl, "wb+");

    unsigned char *sample = (unsigned char *) malloc(2);

    int cnt = 0;
    while (!feof(fp)) {
        fread(sample, 1, 2, fp); 
            short *sampleP= reinterpret_cast<short *>(sample);
            short  samplenum = (*sampleP)/2;
            fwrite(sample,1,2,fp_stat);
        cnt++;
    }

    free(sample);
    fclose(fp);
    fclose(fp_stat);
    env->ReleaseStringUTFChars(source, sourceUrl);
    env->ReleaseStringUTFChars(dest, destUrl);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值