0. 代碼如下
extern "C"
{
#ifdef __cplusplus
#define __STDC_CONSTANT_MACROS
#endif
}
extern "C" {
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
}
/**
* Split Left and Right channel of 16LE PCM file.
* @param url Location of PCM file.
*
*/
int simplest_pcm16le_split(const char* url) {
FILE* fp = fopen(url, "rb+");
FILE* fp1 = fopen("output_l.pcm", "wb+");
FILE* fp2 = fopen("output_r.pcm", "wb+");
unsigned char* sample = (unsigned char*)malloc(4);
while (!feof(fp)) { //一直到找到文件結束符爲止
fread(sample, 1, 4, fp); //從fp每次取一個字節的數據,讀4次存到Buff裏面
//L
fwrite(sample, 1, 2, fp1); //從Buff裏面取數據,前2個字節存聲道的
//R
fwrite(sample + 2, 1, 2, fp2); //從Buff裏面取數據,後2個字節存聲道的
}
free(sample);
if (fp != NULL) //避免出現public_stream != nullptr報錯,
//注意文件被佔用的時候,編譯器也會報錯的。
fclose(fp);
if (fp1 != NULL)
fclose(fp1);
if (fp2 != NULL)
fclose(fp2);
return 0;
}
int main()
{
simplest_pcm16le_split("NocturneNo2inEflat_44.1k_s16le.pcm");
return 0;
}
音源文件獲取鏈接: https://github.com/leixiaohua1020/simplest_mediadata_test
PS:音源是肖邦的夜曲,很好聽哦。
注意fclose加上條件判斷,是爲了解決下面的編譯器error,當然即使你代碼包含這個,
若音頻文件被佔用了(比如已被一個播放器打開),編譯器也會給error,然後生成的兩個文件內容啥也木有。
1. 效果
用cool edit pro以44.1K, 16 bit 立體聲格式打開,可以看到左右聲道還是有差異的。
以下是數據分離之後的,用cool edit pro打開,注意設置爲單聲道;
左聲道:
右聲道:
參考鏈接:
- https://blog.csdn.net/leixiaohua1020/article/details/50534316