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