【原】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音频解码插件开发总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vim7.1在windows下的编码设置
- 下一篇: 如何在textarea中显示html代码