トップへ(mam-mam.net/)

ネットワークカメラ映像をRTSPストリーミング再生 ~Delphiソースコード集

検索:

ネットワークカメラ映像をRTSPストリーミング再生 ~Delphiソースコード集

監視カメラなど、多くのネットワークカメラはRTSPプロトコルに対応していてIPストリーミング映像を受信することができます。
例えば、以下の写真のTapo TC65は対応していて以下MRL(Media resource locator)に接続してRTSPストリーム再生できます。

1080P(1920×1080)ストリーム
rtsp://ユーザー名:パスワード@IPアドレス:554/stream1
360P(640×360)ストリーム
rtsp://ユーザー名:パスワード@IPアドレス:554/stream2

1.VLCメディアプレイヤーのインストール

VLCメディアプレイヤーのDLLファイルを使用しますのでVLCメディアプレイヤーのインストールしてください。(通常は64ビット版がインストールされます)

2.プロジェクトの作成

[ファイル]⇒[新規作成]⇒[Windows VCL アプリケーション -Delphi] をクリックします。
TPanel×2個と、TButton×2個を以下のように配置します。
右上ペインの[ターゲットプラットフォーム]を右クリックして[プラットフォームの追加]から「Windows 64ビット」を追加して切り替えます。

3.プロジェクトの保存

ファイル⇒すべて保存、またはすべて保存ボタンを押して、プロジェクトとユニットを保存します。
「新しいフォルダ」ボタンを押してプロジェクトの保存用フォルダを作成し、ユニットはデフォルトの「Unit1.pas」、プロジェクトはデフォルトの「project1.dproj」で保存します。

4.DLLファイル、フォルダのコピー

VLCメディアプレイヤーをインストールしたフォルダ
C:\Program Files\VideoLAN\VLC
にある
「libvlc.dll」ファイル、「libvlccore.dll」ファイル、「plugins」フォルダを、以下2つのフォルダ内に全てコピーしてください。
...\3.で作成したプロジェクトフォルダ\Win64\Debug
...\3.で作成したプロジェクトフォルダ\Win64\Release

5.ユニットの作成

「ファイル」⇒「新規作成」⇒「ユニット -Delphi」をクリックして新しいユニットを作成します。
保存ボタンを押してファイル名「UVlc.pas」で保存します。
以下のソースコードをコピーして貼り付けます。

unit UVlc;

interface
uses Winapi.Windows,System.SysUtils,dialogs,System.SyncObjs;
{
  通常、64Bit版のVLCメディアプレイヤーをインストールするので
  Delphiも64Bitでコンパイルする必要がある

  C:\Program Files\VideoLAN\VLC
  にある、
  「libvlc.dll」ファイル、「libvlccore.dll」ファイル、「plugins」フォルダを
  ...\プロジェクトフォルダ\Win64\Debug
  ...\プロジェクトフォルダ\Win64\Release
  フォルダに全てコピーしておくこと
}

const
  VOUT_MAX_PLANES = 5;
  LibVlc     = 'libvlc.dll';
  LibVlcCore = 'libvlccore.dll';

type
  plibvlc_instance_t     = type Pointer;
  plibvlc_media_player_t = type Pointer;
  plibvlc_media_t        = type Pointer;
  PPAnsiChar = ^PAnsiChar;

procedure LoadVlcDLL(DllPath:String);
procedure ReleaseVlcDll();

var
  VlcDllHandle:THandle;
  libvlc_new:
    function(argc:Integer;argv:PPAnsiChar):plibvlc_instance_t;cdecl;
  libvlc_release:
    procedure(pInst:plibvlc_instance_t);cdecl;
  libvlc_free:procedure(); cdecl;
  libvlc_media_new_location:
    function(pInst:plibvlc_instance_t;const psz_mrl:PAnsiChar):plibvlc_media_t;cdecl;
  libvlc_media_new_path:
    function(pInst:plibvlc_instance_t;const path:PAnsiChar):plibvlc_media_t;cdecl;
  libvlc_media_release:
    procedure(pMedia:plibvlc_media_t);cdecl;
  libvlc_media_player_new_from_media:
    function(pMedia:plibvlc_media_t):plibvlc_media_player_t;cdecl;
  libvlc_media_player_release:
    procedure(pMediaPlayer:plibvlc_media_player_t);cdecl;
  libvlc_media_player_set_hwnd:
    procedure(pMediaPlayer:plibvlc_media_player_t;hwnd:THandle);cdecl;
  libvlc_media_player_play:
    function(pMediaPlayer:plibvlc_media_player_t):Integer;cdecl;
  libvlc_media_player_stop:
    procedure(pMediaPlayer:plibvlc_media_player_t);cdecl;
  libvlc_media_player_is_playing:
    function(pMediaPlayer:plibvlc_media_player_t):Integer;cdecl;
  libvlc_media_player_set_pause:
    procedure(pMediaPlayer:plibvlc_media_player_t;do_pause:Integer);cdecl;
  libvlc_media_player_pause:
    procedure(pMediaPlayer:plibvlc_media_player_t);cdecl;

