Конференция "Сети" » Видеотрансляция по сети [D7]
 
  • 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 км/ч.

    Помогите с ?
  • Separator © (29.01.10 12:49) [2]
    Передача видео потока совершенна друга задача нежели передача файла. ПО UDP нельзя передать пакт больше 65 507 байт не разбивая на части. Так что думайте сами и для начала почитайте какую-нибудь умную информацию, да и в данном случае скорей всего использует не UDP протокол.
  • ZigZag (22.09.10 17:51) [3]
    Ну конечно, взял чужой исходник и давай с ним каля баля, да? Если бы это был бы мой исходник, я бы обиделся... Кстати про велосипед круто придумано:)
  • DVM © (24.09.10 11:49) [4]

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


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

    Как раз UDP протокол чаще всего и используется протоколами RTSP/RTSP для передачи видео. RTP Multicast и RTP Unicast как раз используют UDP.
 
Конференция "Сети" » Видеотрансляция по сети [D7]
Есть новые Нет новых   [134436   +25][b:0][p:0.003]