Всем привет!
Есть видео поток. Хочу отобразить его на форме по средствам DirectX.
Я так понимаю можно двумя способами это решить.
1.DerectX сам разбирает видео поток из сети (Думаю это рельно)
2.Я сам могу разобрать поток из сети и отдать деректиксу битмап (в виде последовательности байт в памяти).
Но вот как это релизовать, так и не нашол в гугле.
Вроде есть такие интерфейсы IStreamBufferSource, IStreamBufferSink, но если я начинаю их использовать, то потом не могу найти IPin для IGraphBuilder:
comtype = Type.GetTypeFromCLSID(Clsid.FilterGraph);
graphBuilder = (IGraphBuilder)Activator.CreateInstance(comtype); comtype = null;
comtype = Type.GetTypeFromCLSID(Clsid.StreamBufferSource);
IStreamBufferSource pSource = (IStreamBufferSource)Activator.CreateInstance(comtype);
comtype = Type.GetTypeFromCLSID(Clsid.StreamBufferSnik);
IStreamBufferSink pSnik = (IStreamBufferSink)Activator.CreateInstance(comtype);
//Куда завязать pSnik, чтобы он читал видео поток?????
pSource.SetStreamSink(pSnik);
IBaseFilter streamfilter = (IBaseFilter)pSource;
graphBuilder.AddFilter(streamfilter, "SBESource");
IEnumPins pins;
hr = streamfilter.EnumPins(out pins);
Marshal.ThrowExceptionForHR(hr);
IPin[] pin = new IPin[1];
do
{
hr = pins.Next(1, pin, IntPtr.Zero);
if ((hr != 0) || (pin[0] == null))//Тут всегда null!!!!!!
throw new NotImplementedException();
graphBuilder.Render(pin[0]);
Marshal.ReleaseComObject(pin[0]); pin[0] = null;
} while (hr == 0);
В чем я неправ?
Здравствуйте, hooky-mars, Вы писали:
HM>Всем привет!
HM>Есть видео поток. Хочу отобразить его на форме по средствам DirectX.
HM>Я так понимаю можно двумя способами это решить.
HM>1.DerectX сам разбирает видео поток из сети (Думаю это рельно)
HM>2.Я сам могу разобрать поток из сети и отдать деректиксу битмап (в виде последовательности байт в памяти).
HM>Но вот как это релизовать, так и не нашол в гугле.
HM>Вроде есть такие интерфейсы IStreamBufferSource, IStreamBufferSink, но если я начинаю их использовать, то потом не могу найти IPin для IGraphBuilder:
HM>HM> comtype = Type.GetTypeFromCLSID(Clsid.FilterGraph);
HM> graphBuilder = (IGraphBuilder)Activator.CreateInstance(comtype); comtype = null;
HM> comtype = Type.GetTypeFromCLSID(Clsid.StreamBufferSource);
HM> IStreamBufferSource pSource = (IStreamBufferSource)Activator.CreateInstance(comtype);
HM> comtype = Type.GetTypeFromCLSID(Clsid.StreamBufferSnik);
HM> IStreamBufferSink pSnik = (IStreamBufferSink)Activator.CreateInstance(comtype);
HM>//Куда завязать pSnik, чтобы он читал видео поток?????
HM> pSource.SetStreamSink(pSnik);
HM> IBaseFilter streamfilter = (IBaseFilter)pSource;
HM> graphBuilder.AddFilter(streamfilter, "SBESource");
HM> IEnumPins pins;
HM> hr = streamfilter.EnumPins(out pins);
HM> Marshal.ThrowExceptionForHR(hr);
HM> IPin[] pin = new IPin[1];
HM> do
HM> {
HM> hr = pins.Next(1, pin, IntPtr.Zero);
HM> if ((hr != 0) || (pin[0] == null))//Тут всегда null!!!!!!
HM> throw new NotImplementedException();
HM> graphBuilder.Render(pin[0]);
HM> Marshal.ReleaseComObject(pin[0]); pin[0] = null;
HM> } while (hr == 0);
HM>
HM>В чем я неправ?
graphBuilder.AddFilter(streamfilter, "SBESource"); // не понятно что возвращает.
Есть библиотека DirectShowLib-2005 с ней проще. Хотя сам решай как проще. Даю ссылку на всякий случай:
здесь
Тут написано подробно как создавать граф (код написан примитивно, но зато без ошибок. Есть тут же функция поиска пинов — скопируй и наслаждайся):
здесь
HM> if ((hr != 0) || (pin[0] == null))//Тут всегда null!!!!!!
Не удивляйся
hr e у тебя возвращает не 0. я бы на твоем месте написал бы так:
if (hr != 0)
{}
или если тебе так хочется)))) можешь вот так написать
if ((hr != 0) && (pin[0] == null))
{}
А то ИЛИ ставить глупо)) у тебя возвращается ошибка и ты пытаешься проверить на null свой пин. Глупо — он конечно в случае ошибки будет null
Здравствуйте, SanyaVB, Вы писали:
SVB>Здравствуйте, hooky-mars, Вы писали:
HM>>Всем привет!
HM>>Есть видео поток. Хочу отобразить его на форме по средствам DirectX.
HM>>Я так понимаю можно двумя способами это решить.
HM>>1.DerectX сам разбирает видео поток из сети (Думаю это рельно)
HM>>2.Я сам могу разобрать поток из сети и отдать деректиксу битмап (в виде последовательности байт в памяти).
HM>>Но вот как это релизовать, так и не нашол в гугле.
HM>>Вроде есть такие интерфейсы IStreamBufferSource, IStreamBufferSink, но если я начинаю их использовать, то потом не могу найти IPin для IGraphBuilder:
HM>>HM>> comtype = Type.GetTypeFromCLSID(Clsid.FilterGraph);
HM>> graphBuilder = (IGraphBuilder)Activator.CreateInstance(comtype); comtype = null;
HM>> comtype = Type.GetTypeFromCLSID(Clsid.StreamBufferSource);
HM>> IStreamBufferSource pSource = (IStreamBufferSource)Activator.CreateInstance(comtype);
HM>> comtype = Type.GetTypeFromCLSID(Clsid.StreamBufferSnik);
HM>> IStreamBufferSink pSnik = (IStreamBufferSink)Activator.CreateInstance(comtype);
HM>>//Куда завязать pSnik, чтобы он читал видео поток?????
HM>> pSource.SetStreamSink(pSnik);
HM>> IBaseFilter streamfilter = (IBaseFilter)pSource;
HM>> graphBuilder.AddFilter(streamfilter, "SBESource");
HM>> IEnumPins pins;
HM>> hr = streamfilter.EnumPins(out pins);
HM>> Marshal.ThrowExceptionForHR(hr);
HM>> IPin[] pin = new IPin[1];
HM>> do
HM>> {
HM>> hr = pins.Next(1, pin, IntPtr.Zero);
HM>> if ((hr != 0) || (pin[0] == null))//Тут всегда null!!!!!!
HM>> throw new NotImplementedException();
HM>> graphBuilder.Render(pin[0]);
HM>> Marshal.ReleaseComObject(pin[0]); pin[0] = null;
HM>> } while (hr == 0);
HM>>
HM>>В чем я неправ?
SVB>graphBuilder.AddFilter(streamfilter, "SBESource"); // не понятно что возвращает.
SVB>Есть библиотека DirectShowLib-2005 с ней проще. Хотя сам решай как проще. Даю ссылку на всякий случай:
SVB>здесь
SVB>Тут написано подробно как создавать граф (код написан примитивно, но зато без ошибок. Есть тут же функция поиска пинов — скопируй и наслаждайся):
SVB>здесь
HM>> if ((hr != 0) || (pin[0] == null))//Тут всегда null!!!!!!
SVB>Не удивляйся hr e у тебя возвращает не 0. я бы на твоем месте написал бы так:
SVB>SVB>if (hr != 0)
SVB>{}
SVB>
SVB>или если тебе так хочется)))) можешь вот так написать
SVB>SVB>if ((hr != 0) && (pin[0] == null))
SVB>{}
SVB>
SVB>А то ИЛИ ставить глупо)) у тебя возвращается ошибка и ты пытаешься проверить на null свой пин. Глупо — он конечно в случае ошибки будет null
Сорри — сглупил. У тебя же отрицание hr != 0. Тогда все верно у тебя. Посмотри статейку. Думаю поможет...
SVB>Есть библиотека DirectShowLib-2005 с ней проще. Хотя сам решай как проще. Даю ссылку на всякий случай:
SVB>здесь
Ею и пользуюсь.
За статью спасибо! Курю ее.
К сожалению, так и не разобрался как навход директх подать видео поток.
На МСДН ничего не могу найти. Ткните где почиать....