PCM符号なし16ビットスモールエンドストレージファイルの読み取りと解析のまとめ

6582 ワード

PCM符号なし16ビットスモールエンドストレージファイルの読み取りと解析のまとめ


仮に小端格納方式のファイルに0 xF 3 FFが格納されているとしたら、格納されている実際のデータはどのくらいですか?真実のデータは-13であるべきであり、小端記憶方式であるため高位と低位を交換すべきである0 xFFF 3であり、最高位が1であるため、符号補完が要求される、すなわち0 x 800 D、すなわち10進数の-13である.
さらに、0 xF 3 FFをメモリに読み出し、ポインタ位置が0 x 000000001であると仮定し、cpuが小端記憶の方式であれば、高バイト記憶高位、低バイト記憶低位であれば、0 x 000001記憶oxFF、0 x 000002記憶0 xF 3であり、このとき記憶されたデータは、実際に記憶されたデータと同じである.いずれも0 xFFF 3です.したがって,この場合に算術演算加減乗除を行うことは問題ない.高バイトと低バイトを交換する必要はありません.
小例では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);
    }