Организация видеосвязи
Видеоконференция, ее определение, основные категории, протоколы, оборудование и организация связи. Применение видеоконференций, достоинства и недостатки существующих продуктов в этой сфере. Демо-версия сетевого приложения, осуществляющего видеосвязь.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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
Подобные документы
Анализ существующих систем организации аудиосвязи. Протоколы аудиопереачи. Архитектура сетевого взаимодействия. Алгоритм серверного приложения. Структура клиентского приложения. Выбор языка программирования и средств разработки. Требования к системе.
курсовая работа [1,2 M], добавлен 28.04.2014Условия для организации видеоконференцсвязи. Программные комплексы NetMeeting, TeamViewer 5. Организация локальной вычислительной сети. Установка и эксплуатация видеосистемы. Обеспечение информационной безопасности при организации видеоконференций.
дипломная работа [2,8 M], добавлен 15.02.2013Работы по созданию сети ARPANET, протоколы сетевого взаимодействия TCP/IP. Характеристика программного обеспечения для TCP/IP. Краткое описание протоколов семейства TCP/IP с расшифровкой аббревиатур. Архитектура, уровни сетей и протоколы TCP/IP.
реферат [15,7 K], добавлен 03.05.2010Достоинства компьютерных сетей. Основы построения и функционирования компьютерных сетей. Подбор сетевого оборудования. Уровни модели OSI. Базовые сетевые технологии. Осуществление интерактивной связи. Протоколы сеансового уровня. Среда передачи данных.
курсовая работа [2,7 M], добавлен 20.11.2012Типы линий связи и их отличительные свойства: кабельные, беспроводные. Модель OSI и протоколы передачи данных. Оборудование кабельных локальных вычислительных сетей: адаптеры, концентраторы, мосты и маршрутизаторы, коммутаторы и шлюзы, платы интерфейса.
дипломная работа [60,7 K], добавлен 07.07.2012Общие принципы построения цифровых систем передачи, их иерархия и достоинства. Организация управления сетью оборудования связи с помощью персонального компьютера по интерфейсу серии F. Оборудование гибкого мультиплексирования ОГМ-30Е, принцип его работы.
дипломная работа [1,1 M], добавлен 28.10.2013Основные концепции разработки приложения в архитектуре MVVM. Проектирование базы данных, предназначенной для сбора информации о дорожно-транспортных происшествиях. Классификация и типы архитектуры "клиент–сервер", ее основные достоинства и недостатки.
курсовая работа [4,1 M], добавлен 25.11.2015Основные типы линий связи. Локальные вычислительные сети (ЛВС) как системы распределенной обработки данных, особенности охвата территории, стоимости. Анализ возможностей и актуальности использования сетевого оборудования при построении современных ЛВС.
дипломная работа [823,9 K], добавлен 16.06.2012Услуги Интернета: электронная почта, передача файлов. Получение услуг сети через удаленный компьютер. Протоколы сети Internet: HTTP, FTP, Telnet, WAIS, Gopher, SMTP, IRC. Цели Внедрения видео-конференции-связи. Организация и проведение телеконференций.
курсовая работа [64,3 K], добавлен 20.12.2016Мобильные операционные системы. Основные характеристики систем iOS и Android, их достоинства, недостатки и индивидуальные возможности. Анализ преимуществ лидирующих мобильных платформ для разработки приложения. Основные различия в механизмах безопасности.
дипломная работа [806,5 K], добавлен 01.01.2018