bool IsMatchedConfigcaps(VideoStreamConfigCaps Caps, AMMediaType MediaType,int SizeX, int SizeY)
{
bool result=/*Guid.Equals(MediaType.majorType, ) &&
((Guid.Equals(MediaType.subType, MediaSubType.RGB24)) ||
(Guid.Equals(MediaType.subType, MediaSubType.RGB24)))*/
true;
if (result)
{
result=(SizeX>=Caps.MinOutputSize.Width) && (SizeX<=Caps.MaxOutputSize.Width) &&
(SizeY>=Caps.MinOutputSize.Height) && (SizeY<=Caps.MaxOutputSize.Height);
}
if (result) RCount++;
Debug.WriteLine("result = "+result.ToString());
return result;
}
static int RCount = 0;
void SetPreviewFormat(int w,int h)
{
object o;
DsGuid cap = PinCategory.Capture;
DsGuid med = MediaType.Interleaved;
DsGuid iid = typeof(IAMStreamConfig).GUID;
int we = 768;
int he = 576;
bool bInterLeaved = (captureGraphBuilder.FindInterface(cap, med, sourceFilter, iid, out o) == 0);
Debug.WriteLine ("Interleaved: "+bInterLeaved.ToString());
med = MediaType.Video;
bInterLeaved = (captureGraphBuilder.FindInterface(cap, med, sourceFilter, iid, out o) == 0);
Debug.WriteLine ("Video: " + bInterLeaved.ToString());
IAMStreamConfig iStreamConf = o as IAMStreamConfig;
Debug.WriteLine ("iStrConf == null: " + (iStreamConf == null).ToString());
int CapCount, CapSize;
iStreamConf.GetNumberOfCapabilities(out CapCount, out CapSize);
Debug.WriteLine("Capcount == " + CapCount.ToString());
for (int i = 0; i < CapCount; i++)
{
AMMediaType curMedType;
VideoStreamConfigCaps scc;
IntPtr pscc;
try
{
pscc = Marshal.AllocCoTaskMem( Marshal.SizeOf( typeof( VideoStreamConfigCaps ) ) );
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return;
}
int hr = iStreamConf.GetStreamCaps(i,out curMedType, pscc);
Marshal.ThrowExceptionForHR(hr);
scc = (VideoStreamConfigCaps)Marshal.PtrToStructure(pscc,typeof(VideoStreamConfigCaps));
if (IsMatchedConfigcaps(scc,curMedType, we, he))
{
if (DsGuid.Equals(curMedType.formatType, FormatType.VideoInfo))
{
VideoInfoHeader vh = (VideoInfoHeader) Marshal.PtrToStructure(curMedType.formatPtr, typeof(VideoInfoHeader));
Debug.WriteLine("VideoInfoHeader == null : "+(vh==null).ToString());
vh.TargetRect = new DsRect(0,0,we,he);
vh.BmiHeader.Width = we;
vh.BmiHeader.Height = he;
Debug.WriteLine("FormatType.VideoInfo");
}
else if (DsGuid.Equals(curMedType.formatType, FormatType.VideoInfo2))
{
VideoInfoHeader2 vh = (VideoInfoHeader2) Marshal.PtrToStructure(curMedType.formatPtr, typeof(VideoInfoHeader2));
Debug.WriteLine((vh==null).ToString());
vh.TargetRect = new DsRect(0,0,we,he);
vh.BmiHeader.Width = we;
vh.BmiHeader.Height = he;
Debug.WriteLine("FormatType.VideoInfo2");
}
hr = iStreamConf.SetFormat(curMedType);
Debug.WriteLine("SetFormat: "+hr.ToString());
Marshal.FreeCoTaskMem(pscc);
if (hr == 0)
{
break;
}
}
}
Debug.WriteLine("RCount == "+RCount.ToString());
}
Изменение размера изображения...
codeproject.com). Привиденное ниже никакого эффекта не дает. Помогите выставить нужный размер!..
Guid cat;
Guid med;
int hr;
object o;
cat = PinCategory.Capture;
med = MediaType.Video;
Guid iid = typeof(IAMStreamConfig).GUID;
//CaptureGrafBuilder
hr = captureGraphBuilder.FindInterface(
ref cat, ref med, videoDeviceFilter, ref iid, out o);
IAMStreamConfig pConfig = o as IAMStreamConfig;
IntPtr pmtConfig;
pConfig.GetFormat(out pmtConfig);
AMMediaType mtConfig = (AMMediaType)Marshal.PtrToStructure(pmtConfig, typeof(AMMediaType));
VideoInfoHeader videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(mtConfig.formatPtr, typeof(VideoInfoHeader));
videoInfoHeader.BmiHeader.Width = 720;
videoInfoHeader.BmiHeader.Height = 480;
pConfig.SetFormat(mtConfig);
Получаю картинку с камеры. Пытаюсь программно выставить формат 720х480. Он ДОЛЖЕН поддерживаться. Использую DShowNET (с
Guid cat;
Guid med;
int hr;
object o;
cat = PinCategory.Capture;
med = MediaType.Video;
Guid iid = typeof(IAMStreamConfig).GUID;
//CaptureGrafBuilder
hr = captureGraphBuilder.FindInterface(
ref cat, ref med, videoDeviceFilter, ref iid, out o);
IAMStreamConfig pConfig = o as IAMStreamConfig;
IntPtr pmtConfig;
pConfig.GetFormat(out pmtConfig);
AMMediaType mtConfig = (AMMediaType)Marshal.PtrToStructure(pmtConfig, typeof(AMMediaType));
VideoInfoHeader videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(mtConfig.formatPtr, typeof(VideoInfoHeader));
videoInfoHeader.BmiHeader.Width = 720;
videoInfoHeader.BmiHeader.Height = 480;
pConfig.SetFormat(mtConfig);
Код:
Получаю на это вот что:
Interleaved: False
Video: True
iStrConf == null: False
Capcount == 256
result = False
result = False
result = True
VideoInfoHeader == null : False
FormatType.VideoInfo
SetFormat: 0
RCount == 1
А разрешение нужное не выставляется... Вообще, кто-нибудь делал подобное на C#?
Я использовал ActiveX компонент MS Media Player чтобы воспроизводить картинку к Web-камеры
Цитата:
Originally posted by 3A3-968M
Я использовал ActiveX компонент MS Media Player чтобы воспроизводить картинку к Web-камеры
Я использовал ActiveX компонент MS Media Player чтобы воспроизводить картинку к Web-камеры
Спасибо, разобрался. Примерно так, если кому вдруг не дай Бог понадобится =) :
Код:
int w = 720;
int h = 576;
object o;
if (videoDeviceFilter == null)
{
Debug.WriteLine("videoDeviceFilter == null");
return;
}
Guid pin = PinCategory.Preview;
Guid med = MediaType.Video;
Guid iams = typeof(IAMStreamConfig).GUID;
int hr = captureGraphBuilder.FindInterface(ref pin, ref med, videoDeviceFilter, ref iams , out o);
Marshal.ThrowExceptionForHR(hr);
IAMStreamConfig sc = o as IAMStreamConfig;
IntPtr ptr;
AMMediaType mt;
hr = sc.GetFormat(out ptr);
mt = (AMMediaType)Marshal.PtrToStructure(ptr, typeof(AMMediaType));
Marshal.ThrowExceptionForHR(hr);
ptr = mt.formatPtr;
VideoInfoHeader vh = (VideoInfoHeader)Marshal.PtrToStructure(ptr, typeof(VideoInfoHeader));
Debug.WriteLine("vh == null: " + (vh == null).ToString());
Debug.WriteLine("vh.BmiHeader.ImageSize == " + vh.BmiHeader.ImageSize.ToString());
Debug.WriteLine("vh.BmiHeader.Size == " + vh.BmiHeader.Size.ToString());
vh.BmiHeader.Width = w;
vh.BmiHeader.Height = h;
Marshal.StructureToPtr(vh, ptr, false);
mt.formatPtr = ptr;
hr = sc.SetFormat(mt);
Marshal.ThrowExceptionForHR(hr);
int h = 576;
object o;
if (videoDeviceFilter == null)
{
Debug.WriteLine("videoDeviceFilter == null");
return;
}
Guid pin = PinCategory.Preview;
Guid med = MediaType.Video;
Guid iams = typeof(IAMStreamConfig).GUID;
int hr = captureGraphBuilder.FindInterface(ref pin, ref med, videoDeviceFilter, ref iams , out o);
Marshal.ThrowExceptionForHR(hr);
IAMStreamConfig sc = o as IAMStreamConfig;
IntPtr ptr;
AMMediaType mt;
hr = sc.GetFormat(out ptr);
mt = (AMMediaType)Marshal.PtrToStructure(ptr, typeof(AMMediaType));
Marshal.ThrowExceptionForHR(hr);
ptr = mt.formatPtr;
VideoInfoHeader vh = (VideoInfoHeader)Marshal.PtrToStructure(ptr, typeof(VideoInfoHeader));
Debug.WriteLine("vh == null: " + (vh == null).ToString());
Debug.WriteLine("vh.BmiHeader.ImageSize == " + vh.BmiHeader.ImageSize.ToString());
Debug.WriteLine("vh.BmiHeader.Size == " + vh.BmiHeader.Size.ToString());
vh.BmiHeader.Width = w;
vh.BmiHeader.Height = h;
Marshal.StructureToPtr(vh, ptr, false);
mt.formatPtr = ptr;
hr = sc.SetFormat(mt);
Marshal.ThrowExceptionForHR(hr);
Единственное в рунете, пожалуй :)
Для этого есть хорошая программа -