音视频数据处理入门:PCM采样数据处理

PCM播放测试命令

1、如果没有pcm文件,则用mp3或其它文件转换:

ffmpeg -i test.mp3 -acodec pcm_s16le -f s16le -ac 2 -ar 44100 test.pcm
// -acodec指定编码器,-f强制文件格式,-ar 采样率

2、用ffplay播放原始音频采集数据:ffplay -ar 44100 -ac 2 -f s16le -i xxx.pcm

如果是字符界面则会报错:image-20210418145103979

解决:添加选项-nodisp

image-20210418145200289

查看音频文件信息:ffprobe xxx.mp3


音频数据处理示例:

1、将PCM16LE双声道数据中的左右声道数据分离成两个文件

16bit,每个采样2个字节,LE小端模式,左声道数据在前,右声道数据在后。每次取4字节,分拆后写入到输出文件。

#include <stdio.h>
#include <stdlib.h>

// 将PCM16LE双声道数据中左右声道的数据分离成两个文件
int pcm16le_split(char *pcmfile) {
    
    FILE *sfp = fopen(pcmfile, "r"); // read only
    FILE *dfp1 = fopen("output_l.pcm", "w+"); //read and write
    FILE *dfp2 = fopen("output_r.pcm", "w+");

    char *sample = malloc(sizeof(char) * 4); // 4Bytes

    while (!feof(sfp)) { // end of file
        fread(sample, sizeof(char), 4, sfp);
        fwrite(sample, sizeof(char), 2, dfp1); //L
        fwrite(sample + 2, sizeof(char), 2, dfp2); //R
    }

    free(sample);
    fclose(sfp);
    fclose(dfp1);
    fclose(dfp2);
    return 0;
}


int main(int argc, char const* argv[])
{
    pcm16le_split("samples/test.pcm");
 	return 0;
}

2、将PCM16LE双声道音频采样数据中左声道的音量降一半。

image-20210418162941690

播放效果不明显的话可以增大缩小倍数,或将两个声道音量都减小。

3、 音频采样数据的声音速度提高一倍

image-20210418163137715

原来的音频文件中采样点共有:44100*20*2 = 160W个,现在对这些数据间隔采样,采样点减半,文件大小减半,视频时长减半。

4、将PCM16LE双声道数据转换成PCM8音频采样数据

image-20210420103334245

播放音质差了很多,有些沙沙的噪声。

5、从PCM16LE单声道数据中截取一段数据,并输出截取数据的样值

image-20210420111729941

调用方式:

// 原视频44100hz, 单声道,88w个点,20秒
// 从第2000个采样点开始截取,截取8w个点, 约1s   

pcm16le_cut_single_chn("samples/single.pcm", 2000, 80000); 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值