Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.03.18;
Скачать: CL | DM;

Вниз

Видеотрансляция по сети   Найти похожие ветки 

 
zSvetik ©   (2010-01-16 23:32) [0]

Доброго времени суток. Помогите с:
Есть чат который умеет передавать файлы (не более 50 кб). Его нужно изменить, что бы Сервер передавал видео в сеть, а клиент, подключившись, мог воспроизводить это видео (без сохранение на хард).
Видео берется из файла (*.avi). Так же нужно увеличить допустимый объем передаваемого видео.

unit MainUnit;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, IdUDPServer, XPMan, IdBaseComponent, IdComponent, IdUDPBase,
 IdUDPClient, StdCtrls, IdSocketHandle;

type
 TMainForm = class(TForm)
   UDPClient: TIdUDPClient;
   UDPServer: TIdUDPServer;
   GroupText: TGroupBox;
   FileGroup: TGroupBox;
   SendEdit: TEdit;
   SendBtn: TButton;
   Memo: TMemo;
   SendFileBtn: TButton;
   FileEdit: TEdit;
   SetFile: TButton;
   OpenDialog: TOpenDialog;
   SaveDialog: TSaveDialog;
   procedure SetFileClick(Sender: TObject);
   procedure SendBtnClick(Sender: TObject);
   procedure UDPServerUDPRead(Sender: TObject; AData: TStream;
     ABinding: TIdSocketHandle);
   procedure SendFileBtnClick(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 MainForm: TMainForm;

implementation

{$R *.dfm}

(***************** РАБОТА НА СТОРОНЕ КЛИЕНТА **********************************)

procedure TMainForm.FormCreate(Sender: TObject);
var
s: string;
begin
 // здесь мы просим ввести IP адрес, по умолчанию стоит "localhost", так что если
 // мы ни чего не введем, то прогрмма будет общаться сама с сабой, ну а если
 // введем, то неплохобы позаботится о наличии на удаленном компьютере
 // запущенной копии нашей программы, для проверки работоспособности
 if InputQuery("Программа-пример по UDP",
 "Введите IP адрес удаленной машины, иначе будете разговаривать сами с сабой :)",s)=true then
 UDPClient.Host:=s;
end;

procedure TMainForm.SetFileClick(Sender: TObject);
begin
 // здесь просто указываем файл для отправки
 if OpenDialog.Execute then  FileEdit.Text:=OpenDialog.FileName;
end;

procedure TMainForm.SendBtnClick(Sender: TObject);
begin
 // здесь просто отправляем текстовое сообщение
 UDPClient.Send("text"+SendEdit.Text);
 SendEdit.Clear;
end;

procedure TMainForm.SendFileBtnClick(Sender: TObject);
var
 MemStream  : TMemoryStream;
begin
 // здесь отправляем файл
 // создаем поток в памяти
 MemStream:= TMemoryStream.Create;
 // загружаем файл в наш поток
 MemStream.LoadFromFile(FileEdit.Text);
 //

 // отправляем наш поток
 UDPClient.SendBuffer(MemStream.Memory^,MemStream.Size);
 // освобождаем память
 MemStream.Free;
end;

(***************** РАБОТА НА СТОРОНЕ СЕРВЕРА **********************************)

procedure TMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream;
 ABinding: TIdSocketHandle);
var
 // объявляем 2 потока, один для строк, другой для любой другой информации
 // в нашем случае для файлов (так же можно пересылать что угодно)
 StrStream  : TStringStream;
 MemStream  : TMemoryStream;
begin
 // здесь происходит обработка данных пришедших от клиента
 // на данном этапе есть маленькая логическая бомба, все что длинной до 255
 // я считаю текстом (стандартное ограничение строковой переменной) , а что
 // больше 255, то это уже файл, на самом деле и файл может весить 255,
 // это конечно редкость но может быть, как это исправить подумай сам (мне лень) :)
 if AData.Size<=255 then
 begin
   // итак к нам пришел текст, работаем с потоком строк
   // создаем строковый поток
   StrStream:=TStringStream.Create("");
   // читаем данные в этот поток из пришедшего потока
   StrStream.CopyFrom(AData, AData.Size);
   // добавляем данные в приемник, указывая перед этим от кого этот текст
   Memo.Lines.Add(ABinding.PeerIP+": "+copy(StrStream.DataString,5,length(StrStream.DataString)));
   // освобождаем память
   StrStream.Free;
 end else
 begin
   // итак к нам пришел файл, работаем с потоком в памяти
   MemStream:= TMemoryStream.Create;
   // загружаем файл в наш поток
   MemStream.CopyFrom(AData, AData.Size);
   // выводим диалог сохранения файла
   if SaveDialog.Execute then MemStream.SaveToFile(SaveDialog.FileName);
   // освобождаем память
   MemStream.Free;
 end;
end;

end.


 
Сергей М. ©   (2010-01-17 17:48) [1]

Есть велосипед, который изобретали и собирали для извоза одного причинного места  по городскому асфальту со скоростью 20 км/ч.
Его нужно изменить для езды четырех причинных мест по бездорожью и разгильдяйству со скоростью 80 км/ч.

Помогите с ?


 
Separator ©   (2010-01-29 12:49) [2]

Передача видео потока совершенна друга задача нежели передача файла. ПО UDP нельзя передать пакт больше 65 507 байт не разбивая на части. Так что думайте сами и для начала почитайте какую-нибудь умную информацию, да и в данном случае скорей всего использует не UDP протокол.


 
ZigZag   (2010-09-22 17:51) [3]

Ну конечно, взял чужой исходник и давай с ним каля баля, да? Если бы это был бы мой исходник, я бы обиделся... Кстати про велосипед круто придумано:)


 
DVM ©   (2010-09-24 11:49) [4]


> Separator ©   (29.01.10 12:49) [2]


> да и в данном случае скорей всего использует не UDP протокол.

Как раз UDP протокол чаще всего и используется протоколами RTSP/RTSP для передачи видео. RTP Multicast и RTP Unicast как раз используют UDP.



Страницы: 1 вся ветка

Текущий архив: 2018.03.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.005 c
2-1459355702
Макака
2016-03-30 19:35
2018.03.18
TreeView


6-1263673971
zSvetik
2010-01-16 23:32
2018.03.18
Видеотрансляция по сети


2-1459159042
TheEd
2016-03-28 12:57
2018.03.18
Редактирование ячейки DBGridEh только кнопкой


15-1471210202
Юрий
2016-08-15 00:30
2018.03.18
С днем рождения ! 15 августа 2016 понедельник


2-1456676881
Илья_666
2016-02-28 19:28
2018.03.18
Взаимодействие с компонентами