windows phone 8 mp3 编码及解码
前言:
前段时间看了个博客:
介绍了mp3的编码,可惜没有源码,在github里找了下 只有一个项目,而且比较复杂不容易看懂,
所以自己就做了这个项目。
目前已发布在github里了。
(该项目在HTC8X测试通过,不过在界面那的代码可能还有些问题,C++/CX 基本可用了)
编解码需要用到 lame 的源码 上面的博客说的很清楚 我就不再解释了。
个人建议有条件的 直接使用ARM环境(也就是真机环境)
关于C++/CX调试:
在“启动项目”--“属性”--“调试” 中:
编码流程:
获取wav头:
unsigned char pcmheaddata [ 44 ];
for ( int i = 0 ; i < 44 ; i ++)
{
pcmheaddata [ i ]= bytes [ i ];
}
for ( int i = 0 ; i < 44 ; i ++)
{
pcmheaddata [ i ]= bytes [ i ];
}
根据wav头初始化MP3编码器:
WaveHeader pcmhead(waveheaddata);//解析wav头
lame_global_flags* lame = lame_init();
//if(pcmhead.GetSampleRate()>1){
// lame_set_in_samplerate(lame, pcmhead.GetSampleRate());
//}
if(pcmhead.GetChannels()>0){
lame_set_num_channels(lame, pcmhead.GetChannels());
}
if(p_Wrapper->EncodeBrate>31){
lame_set_brate(lame,p_Wrapper->EncodeBrate); //128
}
if(p_Wrapper->EncodeQuality>=0&&p_Wrapper->EncodeQuality<=9){
lame_set_quality(lame, p_Wrapper->EncodeQuality);
}
lame_init_params(lame);
return lame;
lame_global_flags* lame = lame_init();
//if(pcmhead.GetSampleRate()>1){
// lame_set_in_samplerate(lame, pcmhead.GetSampleRate());
//}
if(pcmhead.GetChannels()>0){
lame_set_num_channels(lame, pcmhead.GetChannels());
}
if(p_Wrapper->EncodeBrate>31){
lame_set_brate(lame,p_Wrapper->EncodeBrate); //128
}
if(p_Wrapper->EncodeQuality>=0&&p_Wrapper->EncodeQuality<=9){
lame_set_quality(lame, p_Wrapper->EncodeQuality);
}
lame_init_params(lame);
return lame;
编码数据:
编码使用
lame_encode_buffer_interleaved
lame_encode_buffer 这个使用感觉不好用,参数还要分左右声道。
解码流程:
初始化解码器:
lame_t lame = lame_init();
lame_set_decode_only(lame, 1);
if(lame_init_params(lame) == -1)
{
throw ref new Exception(-2,"FATAL ERROR: parameters failed to initialize properly in lame. Aborting!\n");
}
hip_t hip = hip_decode_init();
跳过mp3头:
只有跳过mp3 后 ,再使用hip_decode1_headers 才能获得mp3data_struct
int id3size= GetLenOfId3v2Tag(mp3);
解码数据:
解码函数:
len = hip_decode1_headers(gfp,mp3buf,mp3_len,left, right, mp3data);
这个函数需要注意的是 len 总是1152 或者 576 所以需要循环接收数据 ,
但是 mp3_len 第一次是 mp3_len 循环时mp3_len=0;代表只接收,不输入。
总结:
1、如果要支持24/32bit的wav 不能使用lame_encode_buffer_interleaved,因为输入输入长度是short,应该是int才行。
2、大部分需要的功能在lame源码项目中都有,有时候我为了找个函数在网上浪费了半天。
3、C++/CX 的公开函数中 参数不能是C++的类型,只能是对象,不知道怎么支持 基础类型(int,char)。
4、编码/解码中
由于是第一次写C++/CX,本人对C++还没入门,所以这个项目目前只能对16bit的wav编码 24bit和32bit 目前还不行
mp3解码基本没问题。 希望大家喜欢的,帮我多完善。也让我学习下,谢谢 。
我的开源的地址https://github.com/tianjing/
大家踊跃拍砖共同成长,拍砖的同时记得附上意见或者建议。!!谢谢 谢谢