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
如果是字符界面则会报错:
解决:添加选项-nodisp
查看音频文件信息: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双声道音频采样数据中左声道的音量降一半。
播放效果不明显的话可以增大缩小倍数,或将两个声道音量都减小。
3、 音频采样数据的声音速度提高一倍
原来的音频文件中采样点共有:44100*20*2 = 160W
个,现在对这些数据间隔采样,采样点减半,文件大小减半,视频时长减半。
4、将PCM16LE双声道数据转换成PCM8音频采样数据
播放音质差了很多,有些沙沙的噪声。
5、从PCM16LE单声道数据中截取一段数据,并输出截取数据的样值
调用方式:
// 原视频44100hz, 单声道,88w个点,20秒
// 从第2000个采样点开始截取,截取8w个点, 约1s
pcm16le_cut_single_chn("samples/single.pcm", 2000, 80000);