在C程序中,读取pcm格式的音频

wonderfu3311 2009-05-22 10:16:23
各位大虾 帮帮忙啊
如题 ,pcm格式的文件属于二进制文件吗?
好像不能按二进制文件读取....
那么根据什么来判断输入信号的幅度值大小呢?
8位还是16位呢?

谢谢啊~~ 哪位有源程序最好啊~~~感激不尽!
...全文
1074 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxufeiyang 2009-06-01
  • 打赏
  • 举报
回复
学习
wonderfu3311 2009-05-26
  • 打赏
  • 举报
回复
感谢LS~~~呵呵
程序明白,可是输出就不理解了,希望能帮忙解答下



就是根据PCM文件所占容量的公式:   
存储量=(采样频率*采样位数*声道)*时间/8(单位:字节数)
我得到:10086的DTMF信号所占的存储容量为:

(44.1*1000*16*2)*1.15s/8=202860个字节


但是 一共有5个DTMF信号,也就是说,每个信号占了40572个字节

于是 我将这40572个自己读入buffer中,但是输出是


pcm=0 0 0 0 22


应该怎么辨别这5个信号的幅值大小呢?

每个信号间还有400ms的暂停时间,这部分是也算在编码里面了?还是?


问题比较多,呵呵 谢谢~~~
日光降临 2009-05-26
  • 打赏
  • 举报
回复

给你一段正确的,自己看吧. 我是在linux下编译的.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
int i;
FILE *fp1;
unsigned char buffer[256];//你定义的类型是整形, 长度是5,

fp1=fopen("test.pcm","rb+");

if(fp1==NULL)
{
printf("file can not be open \n");
exit (1);
}
else
printf("ok\n");

memset(buffer, 0, sizeof(buffer));
fread (&buffer, 32, 5, fp1);//你说32字节, 你写的怎么是40527?
for (i=0; i <= 4; i++)
{
printf("pcm=%d\n",buffer[i]);
}

return 0;
}
Treazy 2009-05-25
  • 打赏
  • 举报
回复
PCM数据就是一串数据流
8位或者16位是你采样数据的位数,是个已知量

wonderfu3311 2009-05-25
  • 打赏
  • 举报
回复
int main (void)
{
int i;
FILE *fp1;
int buffer[5];

fp1=fopen("d:\\10086.pcm","rb+");

if(fp1==NULL)
{ printf("file can not be open \n");
exit (1);
}
else

printf("ok\n");

fread (&buffer,40527,5,fp1);//从fp1指定的文件中,读取5个数据项,每个数据项长度为32个字节,放入buffer所指定的缓存区中
for (i=0;i<=4;i++)
{

printf("pcm=%d\n",buffer[i]);

}
system("pause");


}

大家再给帮帮忙,我现在编了这样一段程序,想实现上面的功能,但是输出总是不对
请问下问题究竟在哪里啊?

谢谢大虾们啦~~~~

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