基于C语言实现PCM音频流或音频文件重采样(48K到16K)

由于云厂商SDK需要的音频采样率是16K的,而SFU回调上来的流是48K的,所以我们还需要对PCM音频数据进行重采样处理。

​ 转换的原理比较简单,从48KHz降到16KHz,降了3倍,也就是说在同一时间的单位区间内,48KHz采样了3个点,而16KHz只采样了1个点,即从48KHz的 PCM流中每读取3个数据,就要根据这3个数据去推算得到1个数据,而这个数据对应的就是16KHz PCM流中的一个数据。

我们有很多种方法可以由3个数据得到1个数据,如取平均值,取采样点等方法:

(1). 取平均值:

取3个点,相加后求平均值。这样的效果并不好,转换后声音会有杂音。这是因为转换成16kHz的采样率时,根据奈奎斯特采样定律,当采样频率fs.max大于信号中最高频率fmax的2倍时(fs.max>2fmax),,那么根据这些抽样值就能完全恢复原信号,所以转换成16kHz的采样率时,不能有8K以上的频率。而对3个点求平均值,是会有概率存在着8khz以上的频段,故效果并不好。

(2). 取特征点:

取3个采样点中固定位置的某个点,如固定取3个点中的第一个点,然后合并成新的数据流。这样的效果,实测比较清晰,虽然有概率会丢失部分声音细节,但是整体还是能够满足语音识别。

综上所述,我们采取第一个特征点的方法。

具体实现如下

C语言实现

处理pcm流:

/** PCM frame. */
typedef struct {uint8_t        *buf;int             len;int             sample_rate;int             sample_depth;
} pcm_frame_t;void pcm_resample_16k(const pcm_frame_t *frame_in, pcm_frame_t *frame_out)
{int i;int magnification = frame_in->sample_rate / 16000;frame_out->buf = frame_in->buf;frame_out->len = frame_in->len / magnification;frame_out->sample_rate = 16000;frame_out->sample_depth = frame_in->sample_depth;for (i = 0; i < frame_out->len; i++) {frame_out->buf[i] = frame_in->buf[i*magnification]; /* 取第一个特征值 */}/* 如果按照16bit来 */
//     for (i = 0; i < len / 3; i++) {
//         if (0 == (i % 2)) {
//             buf[i] = buf[i*3+2];
//         } else {
//             buf[i] = buf[i*3];
//         }
//     }
}

处理pcm文件:

