【原】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 得到指定的FormatTag的ACMFORMATTAGDETAILS
ACMDM_STREAM_OPEN 音频流打开,确定是编码流还是解码流,做相应的初始化工作,调用相对应的编\解码初始化函数、
ACMDM_STREAM_CLOSE 关闭音频流,做相对应的内存释放工作和对应的编\解码退出函数
ACMDM_STREAM_SIZE 设置音频流的SrcLength和DstLength
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
【原】AMR音频解码插件开发总结相关推荐
- 纯前端解码、播放、录音、编码 AMR 音频,无须服务器支持
纯前端解码.播放.录音.编码 AMR 音频,无须服务器支持,基于amr.js 和 RecorderJs. 特性 方便的 API 实现解码.播放.录音.编码 AMR 文件. 支持 url 和 blob ...
- FFMPEG之 Ubuntu系统上配置MP3和AMR编解码工具
项目中使用的后台服务器需要支持MP3格式和AMR格式相互转换,于是想到了FFMPEG这个万能解码工具,根据以前使用FFMPEG的经验,和网上查阅相差资料,为后台同事初步实现FFMPEG命令行工具进行M ...
- PHP 将amr音频文件转换为mp3格式
PHP 将amr音频文件转换为mp3格式 说下整体思路 1.服务器安装ffmpeg 2.使用ffmpeg -i 指令来转换amr为mp3格式(这个到时候写在PHP代码中,使用exec函数执行即可) 3 ...
- 原 android音频编辑之音频转换PCM与WAV
http://blog.csdn.net/hesong1120/article/details/79043482 本文出自: hesong的专栏 前言 本篇开始讲解在Android平台上进行的音频编辑 ...
- Android NDK开发之旅31 FFmpeg音频解码
###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...
- 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频解码信息 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )
文章目录 安卓直播推流专栏博客总结 一. FAAC 编码器编码 AAC 音频解码信息 二. 封装 RTMP 音频数据头 三. 封装 RTMP 音频数据类型 四. 拷贝 AAC 音频数据到 RTMPPa ...
- 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )
文章目录 安卓直播推流专栏博客总结 一. AAC 音频格式解析 二. FLV 音频数据标签解析 1. 分析 FLV 格式中的 AAC 音频格式数据 2. AAC 音频特殊配置 3. AAC 音频数据标 ...
- Mplayer 音频解码分析
一.序 还是按部就班的来,这次主要分析一下Mplayer中音频解码流程,特别说明一下,这里 的音频解码包括后面会说的视频解码统统不涉及到具体的格式和解码算法,如果大伙对具 体文件格式和解码感兴趣可以在 ...
- FFmpeg - 音频解码过程
1. 注册所有解码器 av_register_all(); 2. Codec & CodecContext AVCodec* codec = avcodec_find_decoder(COD ...
最新文章
- ubuntu apt-get彻底卸载软件包
- Centos系统磁盘扩容
- 原生javascript
- java B锁_Java中15种锁的介绍
- get_metrology_object_measures获取测量区域和计量模型的计量对象的边缘位置结果
- Lighttpd 的安装配置(web服务器软件)
- Pycharm设置utf-8自动显示
- 程序员必须知道的10大算法(转)
- 大厂前端必备技能Webpack原理剖析
- Linux的 7个运行级别
- mysql 5.7 group_mysql,_mysql5.7中group by和mysql5.5中group by的结果不一样,mysql - phpStudy...
- 推挽变换器matlab仿真,双驱动推挽DC-DC变换器方案分享之设计原理简析
- 阿里巴巴编程考试认证java编程规范+考试分享
- 青果教务php,拟物校园 | 拟物校园,一个高校教务系统爬虫,现支持正方教务、青果教务。...
- MICCAI2019论文分享 PART①
- 朋友圈加粗字体数字_报名 | 零基础入门brush lettering英文花式字体
- “中国十大名校”之争,缘何让百度气急败坏封贴?
- Response.addHeader()和Response.setHeader()的区别,别再傻傻分不清;
- nfcwriter写入_NFC 标签联系人写入教程:Tagstand Writer
- ajax的11个框架
热门文章
- 前端学习(3064):vue+element今日头条管理-状态处理
- [html] html5都有哪些新的特性?移除了哪些元素?
- [css] 使用css实现彩虹的效果
- 前端学习(2645):懂代码之header表头页之未读消息
- 前端学习(2372):uni-ui库
- 前端学习(1466):表格案例其他效果演示
- 前端学习(1421):ajax请求参数的格式类型
- 前端学习(1410):多人管理30数据分页
- 前端学习(77):css中常见margin塌陷问题之解决办法
- spring mvc学习(30):sessionatrribute存储session数据