音频demo:将PCM数据左右声道分离

1、README

a. 编译
bash 复制代码
$ make 	# or `make CC=your-corosscompile-gcc`
b. 使用

注意:分离左右声道的前提是输入的PCM文件(数据)是双声道。

bash 复制代码
$ ./pcm_channels_split
Usage: ./pcm_channels_split in.pcm out_l.pcm out_r.pcm
examples:
         ./pcm_channels_split ./audio/test_22050_16_2.pcm ./test_22050_16_1-l.pcm ./test_22050_16_1-r.pcm
         ./pcm_channels_split ./audio/test_44100_16_2.pcm ./test_44100_16_1-l.pcm ./test_44100_16_1-r.pcm
c. 附录(demo目录架构)
bash 复制代码
.
├── audio
│   ├── test_22050_16_1-l.pcm
│   ├── test_22050_16_1-r.pcm
│   ├── test_22050_16_2.pcm
│   ├── test_44100_16_1-l.pcm
│   ├── test_44100_16_1-r.pcm
│   └── test_44100_16_2.pcm
├── docs
│   └── PCM音频数据 - 简书.mhtml
├── main.c
├── Makefile
└── README.md

2、主要代码片段

main.c
c 复制代码
#include <stdio.h>
#include <stdlib.h>

int pcm_s16le_split(const char* file, const char* out_lfile, const char* out_rfile);

int main(int argc, char *argv[])
{
	if (argc != 4)
	{	
		printf("Usage: %s in.pcm out_l.pcm out_r.pcm\n", argv[0]);
		printf("examples: \n"
			   "\t %s ./audio/test_22050_16_2.pcm ./test_22050_16_1-l.pcm ./test_22050_16_1-r.pcm\n"
			   "\t %s ./audio/test_44100_16_2.pcm ./test_44100_16_1-l.pcm ./test_44100_16_1-r.pcm\n",
			   argv[0], argv[0]);
		return -1;
	}

	/* 注意:分离左右声道的前提是输入的PCM文件(数据)是双声道 */
	pcm_s16le_split(argv[1], argv[2], argv[3]);

	return 0;
}

int pcm_s16le_split(const char* file, const char* out_lfile, const char* out_rfile)
{
	FILE *fp = fopen(file, "rb+");
	if (fp == NULL) {
		printf("open %s failed\n", file);
		return -1;
	}

	FILE *fp1 = fopen(out_lfile, "wb+");
	if (fp1 == NULL) {
		printf("open %s failed\n", out_lfile);
		return -1;
	}

	FILE *fp2 = fopen(out_rfile, "wb+");
	if (fp2 == NULL) {
		printf("open %s failed\n", out_rfile);
		return -1;
	}

	char * sample = (char *)malloc(4);
	while(1) {
		int readbytes = fread(sample, 1, 4, fp);
		if(readbytes <= 0)
		{
			// 没有数据就不要写了
			break;
		}

		// L
		fwrite(sample, 1, 2, fp1);
		// R
		fwrite(sample + 2, 1, 2, fp2);
	}
	free(sample);

	fclose(fp);
	fclose(fp1);
	fclose(fp2);
	return 0;
}

3、demo下载地址(任选一个)

相关推荐
刀客Doc4 小时前
复盘Netflix的2025:广告业务、线下业态和视频播客
人工智能·音视频
EasyGBS6 小时前
EasyGBS助力智慧医院打造全方位视频监控联网服务体系
网络·音视频
数字孪生家族6 小时前
视频孪生与空间智能:重构物理世界的时空认知范式
音视频·空间智能·数字孪生头部企业·视频孪生与空间智能融合
Tracy97310 小时前
XMAU7118_VC1:16通道PDM到I²S/TDM音频转换器产品介绍
嵌入式硬件·音视频·智能硬件·xmos模组固件
做萤石二次开发的哈哈10 小时前
萤石开放平台机器人音视频对接流程
机器人·音视频
Tracy97311 小时前
OT83211_VC1:4通道 ASRC OTG(44.1kHz~192kHz)音频采样率转换器产品介绍
嵌入式硬件·音视频·xmos 模组·xmos模组固件
电鱼智能的电小鱼16 小时前
基于电鱼 AI 工控机的智慧工地视频智能分析方案——边缘端AI检测,实现无人值守下的实时安全预警
网络·人工智能·嵌入式硬件·算法·安全·音视频
音视频牛哥18 小时前
从协议规范和使用场景探讨为什么SmartMediaKit没有支持DASH
人工智能·音视频·大牛直播sdk·dash·dash还是rtmp·dash还是rtsp·dash还是hls
音视频牛哥19 小时前
SmartMediaKit:如何让智能系统早人一步“跟上现实”的时间架构--从实时流媒体到系统智能的演进
人工智能·计算机视觉·音视频·音视频开发·具身智能·十五五规划具身智能·smartmediakit
音视频牛哥20 小时前
超清≠清晰:视频系统里的分辨率陷阱与秩序真相
人工智能·机器学习·计算机视觉·音视频·大牛直播sdk·rtsp播放器rtmp播放器·smartmediakit