[Video and Audio Data Processing] 截取部分PCM16LE单声道音频采样数据

本文介绍了一段C代码,用于裁剪16位小端字节顺序的单声道PCM音频文件。代码从指定位置开始,裁剪指定长度的音频,并将结果保存到新的PCM文件中。同时,输出裁剪音频的采样数据,便于进一步分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 代码

extern "C"
{
#ifdef __cplusplus
#define __STDC_CONSTANT_MACROS

#endif

}
extern "C" {

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
}






/**
 * Cut a 16LE PCM single channel file.
 * @param url        Location of PCM file.
 * @param start_num  start point
 * @param dur_num    how much point to cut
 */
int simplest_pcm16le_cut_singlechannel(const char* url, int start_num, int dur_num) {
	FILE* fp = fopen(url, "rb+");
	FILE* fp1 = fopen("output_cut.pcm", "wb+");
	FILE* fp_stat = fopen("output_cut.txt", "wb+");

	unsigned char* sample = (unsigned char*)malloc(2);

	int cnt = 0;
	while (!feof(fp)) {
		fread(sample, 1, 2, fp);
		if (cnt > start_num && cnt <= (start_num + dur_num)) {
			fwrite(sample, 1, 2, fp1);

			short samplenum = sample[1];
			samplenum = samplenum * 256;
			//获取高8位的采样值
			samplenum = samplenum + sample[0];
			//获取整体的采样值

			fprintf(fp_stat, "%6d,", samplenum);
			//以%6d的格式,向输出流fp_stat写入samplenum的数据
			if (cnt % 10 == 0)
				fprintf(fp_stat, "\n", samplenum);
			//以\n的格式-换行,向输出流fp_stat写入samplenum的数据
		}
		cnt++;
	}

	free(sample);
	fclose(fp);
	fclose(fp1);
	fclose(fp_stat);
	return 0;
}




int main()
{
	simplest_pcm16le_cut_singlechannel("drum.pcm", 2360, 120);
	return 0;
}

音源获取:https://github.com/leixiaohua1020/simplest_mediadata_test

1. 运行效果

原始音频文件:
在这里插入图片描述

在这里插入图片描述

处理之后的截取的音频文件:

在这里插入图片描述

输出的 采样数据:

在这里插入图片描述

参考链接:

https://blog.youkuaiyun.com/leixiaohua1020/article/details/50534316

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值