【原】AMR音频解码插件开发总结

近段时间一直在忙碌AMR音频解码插件的开发,由于对驱动开发和音频编解码知识了解不是很多,加之自身经验欠缺,致使开发过程中碰到太多棘手的问题。经过努力学习和领导的大力帮助下终于完成了插件的开发,现将开发过程中得来的经验总结下来,为近段时间自己学来的东西理个头绪,也为今后有类似开发的朋友一个参考。

 

AMR解码插件开发之环境配置

本文开发此插件是在Windows XP环境下进行,需要安装WinXPDDK进行编译,另外需要AMR-NB(Adaptive Multi-Rate Narrowband)编解码相对应的动态链接库。(由于WinDDK的调试非常困难,在开发过程中经常弄不清楚问题出在什么地方,所以使用写文件日志和MessageBox的方法进行跟踪调试,但是此调试手段实在太耗神。。。有文章介绍可以安装WindDbg来进行调试,由于时间紧任务急没来得及研究,以后研究学习。。)

安装及配置步骤:

1.       安装WinXPDDK(最好按照默认的路径进行安装,要进行Audio音频插件开发,所以对应的audio组建最好选上)

2.       C:\WINDDK\2600\src\wdm\audio下创建AMR工程

3.       配置工程对应的编译环境:修改\audio目录下对应的dirs文件,将编译路径设为amr文件夹;sources文件中规定了编译生成的文件名、文件类型、链接库配置、编译的对应文件*.c等文件;另外需要改动的配置文件有:amr.def指明了工程入口;camr.inf安装配置文件;这些文件的配置按照安装的Audio模板修改相应的参数即可。

4.       编译:开始->程序->Development Kits->Windows DDK 2600->Build Enviroments->Win XP Checked Build Environment,在弹出的窗口中输入build即可。

5.       编译后生成的文件在..\AMR\\objchk\i386中,文件名为*.acm,将camr.inf文件拷入此文件夹下,鼠标选中右键点击安装即可,相应的信息便写入注册表。(查看是否正确安装:控制面板的设备管理器->声音、视频和游戏控制器->音频编码解码器->属性,查看对应的音频编解码器列表中是否存在)

 

AMR解码插件开发之ACM音频编解码管理器

ACM是通用的音频编解码管理器,固定的接口函数为:DriverProc,通过不同的消息uMsg来调用不同的函数,下面列出在开发过程中可能需要改动的函数:

DRV_LOAD               驱动加载

DRV_FREE                驱动退出

DRV_OPEN               打开插件

DRV_CLOSE             关闭插件

DRV_CONFIGURE 配置插件

ACMDM_FORMAT_DETAILS 根据FormatTag设置文件存储的音频参数

ACMDM_FORMATTAG_DETAILS 得到指定的FormatTagACMFORMATTAGDETAILS

ACMDM_STREAM_OPEN 音频流打开,确定是编码流还是解码流,做相应的初始化工作,调用相对应的编\解码初始化函数、

ACMDM_STREAM_CLOSE 关闭音频流,做相对应的内存释放工作和对应的编\解码退出函数

ACMDM_STREAM_SIZE 设置音频流的SrcLengthDstLength

ACMDM_STREAM_CONVERT 调用编\解码函数。

具体的工作需要具体解决。

 

AMR解码插件开发之动态调用DLL

众所周之,动态链接库在VC中的方法有很多种,因为在开发过程中碰到了动态链接库的调用问题,所以将标准库调用方法总结一下。

VC中常使用方法:

方法一:直接在Project->Settings->Link中进行添加

方法二:使用#pragma comment(lib, “*.lib”)进行调用

方法三:动态LoadLibrary进行调用(1.LoadLibrary,装载动态库;2.GetProcAddress:获取要引入的函数,将符号名或标识号转换为DLL内部地址;3.FreeLibrary,释放动态链接库)

可能是提供给的AMR动态链接库和静态链接库存在一些错误,在Sources文件中TARGETLIBS直接添加对应的链接库后进行函数调用总是编译报错,所以经过尝试后终于用动态Load方式解决的标准库无法调用的问题。

