[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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章