Отобразить VideoStream
От: hooky-mars  
Дата: 06.08.10 07:40
Оценка:
Всем привет!

Есть видео поток. Хочу отобразить его на форме по средствам 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);


В чем я неправ?
Re: Отобразить VideoStream
От: SanyaVB  
Дата: 06.08.10 10:22
Оценка:
Здравствуйте, 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
Re[2]: Отобразить VideoStream
От: SanyaVB  
Дата: 06.08.10 10:27
Оценка:
Здравствуйте, 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. Тогда все верно у тебя. Посмотри статейку. Думаю поможет...
Re[2]: Отобразить VideoStream
От: hooky-mars  
Дата: 06.08.10 12:35
Оценка:
SVB>Есть библиотека DirectShowLib-2005 с ней проще. Хотя сам решай как проще. Даю ссылку на всякий случай:
SVB>здесь

Ею и пользуюсь.

За статью спасибо! Курю ее.
Re[3]: Отобразить VideoStream
От: hooky-mars  
Дата: 09.08.10 04:22
Оценка:
К сожалению, так и не разобрался как навход директх подать видео поток.
На МСДН ничего не могу найти. Ткните где почиать....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.