RTSP再生ソフト|Delphi+VLCでネットワークカメラ映像を表示
RTSP再生には、VLCメディアプレイヤー(またはそのDLL)を利用することで、ネットワークカメラ等の映像を表示できます。
本記事では、RTSP対応のネットワークカメラ映像を、VLCメディアプレイヤーのDLLを使ってDelphiで再生する方法を紹介します。
VCLアプリケーションとして構築し、64bit環境でのDLL連携やMRL指定によるストリーム再生をサンプルコード付きで解説。
監視カメラ映像のリアルタイム表示に応用可能です。
監視カメラなど、多くのネットワークカメラはRTSPプロトコルに対応していてIPストリーミング映像を受信することができます。
例えば、以下の写真のTapo TC65はRTSPプロトコルに対応していてMRL(Media resource locator)に接続してRTSPストリーム再生できます。
マイクも付いているので音声もリアルタイム再生できます。
- 1080P(1920×1080)ストリーム
- MRLは
rtsp://ユーザー名:パスワード@IPアドレス:554/stream1 - 360P(640×360)ストリーム
- MRLは
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ストリーミングでリアルタイムに表示されます。
