高高分求,Alaw 音频流 播放问题

shizhu820228 2014-05-06 09:26:23
我在语音卡的机器上截了一段 音频流(byte[])格式,
手动添加音频头

byte[] play(byte[] mWaveFile)
{
MemoryStream ms = new MemoryStream();
BinaryWriter mWriter = new BinaryWriter(ms);
// 开始准备WAV的文件头
char[] ChunkRiff = { 'R', 'I', 'F', 'F' };

char[] ChunkType = { 'W', 'A', 'V', 'E' };
char[] ChunkFmt = { 'f', 'm', 't', ' ' };
char[] ChunkData = { 'd', 'a', 't', 'a' };
int nLength = mWaveFile.Length - 8 + 44;
//将文件头写入wav文件
mWriter.Write(ChunkRiff);
mWriter.Write(nLength);
mWriter.Write(ChunkType);
mWriter.Write(ChunkFmt);
mWriter.Write(16); // 表示 FMT 的长度
mWriter.Write((short)6); //这个表示a law PCM
mWriter.Write((short)1); // nChannleNumber
mWriter.Write(8000); // nSampleRate
mWriter.Write(8000); // nBytesPerSecond
mWriter.Write((short)1); // nBytesPerSample
mWriter.Write((short)8); // nBitsPerSample
mWriter.Write(ChunkData);
// 数据块
mWriter.Write(mWaveFile.Length);
mWriter.Write(mWaveFile);
ms.Position = 0;
return ms.ToArray();

}

问题描述:
如果直接存储为.wav文件的话。。可以播放但是速度超快,时长大约是原文件的1/10。
而且这个头文件是 alaw格式的,SoundPlayer不支持播放,DirectSound可以播放但是有噪音
如果头文件改为PCM的,SoundPlayer可以播放,但是有噪音
问题:
1.我的问题就是想按正常速度播放这段Alaw流文件,应该是被压缩过的数据,但是怎么能知道解码方式。
2.用什么播放比较好(我试过SoundPlayer,DirectSound),做过的人,给点提示或者有代码更好。。

...全文
308 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shizhu820228 2014-05-07
  • 打赏
  • 举报
回复
现在通过DirectSound设置WaveFormat 可以播放语音流,用G711 解码,但是还是速度快, 有人知道原因吗
绿龙术士 2014-05-07
  • 打赏
  • 举报
回复
帮顶下。。。。。。。。。。。。。。
xdashewan 2014-05-07
  • 打赏
  • 举报
回复
这几天研究音频传输,正好看过头文件资料,a律pcm的头文件不是44个吧,应该是58个字节,而且FMT 的长度也不是18 这是我这几天参照的格式说明,楼主看看吧

8KHz采样、8比特A律量化的PCM语音信号的WAVE文件头格式表(共58字节)
偏移地址 字节数 数据类型 内容 文件头定义为
00H 4 char "RIFF" char riff_id[4]="RIFF"
04H 4 long int 文件总长-8 long int size0=文总长-8
08H 8 char "WAVEfmt " char wave_fmt[8]
10H 4 long int 12000000H(ALAW) long int size1=0x12
14H 2 int 06 00H int fmttag=0x06
16H 2 int 声道数 int channel=1 或2
18H 4 long int 采样率 long int samplespersec
1CH 4 long int 每秒播放字节数 long int bytepersec
20H 2 int 采样一次占字节数 int blockalign=0x01
22H 4 long int 量化数 long int bitpersamples=8
26H 4 char "fact" char wave_fact="fact"
2AH 8 char 0400000000530700H定 char temp
32H 4 char "data" char wave_data="data"
36H 4 long int 采样数据字节数 lont int size2=文长-58
於黾 2014-05-07
  • 打赏
  • 举报
回复
mWriter.Write(8000); // nBytesPerSecond 没有试试改一下这个参数? 看注释,这个是每秒播放的字节数
iceqijunfei 2014-05-07
  • 打赏
  • 举报
回复
楼主用FFmpeg试试吧
shizhu820228 2014-05-06
  • 打赏
  • 举报
回复
做过滴,帮忙看过来。。。 一个小的提示,都不盛感激

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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