共用方式為


發出原始 AV/C 命令

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

IAMExtDeviceIAMExtTransport,以及 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,因此您應該直接檢查這些值,而不是使用 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 攝影機