-
zSvetik © (16.01.10 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. -
Сергей М. © (17.01.10 17:48) [1]Есть велосипед, который изобретали и собирали для извоза одного причинного места по городскому асфальту со скоростью 20 км/ч.
Его нужно изменить для езды четырех причинных мест по бездорожью и разгильдяйству со скоростью 80 км/ч.
Помогите с ? -
Передача видео потока совершенна друга задача нежели передача файла. ПО UDP нельзя передать пакт больше 65 507 байт не разбивая на части. Так что думайте сами и для начала почитайте какую-нибудь умную информацию, да и в данном случае скорей всего использует не UDP протокол.
-
ZigZag (22.09.10 17:51) [3]Ну конечно, взял чужой исходник и давай с ним каля баля, да? Если бы это был бы мой исходник, я бы обиделся... Кстати про велосипед круто придумано:)
-
> Separator © (29.01.10 12:49) [2]
> да и в данном случае скорей всего использует не UDP протокол.
Как раз UDP протокол чаще всего и используется протоколами RTSP/RTSP для передачи видео. RTP Multicast и RTP Unicast как раз используют UDP.