zoukankan      html  css  js  c++  java
  • 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 ];                
             }
    根据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_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! ");
        }
        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解码基本没问题。 希望大家喜欢的,帮我多完善。也让我学习下,谢谢 。





  • 相关阅读:
    Win(Phone)10开发第(7)弹,Extended Execution
    Win(Phone)10开发第(5)弹,本地媒体服务器的一些注意事项
    Win(Phone)10开发第(4)弹,HTTP 实时流播放 m3u8
    Win(Phone)10开发第(3)弹,简单的Demo程序网络请求json解析列表显示
    Win(Phone)10开发第(2)弹,导出APPX包并签名部署
    Win(Phone)10开发第(1)弹,桌面和手机的扩展API,还我后退键
    WP8里dll类库(SDK)实现多语言多主题
    Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路
    在继承中子类自动实现单例模式
    ansible---基础
  • 原文地址:https://www.cnblogs.com/tianjing/p/3444423.html
Copyright © 2011-2022 走看看