Организация видеосвязи

Видеоконференция, ее определение, основные категории, протоколы, оборудование и организация связи. Применение видеоконференций, достоинства и недостатки существующих продуктов в этой сфере. Демо-версия сетевого приложения, осуществляющего видеосвязь.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 28.04.2014
Размер файла 1,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

receiver.GetEndPoint().Address.ToString(), receiver.GetEndPoint().Port));

// связываем сокет с удаленным сокетом

//receiver.Connect(info.Point);

sender.Connect(info.Point);

// и начинаем передачу видео

BeginVideoTranslation1();

}

else

{

// отправляем отказ в видеосвязи

NetworkWriter.WriteType(tcp_socket, (byte)Messages.InfoForClient);

NetworkWriter.WriteString(tcp_socket, info.Name);

NetworkWriter.WriteType(tcp_socket, (byte)Messages.TransferFailed);

NetworkWriter.WriteClientInfo(tcp_socket, new ClientInfo(name,

sender.GetEndPoint().Address.ToString(), sender.GetEndPoint().Port));

}

}

void TransferFail()

{

// получив отказ в видеосвязи выводит соответствующее сообщение на экран

ClientInfo info = NetworkReader.ReadClientInfo(tcp_socket);

TransferFailedHandler(info.Name);

}

public void TransferEnd(String user_name)

{

// отправялем пользователю сообщение о завершении видеосвязи

NetworkWriter.WriteType(tcp_socket, (byte)Messages.InfoForClient);

NetworkWriter.WriteString(tcp_socket, user_name);

NetworkWriter.WriteType(tcp_socket, (byte)Messages.TransferEnd);

NetworkWriter.WriteClientInfo(tcp_socket, new ClientInfo(name,

sender.GetEndPoint().Address.ToString(), sender.GetEndPoint().Port));

// и заканчиваем видеопередачу

EndVideoTranslation1();

}

public void Close()

{

// отправляем сообщение о завершении соединения

NetworkWriter.WriteType(tcp_socket, (byte)Messages.Disconnect);

// и отключаем сокет от сервера

tcp_socket.Disconnect(false);

receiver = null;

sender = null;

}

public void BeginVideoTranslation()

{

ClientInfo info = NetworkReader.ReadClientInfo(tcp_socket);

receiver.Connect(info.Point);

sender.Connect(info.Point);

receiver.BeginReceiving();

sender.BeginSending();

}

void BeginVideoTranslation1()

{

receiver.BeginReceiving();

sender.BeginSending();

}

public void EndVideoTranslation()

{

ClientInfo info = NetworkReader.ReadClientInfo(tcp_socket);

receiver.EndReceiving();

receiver = null;

sender.EndSending();

sender = null;

}

public void EndVideoTranslation1()

{

receiver.EndReceiving();

receiver = null;

sender.EndSending();

sender = null;

}

}

2. Обзор класса Capture

class Capture : ISampleGrabberCB, IDisposable

