• 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解码基本没问题。 希望大家喜欢的,帮我多完善。也让我学习下,谢谢 。





  • 相关阅读:
    迷宫的最短路径(bfs)
    INNODB引擎概述
    mysql-innodb的事务日志
    python-set集合
    一个python代码练习
    关于arm 的字节对齐
    学习嵌入式为什么要有uboot(深度解析)
    uboot 添加 自定义命令
    关于UBOOT,LINUX内核编译,根文件系统的15个小问题
    s5p6818 Overview
  • 原文地址:https://www.cnblogs.com/tianjing/p/3444423.html
Copyright © 2020-2023  润新知