void pcm_resample(void)
{short read_buf = 0;int size = 0;int cnt = 0;FILE *fp = fopen("in.pcm", "rb+");FILE *fp_out = fopen("out.pcm", "wb+");while (!feof(fp)) {size = fread(&read_buf, 2, 1, fp); // 16bit,所以需要一次读两个字节if (size > 0) {cnt++;if (cnt == 3) { //每采集到3个点cnt = 0; // 重置计数fwrite(&read_buf, 2, 1, fp_out); //写入数据}}}fclose(fp);fclose(fp_out);
}

基于C语言实现PCM音频流或音频文件重采样(48K到16K)相关推荐

  1. python 音频文件重采样8K转16K

    安装相关包: pip install librosa pip install soundfile 运行代码: import librosa import soundfilefilename = r'd ...

  2. 基于C语言实现把WAV双声道文件差分成两个单声道文件

    本deemo基于下面这篇文章的deemo实现 基于C语言的 WAV 文件双声道转单声道的实现_快乐的老鼠的博客-CSDN博客_wav 双声道转单声道 #include <stdio.h> ...

  3. 如何将Pcm格式的音频文件转换成Wave格式的文件

    最近在做一款变声App,其中就用到了将pcm格式转wave格式,下面贴出源代码,希望带有需求的童鞋有帮助!!!这里是c++语言写的,也可以用java实现.当然java调用native函数要用到jni技 ...

  4. 基于C语言的8深度灰度BMP文件读写

    参考文献:https://wenku.baidu.com/view/20f7a35852d380eb62946ded#

  5. 录音读写程序c语言,如果用c语言程序读取一段音频文件要如何做,具体要调用哪些函数,在网上搜索了半天,乱七八糟的,找不到什么有用的信息...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 /* 源码:音乐播放 作者:傻傻_痴痴 来源:c4droid吧(欢迎加入交流) 日期:2014.3.30 若要转载源码,请注明作者出处,禁止修改为自己名义 ...

  6. 使用python .pcm音频文件多声道数据分离与转化为浮点数

    有些设备采集的音频文件格式为pcm格式,其本身就为ad转化后的产物,在我的嵌入式实现中为节省计算资源,直接对其进行声道分离. 如何使用python语言将pcm音频流文件转为数值矩阵,多声道进行声道分离 ...

  7. windows下使用Qt播放PCM音频文件(通过QAudioOutput和QIODevice)

    在博主之前的博文<windows下使用FFmpeg生成PCM音频文件并播放(通过命令的方式)>(链接https://blog.csdn.net/u014552102/article/det ...

  8. 百度音频文件转写正式上线商用

    今天给大家分享低至每小时0.6元的音频文件转写正式上线商用啦!百度音频文件转写自邀测以来,在视频直播字幕.会议访谈转写等场景得到广泛应用.百度大脑语音方向音频文件转写正式上线商用,目前支持16k音频的 ...

  9. android ios 音频寻,多媒体-iOS与Android的音频文件互通

    前言 在实际的开发中,关于音频的传输上,iOS与Android的通用性一直是一个不可回避的问题.下面记录下比较好的解决方案. 现状 苹果的音频格式安卓全不支持. 安卓的音频格式,苹果基本也不支持 解决 ...

最新文章

  1. OpenResty搭建高性能服务端
  2. php preg_match 只匹配第一个字符_PHP正则表达式核心技术完全详解 第12节知识补充 断言匹配
  3. python引用numpy出错_引用numpy出错详解及解决方法
  4. 【每日一算法】最长公共前缀
  5. iOS 使用FFmpeg实现视频H264编码
  6. oracle数据库日期时间参数大全(一)
  7. 如何用命令行给mySQL添加用户
  8. 2014年5月生日会
  9. java中对list监听_java – Guava:为ListenableFuture回调和监听器设置默认的Executor
  10. 请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句
  11. 综合能源系统及其应用
  12. BulletProof vs snark vs stark性能对比
  13. cad相贯展开图lisp_cad相贯线的画法
  14. java毕业设计校园互助平台校园帮帮网站源码+lw文档+mybatis+系统+mysql数据库+调试
  15. 【SSM架构】博客系统开发(七)-登陆界面
  16. 推荐假期看的几部黑客电影
  17. 【Python游戏】基于化学方程式的基础上,用Python实现一个消灭泡泡小游戏 | 附源码
  18. H5入门四:CSS选择的艺术
  19. 趣味三角——第7章——圆的内外旋轮线
  20. CMS收集器几个参数详解 -XX:CMSInitiatingOccupancyFraction, CMSFullGCsBeforeCompaction

热门文章

  1. oracle 表分区,根据时间按月分区做一次记录
  2. MQ Cannot convert from [[B] to [] for GenericMessage
  3. 云原生与大数据、AIoT、开源的碰撞之路——专访小米崔宝秋
  4. 安装itunes需要管理员身份_安装itunes没有足够权限启动系统win10
  5. 大数据量的兴趣点如何在Cesium快速加载?(weixin公众号【图说GIS】)
  6. 矩阵三元组的快速转置
  7. arcgis api for js 4.19 尝鲜(React + ts+ arcgis api)
  8. 路由器配置——基于区域的OSPF,MD5认证
  9. c++ 一维向量,和二维向量的基本使用
  10. python中字典合并方法