發出原始 AV/C 命令
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
IAMExtDevice、IAMExtTransport和IAMTimecodeReader介面的運作方式是將方法呼叫轉譯為驅動程式的命令,然後解譯驅動程式的回應,並透過HRESULT或輸出參數傳回它。 不過,某些裝置函式可能無法透過這些方法存取。 因此,MSDV 支援將原始 AV/C 命令傳送至裝置。
使用此功能時,您應該記住下列幾點:
- 命令會直接傳遞至裝置,沒有錯誤檢查或參數驗證。 基於這個理由,只有在 DirectShow 介面未實作您需要的功能時,才應該發出原始 AV/C 命令。
- 所有原始 AV/C 命令都是同步的。 發出命令的執行緒會封鎖,直到命令傳回為止。
- 一次只能提供一個命令。 處理命令時,裝置將會拒絕任何其他命令。
- UVC 驅動程式不支援原始 AV/C 命令。
若要傳送 AV/C 命令,請將命令格式化為位元組陣列。 然後呼叫 IAMExtTransport::GetTransportBasicParameters。 傳入ED_RAW_EXT_DEV_CMD旗標、陣列大小和陣列。 您必須將陣列位址轉換成 LPOLESTR* 類型,因為此參數的原始用途是傳回字串值。
BYTE AvcCmd[] = { ... }; // Contains the AV/C command (not shown)
long cbCmd = sizeof(AvcCmd);
hr = pTransport->GetTransportBasicParameters(
ED_RAW_EXT_DEV_CMD,
&cbCmd,
(LPOLESTR*) AvcCmd);
陣列的內容會直接傳遞至裝置,因此您必須小心正確格式化。 命令可以將單位 (相機) 或子單位 (磁帶或相機) 。 相關標準可從 1394 貿易聯盟網站取得。
- AV/C 數位介面命令集一般規格
- AV/C 磁帶錄製器/播放機子單位規格
先前描述如何格式化 AV/C 命令,並列出單元命令。 後者的規格會列出子單位命令。
GetTransportBasicParameters方法可能會傳回下列其中一個錯誤碼:
錯誤碼 | 描述 |
---|---|
ERROR_TIMEOUT | 命令逾時。 |
ERROR_REQ_NOT_ACCEP | 裝置不接受 命令。 |
ERROR_NOT_SUPPORTED | 裝置不支援 命令。 |
ERROR_REQUEST_ABORTED | 命令已中止。 裝置已移除或發生匯流排重設。 |
注意
這些錯誤會以 Win32 錯誤碼傳回,而不是 HRESULT,因此您應該直接測試這些值,而不是使用 SUCCEEDED 和 FAILED 宏。
如果方法傳回S_OK,裝置的回應會複製到陣列中。 回應承載可能大於命令,因此您必須配置夠大的緩衝區來保存它。 承載大小上限為 512 個位元組。 請注意,S_OK的傳回值不一定表示裝置已成功執行命令。 應用程式必須檢查回應承載,以判斷狀態。
下列範例顯示搜尋絕對追蹤編號搜尋的命令:
// Set up the ATN search command.
BYTE AvcCmd[] =
{
0x00, // ctype = "control"
0x20, // subunit_type, subunit_id
0x52, // opcode (ATN)
0x20, // operand 0 = "search"
0x00, // operand 1 = ATN
0x00, // operand 2 = ATN
0x00, // operand 3 = ATN
0xFF // operand 4 = D-VCR medium type.
};
// Specify a track number.
ULONG ulTrackNumber = track_number; // Specify the track number here.
// Shift over by 1 (LSB of operand 1 is a 1-bit blank flag)
ulTrackNumber = ulTrackNumber << 1;
// Plug this number into operands 1 - 3.
AvcCmd[4] = (BYTE) (ulTrackNumber & 0x000000FF);
AvcCmd[5] = (BYTE)((ulTrackNumber & 0x0000FF00) >> 8);
AvcCmd[6] = (BYTE)((ulTrackNumber & 0x00FF0000) >> 16);
相關主題