返回信息流代码可将wav格式的音频压缩为amr-wb格式,并且再解码为wav格式。老师给的程序是c++留了两个函数接口,用来读wav格式和最后写成wav格式。
我在网上查了wav格式的读取方法,跳过头文件44个字节,将数据部分读入,解码时给数据再加上这44个字节即可。
写好后我读进去生成的amr-wb音频是杂音,或者无法播放。但是这个错的amr-wb的音频解码后的wav格式听起来又与原始音频一样,没有错误,我现在怀疑我读的时候有问题,但实在不知道哪里错了,求大神指点。请大果粒或者吃饭都可以
这是一条镜像帖。来源:北邮人论坛 / cpp / #95625同步于 2017/6/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
求问用C++处理过音频文件的大神
leaveforever
2017/6/18镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
没看明白,就我所知,wav头部是有音频的详细信息的,大概长这样,
/* wav音频头部格式 */
typedef struct _wave_pcm_hdr
{
char riff[4]; // = "RIFF"
int size_8; // = FileSize - 8
char wave[4]; // = "WAVE"
char fmt[4]; // = "fmt "
int fmt_size; // = 下一个结构体的大小 : 16
short int format_tag; // = PCM : 1
short int channels; // = 通道数 : 1
int samples_per_sec; // = 采样率 : 8000 | 6000 | 11025 | 16000
int avg_bytes_per_sec; // = 每秒字节数 : samples_per_sec * bits_per_sample / 8
short int block_align; // = 每采样点字节数 : wBitsPerSample / 8
short int bits_per_sample; // = 量化比特数: 8 | 16
char data[4]; // = "data";
int data_size; // = 纯数据长度 : FileSize - 44
} wave_pcm_hdr;
看你的描述,你跳过了头部,只读数据,没有采样数通道数这些,数据按理是无法正常解析的,我不知道你的压缩算法怎样,是老师提供的吗?应该需要给格式参数的,从这个角度试着分析看看是不是参数没给对。
压缩编码时只需要数据部分,所以我就跳过了wav文件头44字节 直接把数据读到一个vector里的。
【 在 dujiangtao 的大作中提到: 】
: 没看明白,就我所知,wav头部是有音频的详细信息的,大概长这样,
: /* wav音频头部格式 */
: typedef struct _wave_pcm_hdr
: ...................
建议你还是要从音频编码过程入手来分析这个问题。
首先你要了解你的wav音源采样率是多少,有几个channel;amr-wb用得是16KHz sample,如果你的wav音源的采样率不是16kHz,或者当前存在多个channel,你在从wav -> amr-wb转换时需要做一次resample,这个过程不知道是你们老师给提供了库实现还是说要你自己来做。
然后再从amr-wb -> wav,如果你上一步是按照编码标准来做的,此时你可能还需要再做一次resample,然后把原始的wav头信息写入,但这时候音质无法保持原始音频的质量;或者你可以不对音频做resample,但是你需要修改wav头信息来适应16kHz采样率以及声道数量
另外做多媒体处理不推荐用template,因为data chunk是可以被精准计算出来的,准确的分配和操作内存也可以从侧面保证你的数据处理过程是正确的。
【 在 leaveforever 的大作中提到: 】
: 压缩编码时只需要数据部分,所以我就跳过了wav文件头44字节 直接把数据读到一个vector里的。