[Video and Audio Data Processing] PCM 16 bit左右声道数据分离

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打开,注意设置为单声道;

在这里插入图片描述

左声道:

在这里插入图片描述

右声道:

在这里插入图片描述

参考链接:

  1. https://blog.csdn.net/leixiaohua1020/article/details/50534316
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章