發出原始 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 方法可能會傳回下列其中一個錯誤碼:
錯誤碼 | 描述 |
---|---|
錯誤_逾時 | 命令逾時。 |
錯誤_請求_不被接受 | 裝置不接受 命令。 |
不支援錯誤 | 裝置不支援 命令。 |
錯誤_請求已中止 | 命令已中止。 可能設備已被移除或發生了總線重設。 |
注意
這些錯誤會以 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);
相關主題