2011-10-25 2 views
0

Roman R의 답변 덕분에 제 3 자 디코더 라이브러리를 래핑하는 비동기 필터가 생겼습니다.디코더 필터에서 타임 스탬프를 어떻게 만듭니 까?

인코딩 된 입력 샘플이 네트워크 소스에서 제공됩니다. 현재 디코딩 된 프레임에 타임 스탬프를 추가하지 않으므로 데이터 패킷이 수신되는 시간에 따라 프레임 속도가 다소 엉망입니다.

라이브러리는 전체 프레임을 디코딩 할 때 원본 인코더의 클럭에 따라 프레임이 캡처 된 시간의 UTC 타임 스탬프도 제공합니다.

질문 : 어떻게 스트림 시간에 관련시킬 수 있으며 SetTime 함수에 적합한 값을 만들 수 있습니까? 나는 그걸 가지고 놀았지만, 내가 들어있는 값들은 CBaseOutputPin :: Deliver 함수에서 필터 그래프를 잠그는 것처럼 보인다.

답변

0

가장 쉬운 타임 스탬프는 다음과 같습니다. 첫 번째 미디어 샘플을 0으로 타임 스탬핑하면 (다음 단락의 조정 참고 사항 참조) 다음과 같이 차이가 나는 스탬프가 찍 힙니다. 즉, 스트리밍을 시작하고 네트워크 원본에서 첫 번째 샘플을 가져 오면이 시간은 UTC0이고 DirectShow 미디어 샘플에는 0을 붙입니다. UTC 시간이 UTC1 ... UTCN 인 프레임 1, 2 ... N 다음에 DirectShow 시간 UTCN - UTC0으로 변환됩니다. DirectShow가 100 ns 단위를 필요로하고 네트워크 소스가 1/9000과 같은 것을 제공 할 수 있으므로 적절한 단위로 추가 변환이 필요할 수 있습니다.

원본이 원본 소스 일 가능성이 높고 첫 번째 프레임이 그래프 실행 시간과 정확하게 일치하지 않을 수 있으므로 현재 필터 그래프의 IReferenceClock::GetTime과 인수로받은 시간의 차이를 사용하여 결과 미디어 샘플 타임 스탬프를 조정할 수 있습니다. IBaseFilter::Run 전화.

+0

감사합니다. 이 선을 따라 뭔가를 시도했지만 IBaseFilter :: Run에서 시간을 빼지 않고 IReferenceClock :: GetTime의 현재 값을 사용했습니다. 이것이 GetTime에 의해 리턴 된 값이 아마도 필터 시간이 아닌 시스템 시간 일 때 내 필터가 잠기는 원인이되었다고 가정합니다. 정확합니까? –

+0

예이 값은 0으로 정렬되어 있지 않으므로 오랜 지연 후에 데이터를 재생하도록 예약했을 수 있습니다. –

+0

감사합니다. 나는 아침에 다른 것을 바칠거야. –

관련 문제