DirectShow/VMR9를 사용하여 응용 프로그램에서 MPEG 4 비디오를 재생하고 있습니다. IMediaSeeking SetRate를 사용하여 비디오의 속도를 설정합니다. 내가 만든 비디오를 재생하는 것은 최대 4 배 속도로 잘 재생됩니다.이 경우 비디오가 매우 번쩍 거립니다. Windows Media Player를 사용하여 동일한 파일을 4 배 이상의 속도로 재생하는 것은 번쩍 거리는 현상이 아닙니다. Windows Media Player가 내 파일을 속도로 재생할 수 있지만 DirectShow 필터 그래프를 재생할 수없는 이유는 누구나 알 수 있습니다. > AVI 스플리터 - -DirectShow Jerky 비디오 재생 속도
내 그래프 토폴로지는 Recording.avi입니다> Mpeg4s 디코더 DMO -> Ds.NET 그래버 -> 색 공간 변환 -> 비디오 믹싱 렌더러 9
당신이 어떤 필요하면 알려 주시기 바랍니다 추가 정보.
업데이트
나는 그래버를 제거 (및 CSC뿐만 아니라) 재생이 충분 될 것이라고 8 배까지 육포되지하지만 난 그래버를 필요합니까. CSC는 그래버를 추가 할 때 거기에서 끝났습니다. 가능한 경우 그래버를 유지하면서 CSC를 제거하여 문제가 개선되는지 확인하고 싶습니다. 아래에는 필터가 있거나없는 중간 형식의 그래프가 있습니다. 나는 grabber의 media subtype을 NV12 (그래버가 아닌 그래프)로 설정하려고 시도했지만, "중간 필터를 조합해서 찾을 수 없습니다."라는 오류 메시지가 나타납니다. 그래버 구성을위한 코드가 포함되어 있습니다.
csc없이 작동하게 할 수 있습니까?
관련성이 있는지는 확실치 않지만 그래버없이 그래프에서 비디오 치수가 어떻게 변경되는지 이해할 수 없습니다. 그래버와
Recording.avi ----- (AVI) ----- ----- AVI 스플리터 (MP4V - 704 * 576 - 24 비트) ----- Mpeg4s 디코더 DMO ----- (RGB24 704 * 576) ----- Ds.NET 그래버 - (RGB24 704 * 576) ----- 색 공간 변환기 ----- (ARGB32 704 * 576) - --- 그래버없이 비디오 믹싱 렌더러 9
Recording.avi ----- (AVI) ----- AVI 스플리터 ----- (MP4V - 704 * 576 - 24 비트) ----- Mpeg4s 디코더 DMO ----- (NV12 768 * 576 12 비트) ----- 비디오 믹싱 렌더러 9.
private void ConfigureSampleGrabber(ISampleGrabber sampleGrabber)
{
AMMediaType media;
int hr;
// Set the media type to Video/RBG24
media = new AMMediaType();
media.majorType = MediaType.Video;
media.subType = MediaSubType.ARGB32; // tried NV12 here, gives error.
media.formatType = FormatType.VideoInfo;
hr = sampleGrabber.SetMediaType(media);
DsError.ThrowExceptionForHR(hr);
DsUtils.FreeAMMediaType(media);
media = null;
// Configure the samplegrabber
hr = sampleGrabber.SetBufferSamples(true);
DsError.ThrowExceptionForHR(hr);
}
CPU 사용 정보
코어 I3 - 3300MHz - 하이퍼 스레딩 4기가바이트 RAM
4 배 속도
CPU1 ~ 45 %
CPU2 ~ 0 %
CPU3 ~ 33 %
CPU4 ~ 0 %
8 배 속도
CPU1 ~ 40 %
CPU2 ~ 25 % (하지만 매우 뾰족한 0-50 %)
CPU3 ~ 40 %
CPU4 ~ 0 %
코어 i3 - 3300MHz - BIOS에서 하이퍼 스레딩이 비활성화되었습니다.
배속
CPU1 ~ 45 %
CPU2 ~ 33 %
8 배 속도 (16 배속에서 동일한 결과)
CPU1 ~ 66 %
CPU2 ~ 45 %
CPU로드가 너무 높지 않아 고속으로 재생할 때 지터와 프레임이 떨어집니다. 그래버를 제거하면 상황이 개선되는 것 같습니다. – integra753
그래버 (grabber)와'CSC' 필터는 문제가 아닙니다. 오버 헤드가 적습니다 (다른 대답은 반대이지만 아주 정확하지는 않습니다). 그래버를 추가 할 때 발생하는 문제는 디코더가 'NV12'형식이 아닌 'RGB'비디오를 출력해야한다는 것입니다. 'RGB' 변환은 오버 헤드를 추가하고 더 많은 하드웨어 대역폭을 소비합니다. 이것은 성능에 영향을줍니다. 그러나 이것은 당신이 당신의 grabber에서 RGB 데이터를 응용 프로그램으로 복사하고자 할 때 파이프 라인을 설정하는 것과 정확히 같습니다. 어쨌든 병목 상태가 CPU 및/또는 그래버 콜백으로 의심됩니다. –
지나치게 높은 것으로 생각하지 않는 원래 게시물에 CPU 사용 내역을 추가 했습니까? 또한 콜백에 대한 귀하의 의견과 관련하여 나는'sampleGrabber.SetBufferSamples (true); 프레임을 버퍼링하고 캡쳐 이미지 버튼을 누를 때마다'sampleGrabber.GetCurrentBuffer (xx, xx)'를 사용하고 있습니다. – integra753