2012-03-22 2 views
0

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 %

답변

2

일반적으로이 재생 속도에서 디코딩 스레드가 100 % CPU에서 실행되고 더 많은 프레임을 디코딩 할 수없는 경우 불규칙한 프레임 프레젠테이션 및/또는 프레임 드롭이 발생하기 시작합니다.

어디보고 :

  • 는 코어 중 하나가 끝나가되지 않고 더 이상 상태를 유휴 것입니다 있는지 확인하기 위해 작업 관리자 또는 다른 응용 프로그램과의 CPU를 확인
  • 이 있는지 확인하기 위해 VMR 속성을 확인 프레임은 삭제됩니다, 또는 지터는 MediaPlayer를 사용중인 비디오의 재생을 위해

enter image description here

+0

CPU로드가 너무 높지 않아 고속으로 재생할 때 지터와 프레임이 떨어집니다. 그래버를 제거하면 상황이 개선되는 것 같습니다. – integra753

+0

그래버 (grabber)와'CSC' 필터는 문제가 아닙니다. 오버 헤드가 적습니다 (다른 대답은 반대이지만 아주 정확하지는 않습니다). 그래버를 추가 할 때 발생하는 문제는 디코더가 'NV12'형식이 아닌 'RGB'비디오를 출력해야한다는 것입니다. 'RGB' 변환은 오버 헤드를 추가하고 더 많은 하드웨어 대역폭을 소비합니다. 이것은 성능에 영향을줍니다. 그러나 이것은 당신이 당신의 grabber에서 RGB 데이터를 응용 프로그램으로 복사하고자 할 때 파이프 라인을 설정하는 것과 정확히 같습니다. 어쨌든 병목 상태가 CPU 및/또는 그래버 콜백으로 의심됩니다. –

+0

지나치게 높은 것으로 생각하지 않는 원래 게시물에 CPU 사용 내역을 추가 했습니까? 또한 콜백에 대한 귀하의 의견과 관련하여 나는'sampleGrabber.SetBufferSamples (true); 프레임을 버퍼링하고 캡쳐 이미지 버튼을 누를 때마다'sampleGrabber.GetCurrentBuffer (xx, xx)'를 사용하고 있습니다. – integra753

1

너무 높은지고 MediaFoundation. 또한 대부분의 비디오는 재생 속도가 빨라집니다. DirectShow의 디코더와 렌더러 사이에 필터가 있으면 DirectShow에 하드웨어 가속 기능이 없습니다. DS가 없으면 다시 시도하십시오.Net Grabber와 color-space-converter (=> csc는 대단한 성능 킬러입니다.)

+0

그래버가 필요하지만 그래버를 제거하면 자잘 함이 사라집니다. 가능한 경우 csc를 제거하려고합니다. 업데이트 된 내용은 첫 번째 게시물을 참조하십시오. – integra753