다음을 통해 공유


원시 AV/C 명령 실행

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

IAMExtDevice, IAMExtTransportIAMTimecodeReader 인터페이스는 메서드 호출을 드라이버의 명령으로 변환한 다음 드라이버의 응답을 해석하고 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 메서드는 다음 오류 코드 중 하나를 반환할 수 있습니다.

오류 코드 Description
ERROR_TIMEOUT 명령 시간이 초과되었습니다.
ERROR_REQ_NOT_ACCEP 디바이스가 명령을 수락하지 않았습니다.
ERROR_NOT_SUPPORTED 디바이스는 명령을 지원하지 않습니다.
ERROR_REQUEST_ABORTED 명령이 중단되었습니다. 디바이스가 제거되었거나 버스 재설정이 발생했습니다.

 

참고

이러한 오류는 HRESULT가 아닌 Win32 오류 코드로 반환되므로 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 캠코더 제어