Suratga olish sinfiga umumiy nuqtai




Download 485,25 Kb.
bet15/15
Sana19.12.2023
Hajmi485,25 Kb.
#124231
1   ...   7   8   9   10   11   12   13   14   15
Bog'liq
UDP protokoli asosida videokonferensiya dasturiy ta\'minotini yaratish

Suratga olish sinfiga umumiy nuqtai

Class Capture: ISampleGrabberCB, IDisposable
{

//Grafik interfeysini yaratish


xususiy IFilterGraph2 FilterGraph = null;
xususiy IMediaControl mediaCtrl = null;

// Asinxron ish tugashini kuta olamizmi?


xususiy ManualResetEvent PictureReady = null;


// Rasmga olish uchun asinxroniyani o'rnating


private volatile bool bGotOne = false;


// Holat grafa


xususiy bool bRunning = noto'g'ri;


// Razmery izobrajeniya


xususiy IntPtr tutqichi = IntPtr.Zero;


private int videoWidth;
xususiy int videoHeight;
shaxsiy int qadam;
umumiy int tushirildi = 0;
[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory")]
xususiy statik extern void CopyMemory(IntPtr Destination, IntPtr Source, int Length);
public void Dispose()
{
CloseInterfaces();
agar (PictureReady!= null)
{
PictureReady.Close();
PictureReady = null;
}
}

// Destruktor


~Capture()


{
Dispose();
}
umumiy int Kengligi
{
get { video kengligini qaytarish; }
}
public int Height
{
get { return videoHeight; }
}
ommaviy int Stride
{
get { qaytmoq; }
}

// Keyingi rasmni oling


ommaviy IntPtr GetBitMap()


{
tutqich = Marshal.AllocCoTaskMem (qadam * videoHeight);
harakat qilib ko'ring
{
PictureReady.Reset();
bGotOne = noto'g'ri;

// grafikni ishga tushiring


Start();

// va rasmni kutishni boshlang

agar (!PictureReady.WaitOne(5000, noto'g'ri))


{
yangi Istisno ("Tasvirni olish uchun kutish vaqti");
}
}
tutmoq
{
Marshal.FreeCoTaskMem(tutqich);
otish;
}

// tasvirga ko'rsatgichni qaytarish


qaytarish dastagi;


}

// Boshlanishi tutqich


public void Start()


{
agar (!bRunning)
{
int hr = mediaCtrl.Run();
DsError.ThrowExceptionForHR(soat);
bRunning = rost;
}
}
// Tutqichni to'xtatib turish ( pauza qilish ) .

public void pauza()


{
agar (bRunning)
{
int hr = mediaCtrl.Pause();
DsError.ThrowExceptionForHR(soat);
bRunning = noto'g'ri;
}
}
// Umumiy konstruktor Class Capture
Ommaviy suratga olish (video tavsifi)
{
DsDevice[] capDevices;
// Barcha suratga olish qurilmalarini oling
capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
agar (tasvirlash.VideoDevice + 1 > capDevices.Length)
{
yangi Istisnoni oching ("Tasvirga olish qurilmasi topilmadi!");
}
harakat qilib ko'ring
{
// Rasmga tushirish parametrlarini o'rnatish uchun funktsiyani chaqiring

SetupGraph(capDevices[dec.VideoDevice], desc.FrameRate, desc.VideoWidth, desc.VideoHeight);


// Yangi rasmlarga e'tibor bermaslik uchun CallBack xizmatiga qo'ng'iroq qiling


PictureReady = yangi ManualResetEvent(noto'g'ri);


bGotOne = rost;
bRunning = noto'g'ri;
}
tutmoq
{
Dispose();
otish;
}
}
// Initializatsiya Hisoblash
xususiy void SetupGraph (DsDevice dev, int iFrameRate, int iWidth, int iHeight)
{
int hr;
ISampleGrabber sampGrabber = null;
IBaseFilter capFilter = null;
ICaptureGraphBuilder2 capGraph = null;
// Qabul qilish graphbuilder ob'ekti
FilterGraph = (IFilterGraph2)yangi FilterGraph();
mediaCtrl = IMediaControl sifatida filtrlash;
harakat qilib ko'ring
{

// ICaptureGraphBuilder2 ni oling


capGraph = (ICaptureGraphBuilder2)yangi CaptureGraphBuilder2();
// Qabul qilish SampleGrabber interfeysi
sampGrabber = (ISampleGrabber)yangi SampleGrabber();
// Boshlash qurilish Hisoblash
hr = capGraph.SetFiltergraph(FilterGraph);
DsError.ThrowExceptionForHR(soat);
// Grafikga video suratga olish qurilmasini qo'shing
hr = FilterGraph.AddSourceFilterForMoniker(dev.Mon, null, "Video kiritish", chiqish capFilter);
DsError.ThrowExceptionForHR(soat);
IBaseFilter baseGrabFlt = (IBaseFilter)sampGrabber;
ConfigureSampleGrabber(sampGrabber);
// Qo'shish V Grafik filtr - qo'lga olish
hr = FilterGraph.AddFilter(baseGrabFlt, "Ds.NET Grabber");
DsError.ThrowExceptionForHR(soat);
agar (iFrameRate + iHeight + iWidth > 0)
{
SetConfigParms (capGraph, capFilter, iFrameRate, iWidth, iHeight);
}
hr = capGraph.RenderStream(PinCategory.Capture, MediaType.Video, capFilter, null, baseGrabFlt);
DsError.ThrowExceptionForHR(soat);
SaveSizeInfo (sampGrabber);
}
nihoyat
{
agar (capFilter != null)
{
Marshal.ReleaseComObject(capFilter);
capFilter = null;
}
agar (sampGrabber!= null)
{
Marshal.ReleaseComObject(sampGrabber);
sampGrabber = null;
}
agar (capGraph != null)
{
Marshal.ReleaseComObject(capGraph);
capGraph = null;
}
}
}
shaxsiy bekor SaveSizeInfo (ISampleGrabber sampGrabber)
{
int hr;
// SampleGrabber-dan Poluchenie tipa axborot
AMMediaType media = yangi AMMediaType();
hr = sampGrabber.GetConnectedMediaType(media);
DsError.ThrowExceptionForHR(soat);
agar ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero))
{
yangi NotSupportedException ("Noma'lum Grabber Media Format");
}
// Razmer zahvachivaemoy axborot
VideoInfoHeader videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure (media.formatPtr, typeof(VideoInfoHeader));
videoWidth = videoInfoHeader.BmiHeader.Width;
videoHeader = videoInfoHeader.BmiHeader.Height;
qadam = videoWidth * (videoInfoHeader.BmiHeader.BitCount / 8);
DsUtils.FreeAMMediaType(media);
media = null;
}
xususiy void ConfigureSampleGrabber(ISampleGrabber sampGrabber)
{
AMMediaType media;
int hr;
// ustanavlivaem turi video
media = yangi AMMediaType();
media.majorType = MediaType.Video;
media.subType = MediaSubType.RGB24;
media.formatType = FormatType.VideoInfo;
hr = sampGrabber.SetMediaType(media);
DsError.ThrowExceptionForHR(soat);
DsUtils.FreeAMMediaType(media);
media = null;
// SampleGrabberni sozlash
hr = sampGrabber.SetCallback(bu, 1);
DsError.ThrowExceptionForHR(soat);
}
// O'rnatish parametrlari video
xususiy void SetConfigParms (ICaptureGraphBuilder2 capGraph, IBaseFilter capFilter, int iFrameRate, int iWidth, int iHeight)
{
int hr;
ob'ekt o;
AMMediaType media;
// Topish oqim konfiguratsiyalar interfeys
hr = capGraph.FindInterface(PinCategory.Capture, MediaType.Video, capFilter, typeof(IAMStreamConfig).GUID, tashqari);
IAMStreamConfig videoStreamConfig = o IAMStreamConfig sifatida;
agar (videoStreamConfig == null)
{
yangi Istisnoni oching ("IAMStreamConfig ni olish muvaffaqiyatsiz tugadi");
}
// Qabul qiladi blok joriy format
hr = videoStreamConfig.GetFormat(tashqi media);
DsError.ThrowExceptionForHR(soat);
// Nusxa videoma'lumot sarlavhasidan
VideoInfoHeader v = yangi VideoInfoHeader();
Marshal.PtrToStructure(media.formatPtr, v);
// Kadr tezligini o'rnatish
agar (iFrameRate > 0)
{
v.AvgTimePerFrame = 10000000 / iFrameRate;
}
// Kenglikni o'rnating
agar (iWidth > 0)
{
v.BmiHeader.Width = iWidth;
}

// Balandlikni o'rnating


agar (iHeight > 0)
{
v.BmiHeader.Height = iHeight;
}
// Teskari nusxa ko'chirish tuzilmalar ma `lumot
Marshal.StructureToPtr(v, media.formatPtr, noto'g'ri);
// O'rnatish yangi format
hr = videoStreamConfig.SetFormat(media);
DsError.ThrowExceptionForHR(soat);
DsUtils.FreeAMMediaType(media);
media = null;
}
xususiy void CloseInterfaces()
{
int hr;
harakat qilib ko'ring
{
agar (mediaCtrl!= null)
{
// Ostanovka zahvata
hr = mediaCtrl.Stop();
bRunning = noto'g'ri;
}
}
catch (istisno istisno)
{
Debug.WriteLine(ex);
}
if (FilterGraph != null)
{
Marshal.ReleaseComObject(FilterGraph);
FilterGraph = null;
}
}
int ISampleGrabberCB.SampleCB(ikki martali SampleTime, IMediaSample pSample)
{
agar (!bGotOne)
{
// Biz yangi rasmni olganimizda qo'ng'iroq qilishning oldini olish uchun bGotOne-ni o'rnating
bGotOne = rost;
IntPtr pBuffer;
pSample.GetPointer(pBufferdan tashqarida);
int iBufferLen = pSample.GetSize();
agar (pSample.GetSize() > qadam * videoHeight)
{
yangi istisnolarni oching ("Bufer noto'g'ri o'lcham");
}
CopyMemory(tutqich, pBuffer, qadam * videoHeight);
// Rasm tayyor
PictureReady.Set();
}
Marshal.ReleaseComObject(pSample);
qaytish 0;
}
int ISampleGrabberCB.BufferCB(ikki tomonlama SampleTime, IntPtr pBuffer, int BufferLen)
{
agar (!bGotOne)
{
// Imtihon hajmi bufer
agar (BufferLen <= qadam * videoHeight)
{
// Nusxa Tasvirlar V Bufer
CopyMemory(tutqich, pBuffer, qadam * videoHeight);
}
boshqa
{
yangi istisnolarni oching ("Bufer noto'g'ri o'lcham");
}
// Biz yangi rasmni olganimizda qo'ng'iroq qilishning oldini olish uchun bGotOne-ni o'rnating

bGotOne = rost;


// Rasm tayyor


PictureReady.Set();


}
boshqa
{
Tushdi++;
}
qaytish 0;
}
}
Allbest.ru saytida e'lon qilingan


Download 485,25 Kb.
1   ...   7   8   9   10   11   12   13   14   15




Download 485,25 Kb.

Bosh sahifa
Aloqalar

    Bosh sahifa



Suratga olish sinfiga umumiy nuqtai

Download 485,25 Kb.