当前位置: 首页 > news >正文

用Libaad2来进行AAC解码

头文件:
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    {
        voidout = 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;
}

相关文章:

  • libjingle翻译之《Important Concepts(重要概念)之Transports, Channels, and Connections(传输、通道、链接)》...
  • [转载]WCF系列_分布式事务(下)
  • EF基础知识小记五(一对多、多对多处理)
  • 智能语音控制中心 - 树莓派、Nanopi、Orangepi语音识别控制
  • NFS启动时报错Linux NFS:could not open connection for tcp6
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 性能与性价比的平衡,阿里云第二代入门级实例T5详解
  • 13个绚丽的Jquery 界面设计
  • 20162321王彪 2017-2018《程序设计与数据结构》第五周学习总结
  • 剪我一根头发,就要做我一天女人。
  • VS2008 F5不能调试情况一例
  • 短路径算法-Dijkstra算法的应用之单词转换(词梯问题)
  • C++多线程中调用python api函数
  • Gridview的footer模板中放置控件实现添加功能
  • 如何更高效地使用 OkHttp
  • 《剑指offer》分解让复杂问题更简单
  • git 常用命令
  • go append函数以及写入
  • javascript从右向左截取指定位数字符的3种方法
  • Java小白进阶笔记(3)-初级面向对象
  • 从0到1:PostCSS 插件开发最佳实践
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 两列自适应布局方案整理
  • 你不可错过的前端面试题(一)
  • 嵌入式文件系统
  • 事件委托的小应用
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 王永庆:技术创新改变教育未来
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 阿里云服务器如何修改远程端口?
  • 交换综合实验一
  • ​linux启动进程的方式
  • ​业务双活的数据切换思路设计(下)
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #ifdef 的技巧用法
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (ibm)Java 语言的 XPath API
  • (LeetCode 49)Anagrams
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (九十四)函数和二维数组
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三)模仿学习-Action数据的模仿
  • (万字长文)Spring的核心知识尽揽其中
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)iOS字体
  • (转)原始图像数据和PDF中的图像数据
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .cn根服务器被攻击之后
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET6实现破解Modbus poll点表配置文件