共用方式為


發出原始 AV/C 命令

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

IAMExtDeviceIAMExtTransportIAMTimecodeReader介面的運作方式是將方法呼叫轉譯為驅動程式的命令,然後解譯驅動程式的回應,並透過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,因此您應該直接測試這些值,而不是使用 SUCCEEDEDFAILED 宏。

 

如果方法傳回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);

控制 DV Camcorder