2015-04-01 4 views
2

Я использую Video Resizer DSP Video Resizer DSP, чтобы изменить размер моего видео. Я работаю с Lazarus Free Pascal и DSPack.Как работать с AMMediaType для видеофильтров

Этот сайт объясняет, как использовать: http://alax.info/blog/1371

  • CoCreateInstance ЦСП, как DMO и добавить его в ДМО обертке фильтра
  • Используйте IWMResizerProps :: SetFullCropRegion для инициализации DSP
  • Подключите входной контакт
  • Установить тип выходного сигнала через IMediaObject :: SetOutputType
  • IGraphBuilder :: вывод вывода ConnectDirect

Я пишу это:

//Create Resizer DMO 
hr := CoCreateInstance(CLSID_DMOWrapperFilter, NIL, CLSCTX_ALL, 
IID_IBaseFilter, FResizerDMO); 
if FAILED(hr) then EXIT; 
//CLSID_CVideoResizerDMO = '{1ea1ea14-48f4-4054-ad1a-e8aee10ac805}' 
Hr := (FResizerDMO as IDMOWrapperFilter).Init(CLSID_CVideoResizerDMO, 
DMOCATEGORY_VIDEO_EFFECT); 
if FAILED(Hr) then EXIT; 
//Add filter to graph 
(fgRender as IGraphBuilder).AddFilter(FResizerDMO, 'Resizer'); 
if FAILED(Hr) then EXIT; 
// end create FResizerDMO in my graph 

// Set output type via IMediaObject::SetOutputType and create structure 
ZeroMemory(@mt, sizeof(DMO_MEDIA_TYPE)); 
mt.majortype := MEDIATYPE_Video; 
mt.subtype := MEDIASUBTYPE_RGB32; 
mt.formattype := FORMAT_VideoInfo; 
mt.lSampleSize := pVIH.bmiHeader.biSize; 
FillChar(pVIH, SizeOf(TVideoInfoHeader), 0); 
mt.pbFormat := CoTaskMemAlloc(sizeof(VIDEOINFOHEADER)); 
pVIH := TVideoInfoHeader(mt.pbFormat^); 
pVIH.bmiHeader.biWidth := 720; 
pVIH.bmiHeader.biHeight := 576; 
pVIH.bmiHeader.biXPelsPerMeter:=9; 
pVIH.bmiHeader.biYPelsPerMeter:=16; 
pVIH.bmiHeader.biSize := SizeOf(TBitmapInfoHeader); 
pVIH.bmiHeader.biSizeImage := 720 * 576 * 4; 
// connect pin and next 
hr := (FResizerDMO as IMediaObject).SetOutputType 
(0,@mt,DMO_SET_TYPEF_CLEAR); 

в час я получить DMO_E_TYPE_NOT_ACCEPTED. , где я ошибаюсь? Может кто-нибудь мне помочь? Спасибо.

ответ

0

Перекресток сообщения на эту тему: How to configure the Resizer DMO?.

Я не думаю, что ваш код вокруг pbFormat верен. По-видимому, FillChar должен вызвать vioaltion доступа к памяти, поскольку вы делаете это слишком рано. Тогда похоже, что вы изменяете копию выделенных данных (объявление pVIH не показано). Тогда biXPelsPerMeter/biYPelsPerMeter выглядит несколько странно, хотя я думаю, что это можно принять. Затем вы не инициализируете остальные поля TVideoInfoHeader.

Просто смотрите pVIH в отладчике перед вызовом, и вы увидите, что структура не определена.

Начните с инициализации явно всех полей структуры VIDEOINFOHEADER.

0

спасибо Roman R.

