2011-10-20 2 views
1

저는 아직 개발 중이지만 지금은 H.264/MPEG-4 비디오 스트림으로 작업하고있는 자체 RTSP 소스 필터 솔루션을 보유하고 있습니다. 내 문제는 초기화 단계에 있습니다. graphedit을 열고 RTSP 소스, 디코더 및 비디오 렌더러 필터를 하나씩 추가하고 핀을 연결하면 모든 것이 잘 작동합니다 (RTSP 소스 URL은 현재 하드 코드되어 있습니다). 그러나 그래프를 저장하고 저장된 파일에서 그래프를 다시 열려고하면 그래프가 충돌합니다. 그 이유는 내 RTSP 소스 필터의 초기화 부분에 있다고 생각합니다. 내 필터는 처음부터 스트림에 대해 아무것도 모르기 때문에 유효하지 않은 매개 변수를 디코더에 전달합니다. 따라서 내 질문은 다음과 같습니다.RTSP 소스 필터 초기화

  • 어떻게 초기화 프로세스를 정확하게 처리해야합니까?
  • (코드에서 어떤 기능을합니까?) 소스에 정확히 연결하고 전송을 시작해야합니까? 필터 클래스 생성자? 출력 핀 클래스 생성자? OnThreadCreate?
  • 스트림에서 비디오 너비/높이와 같은 정보를 얻어야합니까, 아니면 스트림을 디코더로 전달해야합니까? 이 일을하는 올바른 방법은 무엇입니까? (일부 비디오 렌더러는 VIDEOINFOHEADER 구조의 너비/높이 정보를 사용한다고 생각합니다.)
  • 버퍼 크기는 어떻게 결정해야합니까? GetMediaType 메서드에서 비트 맵 정보 헤더에서 샘플 크기를 다음과 같이 설정합니다.

    pMediaType-> SetSampleSize (pvi-> bmiHeader.biSizeImage);

어떻게 biWidth 같은 매개 변수를 설정해야 biHeight, biSizebiSizeImage? 나는 처음에 몇 가지 기본값으로 설정하고 스트림을받은 후 변경해야한다고 생각하지만 어떻게해야합니까?

모든 질문은 같은 문제를 나타냅니다. 내 RTSP 소스 필터의 초기화 프로세스에서 정확히 무엇을해야합니까?

! 업데이트!

저장된 그래프를로드 할 때 디코더와 비디오 렌더러간에 연결을 끊었다가 다시 연결하면 문제가 해결됩니다. 다른 비디오 렌더러 (Microsoft 및 일부 다른 사용자 지정 비디오 렌더러)를 사용하여 시도했습니다. 그들은 모두 비슷한 반응을 보입니다. 일부는 충돌하지 않지만 크기/종횡비가 잘못된 비디오를 실행합니다. 분명히, 그래프를 왜곡 시키거나 이상한 결과를내는 것은 내 소스 필터가 아니라 비디오 렌더러에 전달 된 일부 잘못된 정보입니다. 이 상황은 다른 RTSP 소스 필터에서 발생하지 않기 때문에 나는 여전히 잘못된 행동을하고 있다고 생각합니다. 누락 된 것이 있습니다.

이 문제가 발생할 수있는 이유는 무엇입니까? 그래프가 실행되면 미디어 정보를 보내야합니까?

P.S : 그래프를 실행할 때만 그래프가 충돌합니다. 그래프를로드해도 크래시가 발생하지 않습니다.

답변

3

Wimmel과 동의합니다. 필터가 저장된 그래프에서로드되는 것을 지원하지 않으면 문제가되지 않는다고 생각합니다. 또한 Roman이 말했듯이 디버깅해야하는 충돌과 구현 문제라는 두 가지 문제가 있습니다.

  • 가 어떻게 정확하게 초기화 과정을 처리한다 : 당신의 몇 가지 질문에 대한 대답에서

    ?

    한 가지 방법은 IFileSourceFilter 인터페이스를 구현하는 것입니다. 이 메서드는 필터가로드 된 직후의 GraphEdit, Windows Media Player에서 호출되며 RTSP DESCRIBE를 사용하여 미디어 세션 설명을 가져올 수 있습니다. 실행중인 스트림이 필요한 미디어 유형의 경우 스트림을 재생하고 너비 및 높이와 같은 미디어 매개 변수를 추출한 다음 그래프를 올바르게 설정할 수 있습니다. H264는 SDP에서 보통 인 시퀀스 및 픽처 파라미터 세트의 정보에 의존한다. GetMediaType 전에 DS 프레임 워크에서 IFileSourceFilter :: Load 메서드를 호출하면 디코더 에 올바른 매개 변수를 제공해야합니다.

  • 스트림에서 비디오 너비/높이와 같은 정보를 얻을 필요가 있거나 스트림을 디코더로 전달해야합니까? 이 일을하는 올바른 방법은 무엇입니까? (일부 비디오 렌더러는 VIDEOINFOHEADER 구조체의 너비/높이 정보를 사용한다고 생각합니다.) 버퍼 크기는 어떻게 결정해야합니까? GetMediaType 메서드에서 비트 맵 정보 머리글과 같은 샘플 크기를 설정합니다 ...

    디코더에 따라 다르지만 일부 디코더는 미디어를 스트리밍 한 다음 모든 항목을 올바르게 설정하기 만하면되며 다른 옵션에서는 너비와 높이, 등등을 정확하게 구성해야합니다. 위에 설명 된 접근 방법을 사용하는 경우 중요하지 않습니다.

