精华内容
下载资源
问答
  • Ios 音频 解码

    2014-06-25 11:40:42
    转载自:... 目录 1. 概述 2. AMR编码 3. AMR解码 4. AMR帧读取算法 ...现在很多智能手机都支持多媒体功能,特别是音频和视频播放功能,而AMR文件格式是手机端普遍支持的音频文件格式。  

    转载自:http://ruixiazun.blog.163.com/blog/static/9068791820119141145888/

    目录
    1.    概述
    2.    AMR编码
    3.    AMR解码
    4.    AMR帧读取算法
      
    1.      概述
    现在很多智能手机都支持多媒体功能,特别是音频和视频播放功能,而AMR文件格式是手机端普遍支持的音频文件格式。
     
    AMR,全称是:Adaptive Multi-Rate,自适应多速率,是一种音频编码文件格式,专用于有效地压缩语音频率。
     
    AMR音频主要用于移动设备的音频压缩,压缩比非常高,但是音质比较差,主要用于语音类的音频压缩,不适合对音质要求较高的音乐类音频的压缩。
     
    AMR的编解码是基于“3GPP AMR Floating-point Speech Codec”来做的,3GPP还专门开放了基于ANSI-C实现的编解码代码,便于我们在各种平台上进行移植。
     
    #ifndef amrFileCodec_h
    #define amrFileCodec_h
     
    #define AMR_MAGIC_NUMBER "#!AMR\n"
     
    #define PCM_FRAME_SIZE 160 // 8khz 8000*0.02=160
    #define MAX_AMR_FRAME_SIZE 32
    #define AMR_FRAME_COUNT_PER_SECOND 50
    //int amrEncodeMode[] = {4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200}; // amr 编码方式
     
    typedef struct
    {
             char chChunkID[4];
             int nChunkSize;
    }XCHUNKHEADER;
     
    typedef struct
    {
             short nFormatTag;
             short nChannels;
             int nSamplesPerSec;
             int nAvgBytesPerSec;
             short nBlockAlign;
             short nBitsPerSample;
    }WAVEFORMAT;
     
    typedef struct
    {
             short nFormatTag;
             short nChannels;
             int nSamplesPerSec;
             int nAvgBytesPerSec;
             short nBlockAlign;
             short nBitsPerSample;
             short nExSize;
    }WAVEFORMATX;
     
    typedef struct
    {
             char chRiffID[4];
             int nRiffSize;
             char chRiffFormat[4];
    }RIFFHEADER;
     
    typedef struct
    {
             char chFmtID[4];
             int nFmtSize;
             WAVEFORMAT wf;
    }FMTBLOCK;
     
    // WAVE音频采样频率是8khz 
    // 音频样本单元数 = 8000*0.02 = 160 (由采样频率决定)
    // 声道数 1 : 160
    //        2 : 160*2 = 320
    // bps决定样本(sample)大小
    // bps = 8 --> 8位 unsigned char
    //       16 --> 16位 unsigned short
    int EncodeWAVEFileToAMRFile(const char* pchWAVEFilename, const char* pchAMRFileName, int nChannels, int nBitsPerSample);
     
    // 将AMR文件解码成WAVE文件
    int DecodeAMRFileToWAVEFile(const char* pchAMRFileName, const char* pchWAVEFilename);
     
    #endif
     


    2.        AMR编码
    3GPP提供了编码代码,并提供了一个encoder.c程序,该程序示范了如何对一个16位的单声道PCM数据进行压缩的。(采样频率必须是8khz)
     
    我对该程序进行一定的拓展,数据位支持8位和16位,可以是单声道和双声道。
     
    l         对于8位PCM只需要将每个采样的sample数据位扩展成16位,并左移7位。
    l         对于双声道,可以只对左声道数据进行处理,也可以只对右声道数据进行处理,或者将左右声道数据求平均值就可。
     
    这样两个小处理,就可以将PCM规范成3PGG的编码器需要的数据格式。
     
    代码在 amrFileEncoder.c 中。
     
    #include "amrFileCodec.h"
     
    // 从WAVE文件中跳过WAVE文件头,直接到PCM音频数据
    void SkipToPCMAudioData(FILE* fpwave)
    {
             RIFFHEADER riff;
             FMTBLOCK fmt;
             XCHUNKHEADER chunk;
             WAVEFORMATX wfx;
             int bDataBlock = 0;
     
             // 1. 读RIFF头
             fread(&riff, 1, sizeof(RIFFHEADER), fpwave);
     
             // 2. 读FMT块 - 如果 fmt.nFmtSize>16 说明需要还有一个附属大小没有读
             fread(&chunk, 1, sizeof(XCHUNKHEADER), fpwave);
             if ( chunk.nChunkSize>16 )
             {
                       fread(&wfx, 1, sizeof(WAVEFORMATX), fpwave);
             }
             else
             {
                       memcpy(fmt.chFmtID, chunk.chChunkID, 4);
                       fmt.nFmtSize = chunk.nChunkSize;
                       fread(&fmt.wf, 1, sizeof(WAVEFORMAT), fpwave);
             }
     
             // 3.转到data块 - 有些还有fact块等。
             while(!bDataBlock)
             {
                       fread(&chunk, 1, sizeof(XCHUNKHEADER), fpwave);
                       if ( !memcmp(chunk.chChunkID, "data", 4) )
                       {
                                bDataBlock = 1;
                                break;
                       }
                       // 因为这个不是data块,就跳过块数据
                       fseek(fpwave, chunk.nChunkSize, SEEK_CUR);
             }
    }
     
    // 从WAVE文件读一个完整的PCM音频帧
    // 返回值: 0-错误 >0: 完整帧大小
    int ReadPCMFrame(short speech[], FILE* fpwave, int nChannels, int nBitsPerSample)
    {
             int nRead = 0;
             int x = 0, y=0;
             unsigned short ush1=0, ush2=0, ush=0;
     
             // 原始PCM音频帧数据
             unsigned char pcmFrame_8b1[PCM_FRAME_SIZE];
             unsigned char pcmFrame_8b2[PCM_FRAME_SIZE<<1];
             unsigned short pcmFrame_16b1[PCM_FRAME_SIZE];
             unsigned short pcmFrame_16b2[PCM_FRAME_SIZE<<1];
     
             if (nBitsPerSample==8 && nChannels==1)
             {
                       nRead = fread(pcmFrame_8b1, (nBitsPerSample/8), PCM_FRAME_SIZE*nChannels, fpwave);
                       for(x=0; x<PCM_FRAME_SIZE; x++)
                       {
                                speech[x] =(short)((short)pcmFrame_8b1[x] << 7);
                       }
             }
             else
             if (nBitsPerSample==8 && nChannels==2)
             {
                       nRead = fread(pcmFrame_8b2, (nBitsPerSample/8), PCM_FRAME_SIZE*nChannels, fpwave);
                       for( x=0, y=0; y<PCM_FRAME_SIZE; y++,x+=2 )
                       {
                                // 1 - 取两个声道之左声道
                                speech[y] =(short)((short)pcmFrame_8b2[x+0] << 7);
                                // 2 - 取两个声道之右声道
                                //speech[y] =(short)((short)pcmFrame_8b2[x+1] << 7);
                                // 3 - 取两个声道的平均值
                                //ush1 = (short)pcmFrame_8b2[x+0];
                                //ush2 = (short)pcmFrame_8b2[x+1];
                                //ush = (ush1 + ush2) >> 1;
                                //speech[y] = (short)((short)ush << 7);
                       }
             }
             else
             if (nBitsPerSample==16 && nChannels==1)
             {
                       nRead = fread(pcmFrame_16b1, (nBitsPerSample/8), PCM_FRAME_SIZE*nChannels, fpwave);
                       for(x=0; x<PCM_FRAME_SIZE; x++)
                       {
                                speech[x] = (short)pcmFrame_16b1[x+0];
                       }
             }
             else
             if (nBitsPerSample==16 && nChannels==2)
             {
                       nRead = fread(pcmFrame_16b2, (nBitsPerSample/8), PCM_FRAME_SIZE*nChannels, fpwave);
                       for( x=0, y=0; y<PCM_FRAME_SIZE; y++,x+=2 )
                       {
                                //speech[y] = (short)pcmFrame_16b2[x+0];
                                speech[y] = (short)((int)((int)pcmFrame_16b2[x+0] + (int)pcmFrame_16b2[x+1])) >> 1;
                       }
             }
     
             // 如果读到的数据不是一个完整的PCM帧, 就返回0
             if (nRead<PCM_FRAME_SIZE*nChannels) return 0;
     
             return nRead;
    }
     
    // WAVE音频采样频率是8khz 
    // 音频样本单元数 = 8000*0.02 = 160 (由采样频率决定)
    // 声道数 1 : 160
    //        2 : 160*2 = 320
    // bps决定样本(sample)大小
    // bps = 8 --> 8位 unsigned char
    //       16 --> 16位 unsigned short
    int EncodeWAVEFileToAMRFile(const char* pchWAVEFilename, const char* pchAMRFileName, int nChannels, int nBitsPerSample)
    {
             FILE* fpwave;
             FILE* fpamr;
     
             /* input speech vector */
             short speech[160];
     
             /* counters */
             int byte_counter, frames = 0, bytes = 0;
     
             /* pointer to encoder state structure */
             int *enstate;
             
             /* requested mode */
             enum Mode req_mode = MR122;
             int dtx = 0;
     
             /* bitstream filetype */
             unsigned char amrFrame[MAX_AMR_FRAME_SIZE];
     
             fpwave = fopen(pchWAVEFilename, "rb");
             if (fpwave == NULL)
             {
                       return 0;
             }
     
             // 创建并初始化amr文件
             fpamr = fopen(pchAMRFileName, "wb");
             if (fpamr == NULL)
             {
                       fclose(fpwave);
                       return 0;
             }
             /* write magic number to indicate single channel AMR file storage format */
             bytes = fwrite(AMR_MAGIC_NUMBER, sizeof(char), strlen(AMR_MAGIC_NUMBER), fpamr);
     
             /* skip to pcm audio data*/
             SkipToPCMAudioData(fpwave);
     
             enstate = Encoder_Interface_init(dtx);
     
             while(1)
             {
                       // read one pcm frame
                       if (!ReadPCMFrame(speech, fpwave, nChannels, nBitsPerSample)) break;
     
                       frames++;
     
                       /* call encoder */
                       byte_counter = Encoder_Interface_Encode(enstate, req_mode, speech, amrFrame, 0);
     
                       bytes += byte_counter;
                       fwrite(amrFrame, sizeof (unsigned char), byte_counter, fpamr );
             }
     
             Encoder_Interface_exit(enstate);
     
             fclose(fpamr);
             fclose(fpwave);
     
             return frames;
    }


    3.      AMR解码
    文件解码器代码在 amrFileDecoder.c 中。
     
    #include "amrFileCodec.h"
     
    void WriteWAVEFileHeader(FILE* fpwave, int nFrame)
    {
             char tag[10] = "";
     
             // 1. 写RIFF头
             strcpy(tag, "RIFF");
             memcpy(riff.chRiffID, tag, 4);
             riff.nRiffSize = 4                                     // WAVE
                       + sizeof(XCHUNKHEADER)               // fmt 
                       + sizeof(WAVEFORMATX)           // WAVEFORMATX
                       + sizeof(XCHUNKHEADER)               // DATA
                       + nFrame*160*sizeof(short);    // 
             strcpy(tag, "WAVE");
             memcpy(riff.chRiffFormat, tag, 4);
             fwrite(&riff, 1, sizeof(RIFFHEADER), fpwave);
     
             // 2. 写FMT块
             strcpy(tag, "fmt ");
             memcpy(chunk.chChunkID, tag, 4);
             chunk.nChunkSize = sizeof(WAVEFORMATX);
             fwrite(&chunk, 1, sizeof(XCHUNKHEADER), fpwave);
             memset(&wfx, 0, sizeof(WAVEFORMATX));
             wfx.nFormatTag = 1;
             wfx.nChannels = 1; // 单声道
             wfx.nSamplesPerSec = 8000; // 8khz
             wfx.nAvgBytesPerSec = 16000;
             wfx.nBlockAlign = 2;
             wfx.nBitsPerSample = 16; // 16位
             fwrite(&wfx, 1, sizeof(WAVEFORMATX), fpwave);
     
             // 3. 写data块头
             strcpy(tag, "data");
             memcpy(chunk.chChunkID, tag, 4);
             chunk.nChunkSize = nFrame*160*sizeof(short);
             fwrite(&chunk, 1, sizeof(XCHUNKHEADER), fpwave);
    }
     
    const int round(const double x)
    {
             return((int)(x+0.5));

     
    // 根据帧头计算当前帧大小
    int caclAMRFrameSize(unsigned char frameHeader)
    {
             int mode;
             int temp1 = 0;
             int temp2 = 0;
             int frameSize;
     
             temp1 = frameHeader;
     
             // 编码方式编号 = 帧头的3-6位
             temp1 &= 0x78; // 0111-1000
             temp1 >>= 3;
     
             mode = amrEncodeMode[temp1];
     
             // 计算amr音频数据帧大小
             // 原理: amr 一帧对应20ms,那么一秒有50帧的音频数据
             temp2 = round((double)(((double)mode / (double)AMR_FRAME_COUNT_PER_SECOND) / (double)8));
     
             frameSize = round((double)temp2 + 0.5);
             return frameSize;
    }
     
    // 读第一个帧 - (参考帧)
    // 返回值: 0-出错; 1-正确
    int ReadAMRFrameFirst(FILE* fpamr, unsigned char frameBuffer[], int* stdFrameSize, unsigned char* stdFrameHeader)
    {
             memset(frameBuffer, 0, sizeof(frameBuffer));
     
             // 先读帧头
             fread(stdFrameHeader, 1, sizeof(unsigned char), fpamr);
             if (feof(fpamr)) return 0;
     
             // 根据帧头计算帧大小
             *stdFrameSize = caclAMRFrameSize(*stdFrameHeader);
     
             // 读首帧
             frameBuffer[0] = *stdFrameHeader;
             fread(&(frameBuffer[1]), 1, (*stdFrameSize-1)*sizeof(unsigned char), fpamr);
             if (feof(fpamr)) return 0;
     
             return 1;
    }
     
    // 返回值: 0-出错; 1-正确
    int ReadAMRFrame(FILE* fpamr, unsigned char frameBuffer[], int stdFrameSize, unsigned char stdFrameHeader)
    {
             int bytes = 0;
             unsigned char frameHeader; // 帧头
     
             memset(frameBuffer, 0, sizeof(frameBuffer));
     
             // 读帧头
             // 如果是坏帧(不是标准帧头),则继续读下一个字节,直到读到标准帧头
             while(1)
             {
                       bytes = fread(&frameHeader, 1, sizeof(unsigned char), fpamr);
                       if (feof(fpamr)) return 0;
                       if (frameHeader == stdFrameHeader) break;
             }
     
             // 读该帧的语音数据(帧头已经读过)
             frameBuffer[0] = frameHeader;
             bytes = fread(&(frameBuffer[1]), 1, (stdFrameSize-1)*sizeof(unsigned char), fpamr);
             if (feof(fpamr)) return 0;
     
             return 1;
    }
     
    // 将AMR文件解码成WAVE文件
    int DecodeAMRFileToWAVEFile(const char* pchAMRFileName, const char* pchWAVEFilename)
    {
             FILE* fpamr = NULL;
             FILE* fpwave = NULL;
             char magic[8];
             int * destate;
             int nFrameCount = 0;
             int stdFrameSize;
             unsigned char stdFrameHeader;
     
             unsigned char amrFrame[MAX_AMR_FRAME_SIZE];
             short pcmFrame[PCM_FRAME_SIZE];
     
             fpamr = fopen(pchAMRFileName, "rb");
             if ( fpamr==NULL ) return 0;
     
             // 检查amr文件头
             fread(magic, sizeof(char), strlen(AMR_MAGIC_NUMBER), fpamr);
             if (strncmp(magic, AMR_MAGIC_NUMBER, strlen(AMR_MAGIC_NUMBER)))
             {
                       fclose(fpamr);
                       return 0;
             }
     
             // 创建并初始化WAVE文件
             fpwave = fopen(pchWAVEFilename, "wb");
             WriteWAVEFileHeader(fpwave, nFrameCount);
     
             /* init decoder */
             destate = Decoder_Interface_init();
     
             // 读第一帧 - 作为参考帧
             memset(amrFrame, 0, sizeof(amrFrame));
             memset(pcmFrame, 0, sizeof(pcmFrame));
             ReadAMRFrameFirst(fpamr, amrFrame, &stdFrameSize, &stdFrameHeader);
     
             // 解码一个AMR音频帧成PCM数据
             Decoder_Interface_Decode(destate, amrFrame, pcmFrame, 0);
             nFrameCount++;
             fwrite(pcmFrame, sizeof(short), PCM_FRAME_SIZE, fpwave);
     
             // 逐帧解码AMR并写到WAVE文件里
             while(1)
             {
                       memset(amrFrame, 0, sizeof(amrFrame));
                       memset(pcmFrame, 0, sizeof(pcmFrame));
                       if (!ReadAMRFrame(fpamr, amrFrame, stdFrameSize, stdFrameHeader)) break;
     
                       // 解码一个AMR音频帧成PCM数据 (8k-16b-单声道)
                       Decoder_Interface_Decode(destate, amrFrame, pcmFrame, 0);
                       nFrameCount++;
                       fwrite(pcmFrame, sizeof(short), PCM_FRAME_SIZE, fpwave);
             }
     
             Decoder_Interface_exit(destate);
     
             fclose(fpwave);
     
             // 重写WAVE文件头
             fpwave = fopen(pchWAVEFilename, "r+");
             WriteWAVEFileHeader(fpwave, nFrameCount);
             fclose(fpwave);
     
             return nFrameCount;
    }
    展开全文
  • HI618E音频解码芯片

    2020-08-25 23:00:49
    HI618E音频解码芯片 方案:采用深圳市英特洛智能有限公司推广的HI618E方案(听说之前是台湾某硕内部使用的音频解码芯片方案) 特征:高集成度32bit 内置32bit OPEN-RISC CPU, Audio CODEC 跟4Mb Flash,加持降噪算法...

    HI618E音频解码芯片
    方案:采用深圳市英特洛智能推广的HI618E方案
    特征:高集成度32bit 内置32bit OPEN-RISC CPU, Audio CODEC 跟4Mb Flash,加持降噪算法,最高支持48KHZ,16BIT的DAC/ADC应用,强大的算法能力以及芯片体积较小,4*4MM QFN32PIN封装。
    体验效果:音质醇厚,重低音模式感觉特别实在不破音。兼容目前绝大部分手机/电脑设备。通话清晰不断音。
    应用场景:扩展坞;声卡;变音器;Type-C耳机;音响等
    参数:
     全速兼容USB2.0
     双通道 16bit DAC
    信噪比: 95dB
    谐波失真: 85dB
    采样率: 8K-48K
     单通道16bit sigma-delta ADC
    信噪比: 90dB
    谐波失真: 85dB
    采样率: 8K-48K
     1 MIC 放大器
     Powerful Digital Mixing / DSP
    10-band 可调节 EQ for DAC and ADC
     Class A/B 放大器
     通过 上拉/下拉电阻灵活调节GPIO pins
     支持GPIO 唤醒 或双工UART 中断
     支持 AUDIO EQ 调节
     内置 PMU, 比如 charger/LDO
     16通道 10-bit SARADC
    T:13798527856
     工作温度范围: -40℃ to +85℃

    展开全文
  • 欧胜微电子有限公司(Wolfson Microelectronics plc)推出一款用于多媒体手机及类似应用的立体声音频解码器(CODEC), 它在集成了高质量音频性能和扩展了混合能力的同时实现了低功耗。 欧胜WM8983能够赋予手机...
  • Xtensa HiFi 2音频引擎和算法软件包是最受市场欢迎的音频处理器IP方案,其应用十分广泛,覆盖了从手机消费类音频产品到数字电视等多种多媒体应用领域中。2006年,Tensilica公司客户使用该音频的产品出货量将达到数以...
  • Android、ios音频编解码 音频口通信 音频通信。...Android、ios通过手机音频口和硬件通过音频口进行交互。 全套解决方案,源码、实例。 ios全适配 Android适配80%以上的手机 扣扣:10---20---965--026
    Android、ios音频编解码 音频口通信 音频通信。
    Android、ios通过手机音频口和硬件通过音频口进行交互。

    全套解决方案,源码、实例。

    ios全适配

    Android适配80%以上的手机

    扣扣:10---20---965--026
    展开全文
  • 创建MP3解码器 - 采用Symbian中MAD(MPEG音频解码库)用法前段时间我在newlc....这里采用Symbian中MAD(MPEG音频解码库)用法来解决问题。概叙因为Symbian 7.0中可以通过MMF在smartphones在播放MP3, 但如果你的手机不支持 M

    创建MP3解码器 - 采用Symbian中MAD(MPEG音频解码库)用法

    前段时间我在newlc.com写了为Series 60创建MP3播放器的程序。我收到了许多关于MP3解码并运用在Symbian上的邮件。这里采用Symbian中MAD(MPEG音频解码库)用法来解决问题。

    概叙

    因为Symbian 7.0中可以通过MMF在smartphones在播放MP3, 但如果你的手机不支持 MP3解码,或如果你想自己接收解码MP3。这里我将演示如何采用Symbian中的MAD(MPEG音频解码,libmad)用法。

    为什么使用MAD呢? 因为它是高品质的MPEG音频解码器,并且它已经在ARM下测试通过(也就是说不同的微型电脑和掌上MP3可以使用它)。

    将MAD移植到Symbian

    为了得到MAD来源,将需要以下文件:

    [Copy to clipboard]
    CODE:
    +inc
       -D.dat
       -imdct_s.dat
       -qc_table.dat
       -rq_table.dat
       -sf_table.dat
       -bit.h
       -config.h
       -decoder.h
       -fixed.h
       -frame.h
       -global.h
       -huffman.h
       -layer12.h
       -layer3.h
       -mad.h
       -stream.h
       -synth.h
       -timer.h
       -version.h
    +src
       -bit.c
       -decoder.c
       -fixed.c
       -frame.c
       -huffman.c
       -layer12.c
       -layer3.c
       -stream.c
       -synth.c
       -timer.c
       -version.c
       -imdct_l_arm.S

    固定静态函数/ 变量为非静态.(变量可以被转换为"静态的const")。

    编辑mad.h,,为设备对象和FPM_DEFAULT定义FPM_ARM. 如果你的WINS编译器不支持big inline,需要这样做:

    [Copy to clipboard]
    CODE:
    # ifndef__WINS__
    inline
    #endif

    可能在layer3.c III_decode函数中引起堆栈错误,即在字符串:

    [Copy to clipboard]
    CODE:
    mad_fixed_t xr[2][576];

    你可以为变量分配存储器或(在简单程序的情况下)为WINS对象使用窍门,置成静态变量.在真机上它会正常运行的.

    imdct_l_arm.S是针对ARMI最佳化的,使用它必须添加它的报头(函数 III_imdct_l) .

    [Copy to clipboard]
    CODE:
    # ifndef __WINS__
    void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], unsigned int block_type);
    # else
    static
    void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], unsigned int block_type)
    ...

    注意! 优化的 imdct_l_arm 不能在THUMB下编译,所以只是ARMI 对象被使用.

    创建MP3解码动态链接库

    使用MP3解码器的最好方法是DLL,你可以编译一次或有效的若干次,没有任何的平台特殊事件。所以使用ETTYPE.为libmad把/epoc32/include/libc加入在MM文件中的SYSTEMINCLUDE。如果想使用优化的III_imdct_l函数,加入到MMP:

    [Copy to clipboard]
    CODE:
    #if !defined (WINS)
    SOURCE  imdct_l_arm.S
    #endif

    同样加入到bld.inf:(所以imdct_l_arm对THUMB编译)

    [Copy to clipboard]
    CODE:
    PRJ_PLATFORMS
    ARMI WINS

    如果在iii_decode函数中为堆栈错误使用窍门并且在WINS库中没有_chkstk,需要自己添加它(empty void _chkstk()):

    为了在程序中使用DLL,添加函数。

    你可以使用基于madplay的MP3解码器的主循环:

    读文件到缓冲器
    MP3结构解码
    应用滤波器
    合成解码到PCM样本
    重新取PCM样本
     


    过滤  大多数的Symbian smartphones不支持立体声播放,所以这里你可以实现单一声音合成。并且可以使用平衡器。

    频率  不需要做没必要的计算,如果所需频率大于当前架框流通频率的一半,在申请滤波器后转换架框选项:

    [Copy to clipboard]
    CODE:
    Frame.options |= MAD_OPTION_HALFSAMPLERATE;

    编译器

       推荐使用 GCC 3 编译这一程序。根据我的测试它比普通的GCC 2.95解码器速度快20%。不要忘记MAD在GNU General Public License version 2下是得到许可的。

    希望文章对你能有所帮助,同时欢迎写出注释或提出宝贵意见。

    展开全文
  •  意法半导体公布了一款集成耳机及免提输出放大器的小功率立体声音频/话音编解码器STw5095,该芯片是一个小巧灵活的音频的解决方案,适用于多媒体产品及手机的电池供电的低压环境。这是一个专门为话音和音频解码器...
  • ADAU1361与ADAU1761 24 bit音频解码器非常适合手机、PMP、PND、数码相机及其它移动音频与电话应用。ADAU1361具有大于100 dB的信噪比(SNR),而在立体声回放模式下的功耗不足5mW。ADAU1761音频解码器中增加了...
  • AMR音频解码

    万次阅读 热门讨论 2007-12-29 09:34:00
     概述现在很多智能手机都支持多媒体功能,特别是音频和视频播放功能,而AMR文件格式是手机端普遍支持的音频文件格式。 AMR,全称是:Adaptive Multi-Rate,自适应多速率,是一种音频编码文件格式,专用于有效地
  • MAX9867是一款超低功耗立体声音频解码器,设计用于手机和便携式游戏机等便携式消费类电子产品。  该器件具有立体声差分麦克风输入,可连接至模拟或数字麦克风。单端线入信号经过可配置前置放大器,能够输入到ADC...
  •  意法半导体公布了一款集成耳机及免提输出放大器的小功率立体声音频/话音编解码器STw5095,该芯片是一个小巧灵活的音频的解决方案,适用于多媒体产品及手机的电池供电的低压环境。这是一个专门为话音和音频解码器...
  • ffmpeg编解码音频AAC

    2014-01-17 11:07:00
    这里先封装安卓手机音频的编解码。 编译工作依然是在linux下 ubuntu 12.04 LTS ffmpeg 1.2.1 libvoaac 结合上一篇日志 http://www.cnblogs.com/zzugyl/p/3512715.html 这里添加工程编译...
  • 欧胜微电子今日宣布推出型号为WM8993的全新超低功耗音频中心编码解码器(CODEC),这是该全新系列的第一款产品,用于多媒体手机和其他多功能便携音频应用。WM8993将欧胜高度灵活的音频中心架构与其最新超低功耗和音频...
  • 首先,我们了解一下 Android 官方提供的音频解码的 API,即 MediaCodec 类,该 API 是在 Andorid 4.1 (API 16) 版本引入的,因此只能工作于 Android 4.1 以上的手机上。 1.1 MediaCodec 基本介绍 (1)提供了...
  • [转]AMR音频解码

    2009-06-19 18:04:00
    概述现在很多智能手机都支持多媒体功能,特别是音频和视频播放功能,而AMR文件格式是手机端普遍支持的音频文件格式。AMR,全称是:Adaptive Multi-Rate,自适应多速率,是一种音频编码文件格式,专用于有效地压缩...
  • 手机音频口通信

    万次阅读 热门讨论 2013-10-07 17:48:05
    我们采用了性能更好的曼彻斯特编码,在手机端和扩展头的单片机上都实现了曼彻斯特码的编码和解码,还完成了数据的组帧和解帧,使得手机和扩展头之间可以实现同时的双向通信即全双工通信。当然,如果想性能更好,可以...
  • 欧胜微电子日前宣布推出其全新高集成度、超低功耗音频中心编码解码器(CODEC)系列的第二款产品,这款编号为WM8994的芯片针对智能手机和其他多功能便携音频应用。WM8994添加了一个创新的新型HexCore?数字基带接口,将...
  • 音频的编解码使用MediaCodec的方法是很相似的,由于之前做的项目是要实现全双工通信,所以在手机录音编码之后发送给IPC端的同时,还要解码来自IPC端的音频数据并播放,因此学习了AAC编解码。MediaCodec的编解码能力...
  • 供蜂窝手机使用的信号通路可以是模拟、数字,或者二者兼而有之,这取决于处理器芯片上是否含有麦克风和耳机所需的编解码器以及小信号放大器。而处理器的半导体制造工艺正在向更小尺寸、更高器件密度和更低工作电压...
  • 本库是一个基于Rxjava实现的android音频设备通信库,主要用于手机音频设备之间的通信,支持录音,发送,发送,发送失败自动重试(可以指定重试次数),设置接收超时,自定义编解码,自定义配置参数等功能,使用本...
  • 推出基于HiFi 2音频DSP的蓝牙SBC(Sub-Band Codec)编解码器,设计人员可以很方便的将HiFi 2引擎集成到SOC设计中,从而使手机、便携音乐播放器等移动设备获得包括蓝牙音频规格在内的50多种音频解码能力。  HiFi 2...
  • 供蜂窝手机使用的信号通路可以是模拟、数字,或者二者兼而有之,这取决于处理器芯片上是否含有麦克风和耳机所需的编解码器以及小信号放大器。而处理器的半导体制造工艺正在向更小尺寸、更高器件密度和更低工作电压...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 454
精华内容 181
关键字:

手机音频解码