本文方法如下:

首先在头文件中定义动态加载DLL的变量和需要使用的函数指针:

// 动态加载Dll

HMODULE hDllLib;

// 定义函数指针,用于动态加载dll来调用函数

typedef HI_S32 (*AMRDecodeInit)(HI_VOID **);

typedef HI_S32 (*AMRDecodeFrame)(HI_VOID *, HI_U8 *, HI_S16 *, enum Format);

typedef HI_S32 (*AMRGetLength)(enum Format, HI_U8);

typedef HI_VOID (*AMRDecodeExit)(HI_VOID **);

 

//标准库中对应函数的地址

AMRDecodeInit              amr_Decode_init;

AMRDecodeFrame           amr_Decode_Frame;

AMRDecodeExit               amr_Decode_Exit;

AMRGetLength                amr_Get_Length;

 

然后初始化时进行动态加载Dll和记录对应函数的地址

//动态加载用到的Dll

hDllLib = LoadLibrary("lib_amr_dll.dll");

if (hDllLib != NULL)

{

amr_Decode_init = (AMRDecodeInit)GetProcAddress(hDllLib, "AMR_Decode_Init");

}

在结束时要释放动态链接库:

// 释放动态加载的Dll

if (NULL != hDllLib)

{

         FreeLibrary(hDllLib);

         hDllLib = NULL;

}

 

   今天就先总结这么多,还有很多很多不懂的问题需要学习和解决。文中有不妥和理解错误的地方,还请读者多多指出。

转载于:https://www.cnblogs.com/gaoyb/archive/2009/07/28/1533308.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GC算法 垃圾收集器

概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。 jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入…

Nginx----原理

原理 master-workers的机制的好处  首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可…

一个有趣的数学题

题目:abcde*4 edcba,求abcde 解题过程: 1. 首先确定a和e,a*4不可能是两位数,不然abcde*4的值肯定大于5位,所以a的取值为1或2,e为4或8; 2. 又e*4的的个位为a,则a2&#x…

JVM架构和GC垃圾回收机制--面试

JVM架构和GC垃圾回收机制详解 JVM架构图分析 下图:参考网络书籍,如有侵权请见谅 (想了解Hadoop内存溢出请看: Hadoop内存溢出(OOM)分类、参数调优化) JVM被分为三个主要的子系统 (1)类加载器…

学习HTML:iframe用法总结收藏

<iframe>是框架的一种形式&#xff0c;也比较常用到。 一&#xff1a;几个例子——演示iframe的基本用法 例1&#xff1a;<iframe width420 height330 frameborder0 scrollingauto src"URL" mce_src"URL"></iframe> 不用多说了&#xf…

java中线程池的几种实现方式

1、线程池简介&#xff1a; 多线程技术主要解决处理器单元内多个线程执行的问题&#xff0c;它可以显著减少处理器单元的闲置时间&#xff0c;增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为&#xff1a;T1 创建线程时间&#xff0c;T2 在线程中…

MySQL----分库分表

参考&#xff1a;https://mp.weixin.qq.com/s?__bizMzI5MzYzMDAwNw&mid2247487130&idx2&sn7d384ef9ca47b933e801fdd2459b6b2f&chksmec6e77c2db19fed4a3ed3a0625c1f318675a0a10fdb1ce8a31f032b91ee31377e1ee1e183258&mpshare1&scene23&srcid0927Uq…

IP过滤-驱动和应用程序通信

前段时间写一个IP过滤的驱动&#xff0c;以前没有接触过驱动&#xff0c;Google一把&#xff0c;网上有很多例子&#xff0c;不过都不能满足自己的需求&#xff0c;所以就参考大家的资料自己研究一下。呵呵。程序用了三层&#xff1a;第一层就是驱动来负责过滤数据包并把拦截的…

JVM架构和GC垃圾回收机制详解