//Create Resizer DMO 
hr := CoCreateInstance(CLSID_DMOWrapperFilter, NIL, CLSCTX_ALL, 
IID_IBaseFilter, FResizerDMO); 
if FAILED(hr) then EXIT; 
//CLSID_CVideoResizerDMO = '{1ea1ea14-48f4-4054-ad1a-e8aee10ac805}' 
Hr := (FResizerDMO as IDMOWrapperFilter).Init(CLSID_CVideoResizerDMO, 
DMOCATEGORY_VIDEO_EFFECT); 
if FAILED(Hr) then EXIT; 
//Add filter to graph 
(fgRender as IGraphBuilder).AddFilter(FResizerDMO, 'Resizer'); 
if FAILED(Hr) then EXIT; 
// end create FResizerDMO in my graph 
//-------------------------------- 
// Use IWMResizerProps::SetFullCropRegion to initialize the DSP 
// I have a hard time writing this. this must resize the canvas? 
//------------------------------- 
ZeroMemory(@mt, sizeof(DMO_MEDIA_TYPE)); 
mt.majortype := MEDIATYPE_Video; 
mt.subtype := MEDIASUBTYPE_RGB32; 
mt.formattype := FORMAT_VideoInfo; 
mt.lSampleSize := pVIH.bmiHeader.biSize; 
FillChar(pVIH, SizeOf(TVideoInfoHeader), 0); 
mt.pbFormat := CoTaskMemAlloc(sizeof(VIDEOINFOHEADER)); 
pVIH := TVideoInfoHeader(mt.pbFormat^); 
source.Left:=0; source.Top:=0; source.Right:=1920; source.Bottom:=1080; 
// if source = (0,0,0,0) read size of the video source? 
pVIH.rcSource := source; 
target.Left:=0; target.Top:=0; target.Right:=576; target.Bottom:=720; 
PVIH.rcTarget:= target; 
pVIH.dwBitRate:= 0; 
PVIH.dwBitErrorRate:= 0; 
pVIH.AvgTimePerFrame:= 333667; //this is for 29 frames, I want 25 frames 
pVIH.bmiHeader.biWidth := 720; 
pVIH.bmiHeader.biHeight := 576; 
pVIH.bmiHeader.biXPelsPerMeter:=9; 
pVIH.bmiHeader.biYPelsPerMeter:=16; 
pVIH.bmiHeader.biSize := SizeOf(TBitmapInfoHeader); 
pVIH.bmiHeader.biSizeImage := 720 * 576 * 4; 
pVIH.bmiHeader.biPlanes := 1; 
pVIH.bmiHeader.biBitCount := 4; 
pVIH.bmiHeader.biCompression:= BI_RGB; 
pVIH.bmiHeader.biClrUsed:=0; 
pVIH.bmiHeader.biClrImportant:=0; 
//******* connect pin input filter of FResizerDMO 
Connect(SourceFilter,LAVSplitter); 
Connect(LAVSplitter, ffdshowVideoDecoderV1); 
Connect(ffdshowVideoDecoderV1,FResizerDMO); 
//*************** 
hr := (FResizerDMO as IMediaObject).SetOutputType 
(0,@mt,DMO_SET_TYPEF_CLEAR); 

все, что я должен скорректировать Сконфигурируйте Resizer ДМО. Возможно, я все делаю неправильно?

+0

'biBitCount' должно быть 32, а не 4. –

0

извините за мой английский. Я мало пишу, чтобы избежать ошибок. videoowindow1 является компонентом pl_Win_DSPack для свободного паскаля. videowindows1 = Video Mixing Renderer 9.

hr := CoCreateInstance(CLSID_CaptureGraphBuilder2, nil, 
CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2, ICapGraph); 
ICapGraph.SetFilterGraph(fgRender as IGraphBuilder); 
        //***************** 
hr := ICapGraph.RenderStream(nil,nil, SourceFilter, nil, FResizerDMO); 
hr := (FResizerDMO as IMediaObject).SetOutputType(0,@(pMT^),0);// or pMT 
DeleteMediaType(pMT); 
hr := ICapGraph.RenderStream(nil, nil, FResizerDMO, nil, VideoWindow1 as 
IBaseFilter); 
fgRender.Play; 
mc.Run; 

1) с этим кодом, видео не resize.I видеть в videowindow1, небольшая площадь с видео перспективой, videowindow1 больше. 2) с GraphStudioNext я установил много комбинаций. Только ffdshow Video Decoder подключается к ResizerDMO и в фильтре свойств ResizerDMO меняет параметры, но видео не изменяется.

извините, и спасибо за вашу помощь

+1

Вы должны редактировать свой вопрос или начать новый вопрос, если вы не продолжать один ваш спросил раньше. Поле ответа не предназначено для последующих действий в StackOverflow. –

+0

Я не использовал pl_Win_DSPack, и я не знаю, что это за компонент. Убедитесь, что (VideoWindow1 как IBaseFilter) отличается от нуля. Также я сомневаюсь, что ResizerDMO поддерживает формат пикселей (a.k.a.цветовое пространство), поэтому лучше заставить входной подтип быть таким же, как и выход (RGB32). С другой стороны, не все видеодекодеры будут поддерживать вывод RGB32. Поэтому вам иногда понадобится преобразование цветового пространства. _So мой совет просто ищет готовые сторонние фильтры. Вот набор фильтров, которые могут сработать для вас - http://sourceforge.net/projects/videoprocessing/ –

+0

Спасибо Антон Ангелов. Я думал, что это было проще использовать для моего проекта resizeDMO. Последний шанс, готовый к использованию фильтров, как вы сказали. Теперь я должен найти правильный фильтр для своего проекта и понять, как использовать фильтр в моем приложении. Спасибо Спасибо спасибо. – carmeloconny