Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2015, 09:22   #1
Programmer0
Пользователь
 
Регистрация: 05.05.2015
Сообщений: 55
По умолчанию Проверка наличия rtsp-потока для воспроизведения через libvlc

Здравствуйте.
Пишу программу с возможностью показа видео с IP-камер. Использую libvlc. Процедуры начала трансляции и остановки(с офф-сайта https://wiki.videolan.org/Using_libvlc_with_Delphi/):
Код:
procedure TForm1.btnStart1Click(Sender: TObject);
begin
  // create new vlc instance
  vlcInstance1 := libvlc_new(0, nil);
  // create new vlc media from network, use libvlc_media_new_location instead
  vlcMedia1 := libvlc_media_new_location(vlcInstance1, 'rtsp://192.168.9.55:555/h264/media.amp');
  // create new vlc media player
  vlcMediaPlayer1 := libvlc_media_player_new_from_media(vlcMedia1);
  // now no need the vlc media, free it
  libvlc_media_release(vlcMedia1);
  // play video in a TPanel, if not call this routine, vlc media will open a new window
  libvlc_media_player_set_hwnd(vlcMediaPlayer1, Pointer(Panel1.Handle));
  // play media
  libvlc_media_player_play(vlcMediaPlayer1);
end;

procedure TForm1.btnStop1Click(Sender: TObject);
begin
  if not Assigned(vlcMediaPlayer1) then
    Exit;

  // stop vlc media player
  libvlc_media_player_stop(vlcMediaPlayer1);
  // and wait until it completely stops
  while libvlc_media_player_is_playing(vlcMediaPlayer1) = 1 do begin
    Sleep(100);
  end;
  // release vlc media player
  libvlc_media_player_release(vlcMediaPlayer1);
  vlcMediaPlayer1 := nil;
  // release vlc instance
  libvlc_release(vlcInstance1);
end;
Как можно отслеживать наличие/отсутствие потока (например, если обрыв сетевого канала или отключение питания IP-камеры)?
Programmer0 вне форума Ответить с цитированием
Старый 24.12.2015, 11:05   #2
Programmer0
Пользователь
 
Регистрация: 05.05.2015
Сообщений: 55
По умолчанию

Подсказали:
Код:
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, PasLibVlcUnit, Vcl.StdCtrls,
  Vcl.ExtCtrls;
 
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
    pMediaPlayer: libvlc_media_player_t_ptr;
  public
    { Public declarations }
  end;
 
procedure EventCallBack(p_event : libvlc_event_t_ptr; data:  Pointer); cdecl;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure EventCallBack(p_event : libvlc_event_t_ptr; data:  Pointer);
var
  str: string;
begin
  case p_event.event_type of
    libvlc_MediaPlayerPlaying: str := 'Playing';
    libvlc_MediaPlayerPaused: str := 'Paused';
    libvlc_MediaPlayerStopped: str := 'Stopped';
    libvlc_MediaPlayerOpening: str := 'Opening';
    libvlc_MediaPlayerEncounteredError: str := 'Encountered Error';
  end;
  Form1.Label1.Caption := str;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  libvlc_media_player_play(pMediaPlayer);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  libvlc_media_player_stop(pMediaPlayer);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  libvlc_media_player_pause(pMediaPlayer);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
  pInst : libvlc_instance_t_ptr;
  pMedia: libvlc_media_t_ptr;
  pEventManager: libvlc_event_manager_t_ptr;
begin
  libvlc_dynamic_dll_init();
  pInst := libvlc_new(0, nil);
  pMedia := libvlc_media_new_location(pInst, 'rtmp://stream.smcloud.net/live2/eskatv/eskatv_480p');
  pMediaPlayer := libvlc_media_player_new_from_media(pMedia);
  libvlc_media_release(pMedia);
  libvlc_media_player_set_hwnd(pMediaPlayer, Panel1.Handle);
  // get event manager
  pEventManager := libvlc_media_player_event_manager(pMediaPlayer);
  // register event
  libvlc_event_attach(pEventManager, libvlc_MediaPlayerPlaying, @EventCallBack, nil);
  libvlc_event_attach(pEventManager, libvlc_MediaPlayerPaused, @EventCallBack, nil);
  libvlc_event_attach(pEventManager, libvlc_MediaPlayerStopped, @EventCallBack, nil);
  libvlc_event_attach(pEventManager, libvlc_MediaPlayerOpening, @EventCallBack, nil);
  libvlc_event_attach(pEventManager, libvlc_MediaPlayerEncounteredError, @EventCallBack, nil);   // it is?
end;
 
end.
Programmer0 вне форума Ответить с цитированием
Старый 25.12.2015, 16:16   #3
Programmer0
Пользователь
 
Регистрация: 05.05.2015
Сообщений: 55
По умолчанию

Не совсем оно.

Во-первых, libvlc_MediaPlayerEncounteredError возникает, когда до запуска нет связи с камерой, а потом нажать play. А если шло воспроизведение, а потом произошел обрыв соединения, то возникнет libvlc_MediaPlayerEndReached. Это если я правильно понял.

А вот вторая проблема: если во время воспроизведения разорвать сеть на несколько секунд, а потом опять восстановить, то плеер
- либо несколько секунд показывает застывшую картинку, потом несколько секунд что-то буферрирует и восстанавливает поток(это может длиться секунд 40);
- либо продолжает показывать, но с задержкой(примерно равной времени разрыва).

Как избавиться от такой задержки? И можно ли отловить эти миниразрывы?
Programmer0 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с RTSP потоком (нужно сделать снимок из потока) power11 Мультимедиа в Delphi 1 30.04.2015 20:01
Проверка наличия соединения tocsik C/C++ Сетевое программирование 2 02.07.2014 10:43
Проверка наличия интернета через прокси сервер. Crunkordie Общие вопросы Delphi 0 20.07.2011 11:35
Программа для воспроизведения тонового звука через промежуток времени Vl-sn Помощь студентам 9 12.03.2010 20:27
проверка наличия файла Juffin Общие вопросы Delphi 2 18.04.2009 14:17