JVM架构图分析 下图&#xff1a;参考网络书籍&#xff0c;如有侵权请见谅 &#xff08;想了解Hadoop内存溢出请看&#xff1a; Hadoop内存溢出(OOM)分类、参数调优化&#xff09; JVM被分为三个主要的子系统 &#xff08;1&#xff09;类加载器子系统&#xff08;2&#xff0…

IIS不能发布asp.net 应用程序

IIS不能发布asp.net 应用程序最近在写程序的时候&#xff0c;突然项目经理想发布一下网站看一下做的效果当我发布的时候遇到 下面的错误&#xff1a;&#xff1a;使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 名称以无效字符开头的…

线程高级篇-Lock锁和Condition条件

浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其他线程 便只能一直等待,等待获取锁的线程释放锁,而获取锁的线程释放锁会有三种情况: 1).获取锁的线程执行完该代码…

CERL 2.0 预告:Erlang Style Concurrency + 状态机

开始构想CERL 2.0版本。特点&#xff1a; Erlang Style Concurrency&#xff08;Erlang 风格并发&#xff09; 状态机&#xff0c;突破 Erlang Style Concurrency 模型的缺陷。在目前的 CERL 库 SDL接口描述语言的基础上&#xff0c;CERL 2.0 还将是一门语言&#xff08;用于实…

枚举类型创建实例

使用枚举创建单例模式 使用枚举创建的单例模式&#xff1a; public enum EasySingleton{INSTANCE; } 代码就这么简单&#xff0c;你可以使用EasySingleton.INSTANCE调用它&#xff0c;比起你在单例中调用getInstance()方法容易多了。 我们来看看正常情况下是怎样创建单例模…

前端学习(41):背景实现视觉差效果

首先准备三张图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&quo…

CAS原理分析

在JDK 5之前Java语言是靠synchronized关键字保证同步的&#xff0c;这会导致有锁&#xff08;后面的章节还会谈到锁&#xff09;。 锁机制存在以下问题&#xff1a; &#xff08;1&#xff09;在多线程竞争下&#xff0c;加锁、释放锁会导致比较多的上下文切换和调度延时&…

深入理解HashMap(原理,查找,扩容)

面试的时候闻到了Hashmap的扩容机制&#xff0c;之前只看到了Hasmap的实现机制&#xff0c;补一下基础知识&#xff0c;讲的非常好 原文链接&#xff1a; http://www.iteye.com/topic/539465 Hashmap是一种非常常用的、应用广泛的数据类型&#xff0c;最近研究到相关的内容&…

密码加密和解密

/// <summary> /// 字符串加密 /// </summary> /// <param name"original">明文</param> /// <returns>密文</returns> public static string Encrypt(string original) { …

【C++深度剖析教程1】C++中的经典问题解析-c++中的对象的构造顺序与析构顺序

c中的对象的构造顺序与析构顺序 问题一 当程序中存在多个对象时&#xff0c;如何确定这些对象的析构顺序&#xff1f; 一.单个函数创建时构造函数的调用顺序 1.调用父类的构造过程 2.调用成员变量的构造函数(调用顺序与声明顺序相同) 3.调用类自身的构造函数 而析构函数与…

ASP.NET MVC 重点教程一周年版 第七回 UrlHelper 【转】

这节讲 一下ASP.NET MVC中的Helper。 何谓Helper,其实就是在View中为了实现一些灵活功能而写的方法组。 其实ASP.NET MVC的View是Aspx的页面,本身可以声明定义方法,那为什么要有Helper呢&#xff1f; 其实无非是将界面与逻辑分离,而且Asp.net MVC也并不只支持Aspx一种View&…

【C++深度剖析教程2】C++经典问题解析之二 this指针与成员函数

隐藏的this指针&#xff0c;所有对象共享类的成员函数 写一篇博客花费时间虽然长&#xff0c;但是却让你对内容的记忆尤为深刻&#xff0c;尤其是你对它的态度。记录菜鸟的成长日记&#xff0c;也希望同为菜鸟的你们与我一起共同进步&#xff01;&#xff01;现在分享的是C的学…