2009-06-15 4 views
2

작업 : mpeg2 비디오 파일에서 임의의 프레임을 가져옵니다. 이제 사용자 지정 렌더링 필터를 사용하여 캡처하지만 필요한 프레임에 비디오를 배치하는 데 문제가 있습니다.SetPosition의 결과가 잘못됨

그래프를 통해 프레임을 전달하기 위해 SetPosition(), Pause() 다음에 필터 수신 첫 번째 프레임 대기 및 Stop()을 사용합니다.

프레임별로 프레임을 얻는다면,이 프레임이 몇 번 반복 된 후 정확한 시간 프레임에 대해 정확한 결과를 얻습니다.

왜 SetPosition이 잘못된 결과를 얻습니까?

+0

여기에 질문이 있습니까? –

+0

달성하려는 목표는 무엇입니까? 특정 프레임 가져 오기 또는 전체 비디오 캡처 중? –

+0

특정 프레임 받기 – Fanruten

답변

3

디코더는 이전 i 프레임에서 디코딩을 시작할 필요가있다. 일반적으로, demux는 적어도 1 초 전에 데이터를 푸싱하기 시작합니다. 프레임 수신을 시작할 때 타임 스탬프를 확인하여 원하는 프레임인지 확인해야합니다. 필터는 파일에서 찾기 시작 위치를 제공하는 "NewSegment"호출을 수신합니다. 이 시작 시간을 프레임의 샘플 시간에 추가하면 파일 내의 프레임의 절대 위치가 표시되고 요청 된 위치와 비교할 수 있습니다.

G

+0

샘플 시간 시작 시간을 추가합니다. SetPosition에서 설정 한 절대 위치는 ~ 0.5 초입니다. 오른쪽에 대해 – Fanruten

+0

소리가납니다. 그것은 GOP의 시작입니다. 당신이 원하는 프레임에 도착할 때까지 계속 소비하십시오. –

0

당신이 그래프를 렌더링 한 후 그래프를 일시 정지 할 필요가있다. 그런 다음 SetPositions를 사용하여 표시 할 프레임을 변경할 수 있습니다. 이 같은

뭔가 :

int ShowFrame(long lFrame) 
{ 
    if (FAILED(m_pMC->Pause())) 
     return -1; 
    LONGLONG llUnknown = 0; 
    LONGLONG llTime = LONGLONG(m_lFrameTime) * lFrame + m_lFrameTime/2; 
    GUID TimeFormat; 
    if (FAILED(m_pMS->GetTimeFormat(&TimeFormat))) return -1; 
    if (TimeFormat == TIME_FORMAT_MEDIA_TIME) 
    { 
     llUnknown = llTime; 
    } 
    else 
    { 
     if (FAILED(m_pMS->ConvertTimeFormat(&llUnknown, &TimeFormat, llTime, &TIME_FORMAT_MEDIA_TIME))) return -1; 
    } 
    if (FAILED(m_pMS->SetPositions(&llUnknown, AM_SEEKING_AbsolutePositioning, 0, AM_SEEKING_NoPositioning))) return -1; 
    return 0; 
} 

m_lFrameTime 한 프레임 당 시간, 당신은 사용자 정의 렌더러에서 얻을 수 있습니다. 비디오 렌더러 핀이 연결되면 해당 핀에서 VIDEOINFO :: AvgTimePerFrame을 얻을 수 있습니다.

관련 문제