用Libaad2来进行AAC解码

头文件:


///////////////////////////////////////////////////////////////////////
////audio_decode.h        2010-11-15 by lishen
#ifndef _AUDIODECODE_H_
#define _AUDIODECODE_H_
#include "../lib/neaacdec.h"

typedef struct _ADecode
{
    NeAACDecHandle  m_hAac;    // audio decode handle 
    int                m_init;
}ADecode;
typedef int (*audio_decode_event)(DWORD arg1, const char *buf, int len);

ADecode* ADecode_Open ();
int ADecode_Close (ADecode* adecode);
int ADecode_Decode (ADecode* adecode, 
                    const char *buf, 
                    int buf_len, 
                    audio_decode_event fnt, 
                    DWORD arg);


#endif

实现文件:

///////////////////////////////////////////////////////////////////////
////audio_decode.cpp        2010-11-15 by lishen
#include "../common/common.h"
#include <windows.h>
#include <stdio.h>
#include "audio_decode.h"
#pragma comment(lib, "libfaad2.lib")

ADecode* ADecode_Open ()
{
    NeAACDecHandle hAac = NeAACDecOpen();
    
    NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration(hAac);
    NeAACDecSetConfiguration(hAac, conf);

    ADecode* adecode = new ADecode ();
    adecode->m_hAac = hAac;
    adecode->m_init = 0;

    return adecode;
}

int ADecode_Close (ADecode* adecode)
{
    if (adecode->m_hAac != NULL)
    {
        NeAACDecClose(adecode->m_hAac);
    }
    delete adecode;

    return 0;
}

int ADecode_Decode (ADecode* adecode, const char *buf, int buf_len, 
                        audio_decode_event fnt, DWORD arg)
{
    int ret = 0;
    NeAACDecFrameInfo hInfo;

    if (adecode->m_init == 0)
    {
        adecode->m_init = 1;
        unsigned long    samplerate;
        unsigned char    channels;
        NeAACDecInit (adecode->m_hAac, (unsigned char *) buf, buf_len, &samplerate, &channels);
    }

    short buf1[1024 * 4] = {0};
    int buf_off = 0;
    unsigned char *p = (unsigned char *) buf;
    
    do 
    {
        void* out = NeAACDecDecode (adecode->m_hAac, &hInfo, p, buf_len);
        if ((hInfo.error == 0) && (hInfo.samples > 0))
        {
            p += hInfo.bytesconsumed; 
            buf_len -= hInfo.bytesconsumed;

            // distill wave
            short *p1 = buf1, *p2 = (short*) out;
            for (int k = (hInfo.samples / hInfo.channels); k; k --){*p1 ++ = *p2; p2 += 2;}
            
            //trace0 (PROG_DEBUG, "%s-%d ADecode_decode %d.", __FILE__, __LINE__, len);
            // put out wave
            if (fnt != 0){ret = fnt (arg, (char*) buf1, hInfo.samples);}
        }
        else if (hInfo.error != 0)
        {
            ret = -1;
            break;
        }
    }while (buf_len > 0);

    return ret;
}

时间: 2017-10-09

用Libaad2来进行AAC解码的相关文章

AAC解码参数leftbyte的获得

问题描述 AAC解码参数leftbyte的获得 解码音频时,有个参数为leftbyte 我查找资料,AAC的头里没有leftbyte参数,不知道从何获得 望高手指教 解决方案 left应该是leave的过去分词,所以leftbyte的意义应该是剩余字节数. 这应该是算法内部累加的变量,表示缓冲区内有多少字节是有用的,解码输出应该在此之后.

AAC 文件解析及解码流程

OUTLINE:          * AAC概述          * AAC规格简述          * AAC特点              * AAC音频文件解析             --ADIF&ADTS格式             --ADIF&ADTS头信息             --ADIF&ADTS数据信息             --AAC文件处理流程          * AAC解码流程             --技术解析          * 术语

AAC解码时如何设置buffer

