Непрерывное воспроизведение видео DirectShow на скорости - PullRequest
0 голосов
/ 22 марта 2012

Я использую DirectShow / VMR9 для воспроизведения видео в формате MPEG 4 в моем приложении. Я использую IMediaSeeking SetRate, чтобы установить скорость видео. Воспроизведение видео, которое я создал, хорошо воспроизводится на скоростях до 4х, при этом видео становится очень резким. Воспроизведение одного и того же файла с помощью проигрывателя Windows Media на скорости выше 4х не является прерывистым. Может кто-нибудь пролить свет на то, почему Windows Media Player может воспроизводить мой файл нормально на скорости, а мой график фильтра DirectShow - нет.

Моя топология графа - Recording.avi -> AVI Splitter -> Mpeg4s Decoder DMO -> Ds.NET Grabber -> Преобразователь цветового пространства -> Микширование видео Renderer 9.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Обновление

Я удалил граббер (и, следовательно, csc), и воспроизведение не было резким до 8х, что было бы достаточно, но мне нужен граббер. CSC оказался там, когда я добавил граббер. Я хотел бы, если возможно, удалить CSC, чтобы посмотреть, улучшит ли это ситуацию, сохранив захват. Ниже приведены мои графики с промежуточными форматами с фильтром и без него. Я попытался установить для медиа подтипа устройства захвата значение NV12 (например, график без устройства захвата), однако я получаю сообщение об ошибке «Не удалось найти комбинацию промежуточных фильтров для установления соединения». Я включил свой код для настройки граббера.

Можно ли заставить это работать без csc?

Также не уверен, что это актуально, но я не понимаю, как изменяются размеры видео на графике без граббера.

С граббером

Recording.avi ----- (AVI) ----- AVI Splitter ----- (MP4V - 704 * 576 - 24 бит) ----- Декодер Mpeg4s DMO ----- (RGB24 704 * 576) ----- Ds.NET Grabber - (RGB24 704 * 576) ----- преобразователь цветового пространства ----- (ARGB32 704 * 576) ----- Видеосъемка с микшированием видео 9

без граббера

Recording.avi ----- (AVI) ----- AVI Splitter ----- (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);
    }

Сведения об использовании процессора

Core i3 - 3300 МГц - с гиперпоточностью 4 ГБ ОЗУ

4x Speed ​​

CPU1 ~ 45%

CPU2 ~ 0%

CPU3 ~ 33%

CPU4 ~ 0%

8x Speed ​​

CPU1 ~ 40%

CPU2 ~ 25% (но очень колючие 0-50%)

CPU3 ~ 40%

CPU4 ~ 0%

Core i3 - 3300 МГц - Гиперпоточность отключена в BIOS.

4x Speed ​​

CPU1 ~ 45%

CPU2 ~ 33%

8x Speed ​​(те же результаты на 16x Speed)

CPU1 ~ 66%

CPU2 ~ 45%

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Типичная причина заключается в том, что при такой скорости воспроизведения ваш поток декодирования работает на 100% ЦП и не способен декодировать больше кадров, вы начинаете видеть неправильное представление кадров и / или пропущенные кадры.

Где искать:

  • проверьте ваш ЦП с помощью диспетчера задач или другого приложения, чтобы узнать, не превышено ли одно из ядер и не переходит ли в состояние ожидания
  • проверил свойства VMR, чтобы убедиться, что кадры сброшены или джиттер становится слишком высоким

enter image description here

1 голос
/ 23 марта 2012

Для воспроизведения видео MediaPlayer использует MediaFoundation.И для большинства видео воспроизведение аппаратно ускорено.Если в DirectShow есть несколько фильтров между декодером и средством визуализации, в DirectShow нет аппаратного ускорения.Попробуйте еще раз без DS.Net Grabber и преобразователя цветового пространства (=> CSC также сильно снижает производительность)

...