日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【原】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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【原】AMR音频解码插件开发总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。