implementation

procedure LoadVlcDLL(DllPath:String);
begin
  VlcDllHandle:=SafeLoadLibrary(PChar(DllPath+LibVlc));
  if VlcDllHandle=0 then
  begin
    Showmessage('libvlc.dllの読み込み失敗');
    Exit;
  end;
  //DLLから関数の読み込み
  libvlc_new:=GetProcAddress(VlcDllHandle,'libvlc_new');
  libvlc_release:=GetProcAddress(VlcDllHandle,'libvlc_release');
  libvlc_free:=GetProcAddress(VlcDllHandle,'libvlc_free');
  libvlc_media_new_location:=
    GetProcAddress(VlcDllHandle,'libvlc_media_new_location');
  libvlc_media_new_path:=
    GetProcAddress(VlcDllHandle,'libvlc_media_new_path');
  libvlc_media_release:=
    GetProcAddress(VlcDllHandle,'libvlc_media_release');
  libvlc_media_player_new_from_media:=
    GetProcAddress(VlcDllHandle,'libvlc_media_player_new_from_media');
  libvlc_media_player_release:=
    GetProcAddress(VlcDllHandle,'libvlc_media_player_release');
  libvlc_media_player_set_hwnd:=
    GetProcAddress(VlcDllHandle,'libvlc_media_player_set_hwnd');
  libvlc_media_player_play:=
    GetProcAddress(VlcDllHandle,'libvlc_media_player_play');
  libvlc_media_player_stop:=
    GetProcAddress(VlcDllHandle,'libvlc_media_player_stop');
  libvlc_media_player_is_playing:=
    GetProcAddress(VlcDllHandle,'libvlc_media_player_is_playing');
  libvlc_media_player_set_pause:=
    GetProcAddress(VlcDllHandle,'libvlc_media_player_set_pause');
  libvlc_media_player_pause:=
    GetProcAddress(VlcDllHandle,'libvlc_media_player_pause');
end;

procedure ReleaseVlcDll();
begin
  FreeLibrary(VlcDllHandle);
end;

end.

6.Unit1のソースコードの記述

Unit1に切り替えて、Button1のOnClick、Button2のOnClick、Form1のOnCreate、Form1のOnDestroyイベントに以下ソースコードを入力します。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,
  UVlc;

type
  TForm1 = class(TForm)
    Panel2: TPanel;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    Vlc:plibvlc_instance_t;
    VlcMedia:plibvlc_media_t;
    VlcMediaPlayer:plibvlc_media_player_t;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(VLC) then Exit;
  Vlc := libvlc_new(0, nil);
  //メディアを開く
  //VlcMedia := libvlc_media_new_path(Vlc, PAnsiChar(UTF8Encode('C:\temp\movie.mp4')));
  //URLからメディアを開く
  VLCMedia := libvlc_media_new_location(
    //MRLはご使用のネットワークカメラに従い設定してください
    Vlc,'rtsp://ユーザー名:パスワード@IPアドレス:554/stream1');
  //VLCメディアプレイヤーをメディアから作成
  VlcMediaPlayer := libvlc_media_player_new_from_media(VlcMedia);
  //メディアを解放する
  libvlc_media_release(VlcMedia);
  //Panel2でVLCメディアプレイヤーを再生するように設定する
  libvlc_media_player_set_hwnd(VlcMediaPlayer, Panel2.Handle);
  //再生する
  libvlc_media_player_play(VlcMediaPlayer);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if not Assigned(Vlc) then Exit;
  //VLCメディアプレイヤーの停止
  libvlc_media_player_stop(VlcMediaPlayer);
  //完全停止するまで待つ
  while libvlc_media_player_is_playing(VlcMediaPlayer) = 1 do
  begin
    Sleep(100);
  end;
  //VLCメディアプレイヤーの解放
  libvlc_media_player_release(VlcMediaPlayer);
  VlcMediaPlayer := nil;
  //VLCを解放
  libvlc_release(Vlc);
  Vlc:=nil;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //VLCのDLLをロード
  LoadVlcDLL(
    ExtractFilePath(Application.ExeName)
  );
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(Vlc) then
  begin
    //VLCメディアプレイヤーの停止
    libvlc_media_player_stop(VLCMediaPlayer);
    //完全停止するまで待つ
    while libvlc_media_player_is_playing(VLCMediaPlayer) = 1 do
    begin
      Sleep(100);
    end;
    //VLCメディアプレイヤーの解放
    libvlc_media_player_release(VLCMediaPlayer);
    VLCMediaPlayer := nil;
    //VLCを解放
    libvlc_release(VLC);
  end;
end;

end.

7.完成したアプリケーションを起動する

実行⇒実行 又はツールバーの「実行」ボタンを押して実行します。

8.ネットワークカメラに接続する

「Button1」ボタンをクリックします。 以下のウィンドウが表示(Windowsファイアーウォールのブロック)された場合は 「アクセスを許可する」ボタンを押して554ポートのオープンを許可します。

以下のようにネットワークカメラ映像がRTSPストリーミングでリアルタイムに表示されます。