问题描述 AAC解码时如何设置buffer 当调用AAC解码库接口解码时,发现个陌生的参数leftbyte. 经过调试发现leftbyte参数含义为,当前帧与前一帧的和. 但是按此规则设置leftbyte参数解码时,依然有问题 猜测是 AAC数据源的buffer应有特殊设置,因为leftbyte参数的作用应该是定位AAC帧数据的解码位置 本人新手,望做过AAC解码的前辈不吝指点 解决方案 left应该是leave的过去分词,所以leftbyte的意义应该是剩余字节数. 这应该是算法内部累加的变量

adnroid-AAC解码成PCM然后播放。大神帮帮忙怎么整成PCM啊!

问题描述 AAC解码成PCM然后播放.大神帮帮忙怎么整成PCM啊! 如题,本人小白.真心不是很明白jni这个东西,跪求大神帮帮忙. 解决方案 代码 [cpp] view plaincopy /** *最简单的基于FFmpeg的音频编码器 *Simplest FFmpeg Audio Encoder *雷霄骅 Lei Xiaohua *leixiaohua1020@126.com *中国传媒大学/数字电视技术 *Communication University of China / Digital

Android支持的媒体格式

作为一个应用程序的开发者,你可以免费使用在Android设备上有效的任何格式的媒体编解码器,包括由Android平台和设备特殊提供的编解码器.但是,最好的做法是使用设备无关的媒体编码配置文件. 网络协议 以下是音视频播放所支持的网络协议: 1. RTSP(RTP.SDP) 2. HTTP/HTTPS实时流 3. HTTP/HTTPS Live Streaming草案协议: 只针对MPEG-2 TS流媒体媒体文件; 协议版本3(Android4.0以上) 协议版本2(Android3.x) And

编码-AAC LD rtp 接收到的数据如何存储下来,如何解码?

问题描述 AAC LD rtp 接收到的数据如何存储下来,如何解码? 1.使用rtp接收到的AAC LD 的数据,使用什么格式存储下来才能播放,我使用的是LATM封装的,7个字节头,payloadlength根据大小添加大于255 时为2个字节,例如 260 字节长度 0xff 0x05 ,然后是纯音频编码数据.不知道这样可不可以?是不是不可以存储为adts封装格式? 2. AAC LD 的数据有没有解码器,FAAD中有没有解码, VLC可不可以播放? 已经搞了几天,最终还是卡到封装格式上,还有

关于faad解码aac(Raw)问题

问题描述 关于faad解码aac(Raw)问题 使用faac进行的编码,设置如下: //设置版本,录制MP4文件时要用MPEG4 pConfiguration->version = MPEG4 ; pConfiguration->aacObjectType = LOW; //LC编码 //输入数据类型 pConfiguration->inputFormat = FAAC_INPUT_16BIT; // outputFormat (0 = Raw; 1 = ADTS) // 录制MP4文件

音频编解码·实战篇(1)PCM转至AAC(AAC编码)

1 下载安装 FAAC 这里的安装过程是在 Mac 和 Linux 上实现的,Windows可以类似参考. wget http://downloads.sourceforge.net/faac/faac-1.28.tar.gz tar zxvf faac-1.28.tar.gz cd faac-1.28 ./configure make sudo make install 如果才用默认的 configure 中的 prefix path,那么安装后的 lib 和 .h 文件分别在/usr/loc

IP通信中音频编解码技术与抗丢包技术概要

此文较长,建议收藏起来看. 一.一个典型的IP通信模型 二.Server2Server技术分类 Server2Server这块也是一个专门的领域,这里只简单分个类. 1.同一国家相同运营商之间: 同一运营商之间也有丢包,在铁通,鹏博士等运营商中尤甚.并且在晚高峰的时候表现更加突出. 2.同一国家不同运营商之间: 在很多时候,由于运营商之间的结算和有限带宽的问题.运营商之间的网络不稳定. 3.不同国家之间: 同一个国家都这么多问题,不同国家的问题回更复杂,在不同的国家要选择好的机房,实时选择实时监