ネットワークカメラ映像を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ストリーミングでリアルタイムに表示されます。