音频demo:将左右声道PCM数据合并

1、README

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

合并两个声道成为双声道,例如:

bash 复制代码
$ ./pcm_channel_merge ./audio/test_22050_16_1-l.pcm ./audio/test_22050_16_1-r.pcm out_44100_16_2.pcm
$ ./pcm_channel_merge ./audio/test_44100_16_1-l.pcm ./audio/test_44100_16_1-r.pcm out_44100_16_2.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_merge(const char* in_lfile, const char* in_rfile, const char* file);

int main(int argc, char *argv[])
{
	if (argc != 4)
	{	
		printf("Usage: %s in-channel-l.pcm in-channel-r.pcm out-channels-merge.pcm\n", argv[0]);
		printf("such as:\n"
			   "\t %s ./audio/test_22050_16_1-l.pcm ./audio/test_22050_16_1-r.pcm out_22050_16_2.pcm\n"
			   "\t %s ./audio/test_44100_16_1-l.pcm ./audio/test_44100_16_1-r.pcm out_44100_16_2.pcm\n",
			   argv[0], argv[0]);
		return -1;
	}

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

	return 0;
}

int pcm_s16le_merge(const char* in_lfile, const char* in_rfile, const char* out_file)
{
	FILE *fp1 = fopen(in_lfile, "rb+");
	if (fp1 == NULL) {
		printf("open %s failed\n", in_lfile);
		return -1;
	}

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

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

	char * sample = (char *)malloc(4);
	while(1) {
		int readbytes = 0;
		// L
		readbytes += fread(sample, 1, 2, fp1);
		// R
		readbytes += fread(sample + 2, 1, 2, fp2);
		if(readbytes == 0)
		{
			// 没有数据就不要再写入到输出文件中了
			break;
		}	

		fwrite(sample, 1, 4, fp);
	}
	free(sample);

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

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

相关推荐
EasyGBS1 小时前
ONVIF设备接入国标GB28181视频平台EasyGBS:不用国标也能一键拉流!
服务器·php·音视频
音视频牛哥4 小时前
SmartMediaKit 推拉流MP4录像实践:实时传输与本地留存一体化
音视频·rtmp推流录像·rtmp播放端录像·rtsp播放端录像·rtsp流录制·rtmp流录制·rtsp服务器录像
石臻臻的杂货铺5 小时前
做 AI 视频,先让 Blender 把镜头演一遍
人工智能·音视频·blender
ALINX技术博客5 小时前
【黑金云课堂】FPGA技术教程Vitis开发:SD卡WAV文件读取音频播放实验
fpga开发·音视频
砚凝霜5 小时前
软考网络工程师|第 2 章 信道延迟、传输介质、数据编码、数字调制、PCM 完整备考笔记
网络·笔记·pcm
沐禾安信1 天前
AVI 视频打不开?2026 四款转 MP4 工具封神
音视频·电脑录屏
兵叔物联1 天前
基于FFmpeg的短视频自动剪辑工具
ffmpeg·音视频
AORUO奥偌1 天前
从“拼凑”到“集成”:音视频系统如何重塑弱电智能化建设逻辑
音视频·公共广播系统·音视频系统·多媒体会议与ip广播系统·多媒体会议系统
禹亮科技1 天前
大型国企会议室音视频集成实战:3间120㎡空间Poly G7500+LED大屏+讯飞多语言会议系统落地方案
音视频·视频会议系统集成·上海禹亮科技·讯飞听见多语言会议系统·poly g7500
音视频牛哥1 天前
SmartMediaKit macOS版RTSP/RTMP低延迟播放器:技术架构、核心能力与应用实践
音视频·低延迟rtsp播放器·macos直播播放器·macos rtsp播放器·macos rtmp播放器·rtsp播放器mac版·rtmp播放器mac版