필자는 DirectShow 푸시 소스 필터와 DirectShow 간단한 오디오 믹서 필터를 모두 DSPACK 컴포넌트 라이브러리의 도움으로 Delphi 6로 작성했습니다. 내 응용 프로그램에서는 수동으로 필터 그래프를 만들고 핀 연결의 경우 DirectShow의 "지능형 연결"기술로 인한 간섭을 피하기 위해 IFilterGraph.ConnectDirect()를 사용합니다. 내 프로그램의 내부에있는 개인/등록되지 않은 필터로 두 필터를 모두 사용하고 있습니다.DirectShow 푸시 소스 필터로 인해 데이터가 예상보다 빨리 전송 될 수있는 원인은 무엇입니까?
그래프를 만들 때 캡쳐 필터와 그래프의 헤드 위치를 공유하는 푸시 소스 오디오 필터가 있습니다. 이들의 출력 핀은 내 간단한 오디오 믹서에 연결되며, 후자는 다중 입력 연결을 지원합니다. 믹서는 입력 및 출력 핀에 대한 모든 연결을 해당 생성자에서 미리 설정된 것과 정확히 동일한 미디어 형식 유형으로 설정합니다. 이 경우 사용하고있는 포맷 설정은 8000의 샘플 레이트, 샘플 당 16 비트 및 하나의 채널을 가진 WAV 포맷입니다. 참고, DecideBufferSize()를 사용하여 모든 필터를 50 밀리 초의 버퍼 크기로 설정합니다. 결과적으로 400 바이트 (200 샘플)의 버퍼가 전달됩니다.
캡처 필터는 DirectShow API를 사용하여 찾을 수있는 외부 COM 개체입니다. 현재 내 VOIP 전화를 장치 (Moniker)로 할당하고 있습니다. 몇 가지 이상한 이유로 내 푸시 소스 필터가 캡처 필터보다 정확히 7 배의 속도로 버퍼를 펌핑합니다. 즉, 믹서 필터는, 캡춰 필터로부터받는 각 버퍼의 푸쉬 소스 필터로부터 7 개의 버퍼를 취득하고있다. 나는 믹서 필터가 버퍼를 얻을 때마다 라인을 디버깅하고 버퍼의 소스 인 필터를 식별하기 때문에 이것을 알고있다.
캡쳐 필터가 외부 코드이므로 타임 스탬프를 어떻게 형성하는지 모르겠지만 일반적인 방식이 예상됩니다. 내 푸시 소스 필터는 0에서 시작하여 각 FillBuffer() 호출로 버퍼가 나타내는 시간으로 DirectShow 참조 시간 형식의 타임 스탬프를 증가시킵니다.
여기 내 질문이 있습니다 : 내가 수동으로 그래프를 구축하고있는 경우
1) 타임 스탬프도 중요할까요? DirectShow는 필터 사이에 들어가므로 그래프를 완전히 수동으로 빌드하더라도 핀 쓰기 (수신 호출) 타이밍에 영향을 줄 수 있습니까?
2) 일반적인 실수로 인해 그래프 전체에 균일 한 미디어 포맷이 있음에도 불구하고 필터가 너무 빨리 버퍼를 밀어 낼 수 있습니까?
감사합니다. @Roman R. 버퍼를 생성하기위한 푸시 소스 필터 논리가 잘못되었을 수 있습니다. 내 푸시 소스 필터는 본질적으로 예를 들어 Skype 통화에서와 같이 DirectShow 스트림으로 푸시해야하는 다른 "라이브"스트리밍 소스의 맞춤 오디오 용 "입력 잭"입니다. 밀어야 할 오디오 데이터가 없으면 빈 데이터 버퍼를 반환합니다.내가 데이터가 부족하여 빈 버퍼 대신 새 데이터를 기다리고있을 때 S_FALSE를 반환해야합니까? 그렇다면 버퍼 그래프의 7 대 1 비율이 여전히 내 필터 그래프의 이상한 증상으로 남습니다. 그 원인은 무엇입니까? –
묻는 것을 잊었습니다. 시스템 시간에 타임 스탬프를 오프셋해야합니까? 또는 스트리밍이 시작될 때 0부터 시작하여 안정적으로 계속 증가하는 것으로 충분합니까? 렌더러는 스트림 별 asis에서 일종의 상대 타임 스탬프 계산을 수행해야한다고 생각 하겠지만 아마도 그런 식으로 작동하지 않으며 시스템 클럭에서 작동해야합니까? –
그래프를 실행하는 시점의 기준 시계 시간에 해당하는 0부터 시작합니다. 렌더러는 상대 시간을 기준 시간과 호환 가능한 시간으로 변환합니다. –