Я использую 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%