{

// Построение интерфейса графа

private IFilterGraph2 FilterGraph = null;

private IMediaControl mediaCtrl = null;

// Можем ли мы ждать окончания асинхронной работы

private ManualResetEvent PictureReady = null;

// Установка асинхронности для захвата изображения

private volatile bool bGotOne = false;

// Статус графа

private bool bRunning = false;

// Размеры изображения

private IntPtr handle = IntPtr.Zero;

private int videoWidth;

private int videoHeight;

private int stride;

public int Dropped = 0;

[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory")]

private static extern void CopyMemory(IntPtr Destination, IntPtr Source, int Length);

public void Dispose()

{

CloseInterfaces();

if (PictureReady != null)

{

PictureReady.Close();

PictureReady = null;

}

}

// Деструктор

~Capture()

{

Dispose();

}

public int Width

{

get { return videoWidth; }

}

public int Height

{

get { return videoHeight; }

}

public int Stride

{

get { return stride; }

}

// Захват следующего изображения

public IntPtr GetBitMap()

{

handle = Marshal.AllocCoTaskMem(stride * videoHeight);

try

{

PictureReady.Reset();

bGotOne = false;

// запускаем граф

Start();

// и начинаем ждать изображение

if (!PictureReady.WaitOne(5000, false))

{

throw new Exception("Timeout waiting to get picture");

}

}

catch

{

Marshal.FreeCoTaskMem(handle);

throw;

}

// возвращаем указатель на изображение

return handle;

}

// Начало захвата

public void Start()

{

if (!bRunning)

{

int hr = mediaCtrl.Run();

DsError.ThrowExceptionForHR(hr);

bRunning = true;

}

}

// Приостановка (пауза) захвата

public void Pause()

{

if (bRunning)

{

int hr = mediaCtrl.Pause();

DsError.ThrowExceptionForHR(hr);

bRunning = false;

}

}

// Общий конструктор класса Capture

public Capture(VideoDescriptor desc)

{

DsDevice[] capDevices;

// Получение всех устройств захвата

capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);

if (desc.VideoDevice + 1 > capDevices.Length)

{

throw new Exception("Устройство захвата не найдено!");

}

try

{

// Вызов функции установки параметров захвата

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

// Вызов CallBack для игнорирования новых изображений

PictureReady = new ManualResetEvent(false);

bGotOne = true;

bRunning = false;

}

catch

{

Dispose();

throw;

}

}

// Инициализация Графа

private void SetupGraph(DsDevice dev, int iFrameRate, int iWidth, int iHeight)

{

int hr;

ISampleGrabber sampGrabber = null;

IBaseFilter capFilter = null;

ICaptureGraphBuilder2 capGraph = null;

// Получение объекта graphbuilder

FilterGraph = (IFilterGraph2)new FilterGraph();

mediaCtrl = FilterGraph as IMediaControl;

try

{

// Получение ICaptureGraphBuilder2

capGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();

// Получение интерфейса SampleGrabber

sampGrabber = (ISampleGrabber)new SampleGrabber();

// Начало построения Графа

hr = capGraph.SetFiltergraph(FilterGraph);

DsError.ThrowExceptionForHR(hr);

// Добавление в Граф устройство видеозахвата

hr = FilterGraph.AddSourceFilterForMoniker(dev.Mon, null, "Video input", out capFilter);

DsError.ThrowExceptionForHR(hr);

IBaseFilter baseGrabFlt = (IBaseFilter)sampGrabber;

ConfigureSampleGrabber(sampGrabber);

// Добавление в Граф фильтра-захвата

hr = FilterGraph.AddFilter(baseGrabFlt, "Ds.NET Grabber");

DsError.ThrowExceptionForHR(hr);

if (iFrameRate + iHeight + iWidth > 0)

{

SetConfigParms(capGraph, capFilter, iFrameRate, iWidth, iHeight);

}

hr = capGraph.RenderStream(PinCategory.Capture, MediaType.Video, capFilter, null, baseGrabFlt);

DsError.ThrowExceptionForHR(hr);

SaveSizeInfo(sampGrabber);

}

finally

{

if (capFilter != null)

{

Marshal.ReleaseComObject(capFilter);

capFilter = null;

}

if (sampGrabber != null)

{

Marshal.ReleaseComObject(sampGrabber);

sampGrabber = null;

}

if (capGraph != null)

{

Marshal.ReleaseComObject(capGraph);

capGraph = null;

}

}

}

private void SaveSizeInfo(ISampleGrabber sampGrabber)

{

int hr;

// Получение типа информации из SampleGrabber

AMMediaType media = new AMMediaType();

hr = sampGrabber.GetConnectedMediaType(media);

DsError.ThrowExceptionForHR(hr);

if ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero))

{

throw new NotSupportedException("Unknown Grabber Media Format");

}

// Размер захвачиваемой информации

VideoInfoHeader videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader));

