博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Libaad2来进行AAC解码
阅读量:6188 次
发布时间:2019-06-21

本文共 2035 字,大约阅读时间需要 6 分钟。

头文件:
ExpandedBlockStart.gif
/
//
///
/audio_decode.h        2010-11-15 by lishen
#ifndef _AUDIODECODE_H_
#define _AUDIODECODE_H_
#include "../lib/neaacdec.h"
typedef 
struct _ADecode
ExpandedBlockStart.gif {
    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


实现文件:

ExpandedBlockStart.gif
/
//
///
/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 ()
ExpandedBlockStart.gif {
    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)
ExpandedBlockStart.gif {
    
if (adecode->m_hAac != NULL)
ExpandedSubBlockStart.gif    {
        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)
ExpandedBlockStart.gif {
    
int ret = 0;
    NeAACDecFrameInfo hInfo;
    
if (adecode->m_init == 0)
ExpandedSubBlockStart.gif    {
        adecode->m_init = 1;
        unsigned 
long    samplerate;
        unsigned 
char    channels;
        NeAACDecInit (adecode->m_hAac, (unsigned 
char *) buf, buf_len, &samplerate, &channels);
    }
ExpandedSubBlockStart.gif    
short buf1[1024 * 4] = {0};
    
int buf_off = 0;
    unsigned 
char *p = (unsigned 
char *) buf;
    
    
do 
ExpandedSubBlockStart.gif    {
        
void
out = NeAACDecDecode (adecode->m_hAac, &hInfo, p, buf_len);
        
if ((hInfo.error == 0) && (hInfo.samples > 0))
ExpandedSubBlockStart.gif        {
            p += hInfo.bytesconsumed; 
            buf_len -= hInfo.bytesconsumed;
            
//
 distill wave
            
short *p1 = buf1, *p2 = (
short*) 
out;
ExpandedSubBlockStart.gif            
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
ExpandedSubBlockStart.gif
            
if (fnt != 0){ret = fnt (arg, (
char*) buf1, hInfo.samples);}
        }
        
else 
if (hInfo.error != 0)
ExpandedSubBlockStart.gif        {
            ret = -1;
            
break;
        }
    }
while (buf_len > 0);
    
return ret;
}

转载地址:http://ttlda.baihongyu.com/

你可能感兴趣的文章
python dict遍历
查看>>
Timer和TimerTask的使用
查看>>
以后台服务的形式启动nodejs应用
查看>>
字符串还原
查看>>
Windows安装多个版本JDK,灵活切换
查看>>
linux系统性能优化
查看>>
redis安装
查看>>
系统对话框
查看>>
pyhton入门(二)
查看>>
rabbitMQ WINDOWS 安装 入门
查看>>
控制Elasticsearch分片和副本的分配
查看>>
加入域的计算机初次登陆后,缓存登陆次数
查看>>
rocketmq 主从同步,主从替换问题分析
查看>>
memcached在windows7上的安装问题
查看>>
以太通道配置
查看>>
Android 基本api
查看>>
nginx0.8升级到nginx1.05过程
查看>>
Confluence 6 workbox 包含从 Jira 来的通知
查看>>
iOS大型项目优化之性能
查看>>
DATAPUMP与RMAN迁移表空间
查看>>