오픈 소스 RTSP 소스 필터는 sourceforge에서 다운로드 할 수 있습니다. 상업용 등급 RTSP 소스 필터가 아니며 몇 가지 (대부분 오디오) 미디어 유형을 처리하지만 직접 작성하는 데 도움이되는 다양한 측면을 보여줍니다. IIRC 내가 H.264 지원을 추가하기 시작했고 live555 RTSP 서버를 사용하는 기본 테스트는 괜찮 았지만 H.264 스트림의 타임 스탬프와 관련된 몇 가지 문제가있었습니다 ...

또한 GraphStudio RTSP 소스 필터를 테스트하는 목적 : IFileSourceFilter 인터페이스를 구현하면 URL을 입력 할 수 있습니다. GraphEdit과 매우 비슷하지만 개인적으로 선호합니다.

+0

IFileSourceFilter를 구현하지 않았지만 다른 모든 RTSP 소스 필터가이 필터를 사용합니다. 그래서 내가 찾던 그 부분이 빠진 것 같아요. 나는 그것이 꼭 필요한 것이 아니라는 것을 안다.하지만 그것이 내 문제를 해결할 것이라고 믿는다. 고맙습니다. –

3

충돌이 발생하면 예외 (예 : 액세스 위반)가 발생하고 문제가 발생한 시점에 호출 스택이 있어야합니다. 여기서 디버깅 할 곳입니다. 나머지는 완전히 무관하다는 것을 알게 될 수도 있습니다. 그리고 이것은 초기화되지 않은 변수와 같은 간단한 것의 원인입니다.

+0

하지만 원본 필터를 추가하고 핀을 추가 한 후 연결하면 충돌이 발생하지 않습니다. 즉각적으로 디코더에 연결되면 충돌이 발생합니다. 또한 충돌이 발생하지 않더라도 내 다른 질문은 여전히 ​​중요합니다. –

+0

시간을 충분히 주면 충돌이 발생하지 않지만 충돌이 발생하지는 않습니다. 그것은 필터이므로 옵션과 형식을 발견하기 전에 RTSP 측에서 연결이 이루어지면 올바르게 처리하지 마십시오. 필터는 미디어 유형을 열거 할 수 있어야하므로 장치 연결 중 아직 진행중인 상태에서 이러한 요청을 수신하면 RTSP에서 기능 검색을 동기화하고 완료해야합니다. –

+0

내 첫 번째 게시물에서 업데이트를 읽으십시오. –

2

필터가 저장된 그래프에서 다시로드되는 것을 완전히 지원하지 않는다면 큰 문제는 아니라고 생각합니다. 그러나 충돌해서는 안됩니다.

먼저 충돌이 발생한 위치를 검색하는 것이 좋습니다.디버거를 사용하기가 어렵다면 OutputDebugString을 사용하여 trace 문을 추가하고 DebugView을 사용하여 충돌 전에 마지막으로 실행 된 내용을 확인하십시오. 예를

HRESULT SetSampleSize(...) 
{ 
    OutputDebugString("SetSampleSize start\n"); 

    //your code 

    OutputDebugString("SetSampleSize exit\n"); 
} 

위해 당신은 추적에 SetSampleSize start를 참조하면,하지만 출구, 당신은 그 함수 내부에서 충돌 알고있다.

매개 변수를 모르는 경우 함수를 처리 할 수없는 경우 E_FAIL 만 반환하면됩니다. 어떤 스트림을 수신하는지 모르는 경우 핀을 연결할 수 없다고 생각할 수 있습니다. 핀을 연결하지 않으면 그라디언트 필터가 연결되지 않은 상태로로드됩니다. 잘못된 형식으로 연결하는 것보다 낫습니다.

+0

내 첫 번째 게시물에서 업데이트를 읽으십시오. –

+0

@ EmirAkaydın 나는이 문제를 일으키는 원인이 무엇인지 짐작하지 않습니다. 잘못 될 수있는 것들이 너무 많습니다. 충돌이 발생하면 먼저 충돌이 발생하는 위치를 찾으십시오. 코드에없는 경우로드 한 후 및 수동으로 연결 한 후 그래프 상태 간의 차이점을 검색하십시오. 심지어 graphedit은 핀에서 mediaformat에 대한 정보를 보여줍니다. 차이가 있으면 매우 쉽게 볼 수 있습니다. – wimh