videoWidth = videoInfoHeader.BmiHeader.Width;

videoHeight = videoInfoHeader.BmiHeader.Height;

stride = videoWidth * (videoInfoHeader.BmiHeader.BitCount / 8);

DsUtils.FreeAMMediaType(media);

media = null;

}

private void ConfigureSampleGrabber(ISampleGrabber sampGrabber)

{

AMMediaType media;

int hr;

// устанавливаем тип видео

media = new AMMediaType();

media.majorType = MediaType.Video;

media.subType = MediaSubType.RGB24;

media.formatType = FormatType.VideoInfo;

hr = sampGrabber.SetMediaType(media);

DsError.ThrowExceptionForHR(hr);

DsUtils.FreeAMMediaType(media);

media = null;

// конфигурируем SampleGrabber

hr = sampGrabber.SetCallback(this, 1);

DsError.ThrowExceptionForHR(hr);

}

// Установка параметров видео

private void SetConfigParms(ICaptureGraphBuilder2 capGraph, IBaseFilter capFilter, int iFrameRate, int iWidth, int iHeight)

{

int hr;

object o;

AMMediaType media;

// Нахождение потока конфигурации интерфейса

hr = capGraph.FindInterface(PinCategory.Capture, MediaType.Video, capFilter, typeof(IAMStreamConfig).GUID, out o);

IAMStreamConfig videoStreamConfig = o as IAMStreamConfig;

if (videoStreamConfig == null)

{

throw new Exception("Failed to get IAMStreamConfig");

}

// Получения блока действующего формата

hr = videoStreamConfig.GetFormat(out media);

DsError.ThrowExceptionForHR(hr);

// Копирование из videoinfoheader

VideoInfoHeader v = new VideoInfoHeader();

Marshal.PtrToStructure(media.formatPtr, v);

// Установка частоты кадров

if (iFrameRate > 0)

{

v.AvgTimePerFrame = 10000000 / iFrameRate;

}

// Установка ширины

if (iWidth > 0)

{

v.BmiHeader.Width = iWidth;

}

// Установка высоты

if (iHeight > 0)

{

v.BmiHeader.Height = iHeight;

}

// Обратное копирование структуры информации

Marshal.StructureToPtr(v, media.formatPtr, false);

// Установка нового формата

hr = videoStreamConfig.SetFormat(media);

DsError.ThrowExceptionForHR(hr);

DsUtils.FreeAMMediaType(media);

media = null;

}

private void CloseInterfaces()

{

int hr;

try

{

if (mediaCtrl != null)

{

// Остановка захвата

hr = mediaCtrl.Stop();

bRunning = false;

}

}

catch (Exception ex)

{

Debug.WriteLine(ex);

}

if (FilterGraph != null)

{

Marshal.ReleaseComObject(FilterGraph);

FilterGraph = null;

}

}

int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample pSample)

{

if (!bGotOne)

{

// Установка bGotOne для предотвращения вызова пока получаем новое изображение

bGotOne = true;

IntPtr pBuffer;

pSample.GetPointer(out pBuffer);

int iBufferLen = pSample.GetSize();

if (pSample.GetSize() > stride * videoHeight)

{

throw new Exception("Buffer is wrong size");

}

CopyMemory(handle, pBuffer, stride * videoHeight);

// Изображение готово

PictureReady.Set();

}

Marshal.ReleaseComObject(pSample);

return 0;

}

int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen)

{

if (!bGotOne)

{

// Проверка размера буффера

if (BufferLen <= stride * videoHeight)

{

// Копирование изображения в Буфер

CopyMemory(handle, pBuffer, stride * videoHeight);

}

else

{

throw new Exception("Buffer is wrong size");

}

// Установка bGotOne для предотвращения вызова пока получаем новое изображение

bGotOne = true;

// Изображение готово

PictureReady.Set();

}

else

{

Dropped++;

}

return 0;

}

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.