Using libvlc with Delphi: Difference between revisions
No edit summary |
No edit summary |
||
| Line 135: | Line 135: | ||
</pre> | </pre> | ||
=== Create form === | === Create form === | ||
Load library on form create. If you use a incompartible libvlc version (older or newer than this demo), some functions may not be correct (obsolete or agruments changed). In this case, program will display a list of functions failed to load, and you can correct these according to your libvlc version. | Load library on form create. If you use a incompartible libvlc version (older or newer than this demo), some functions may not be correct (obsolete or agruments changed). In this case, program will display a list of functions failed to load, and you can correct these according to your libvlc version. | ||
<pre>// ----------------------------------------------------------------------------- | <pre>// ----------------------------------------------------------------------------- | ||
procedure TForm1.FormCreate(Sender: TObject); | procedure TForm1.FormCreate(Sender: TObject); | ||
| Line 143: | Line 143: | ||
begin | begin | ||
// load vlc library | // load vlc library | ||
vlclib := LoadVLCLibrary(GetVLCLibPath()); | vlclib := LoadVLCLibrary(GetVLCLibPath()); | ||
if vlclib = 0 then begin | if vlclib = 0 then begin | ||
Showmessage('Load vlc library failed'); | Showmessage('Load vlc library failed'); | ||
| Line 149: | Line 149: | ||
end; | end; | ||
// sL will contains list of functions fail to load | // sL will contains list of functions fail to load | ||
sL := TStringList.Create; | sL := TStringList.Create; | ||
if not LoadVLCFunctions(vlclib, sL) then begin | if not LoadVLCFunctions(vlclib, sL) then begin | ||
Showmessage('Some functions failed to load : ' + #13#10 + sL.Text); | Showmessage('Some functions failed to load : ' + #13#10 + sL.Text); | ||
FreeLibrary(vlclib); | FreeLibrary(vlclib); | ||
sL.Free; | sL.Free; | ||
| Line 160: | Line 160: | ||
</pre> | </pre> | ||
=== Close form === | |||
Remember to unload libvlc library when exit | |||
<pre>// ----------------------------------------------------------------------------- | |||
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); | |||
begin | |||
// unload vlc library | |||
FreeLibrary(vlclib); | |||
end; | |||
</pre> | |||
=== Play a media<br> === | |||
Play a media (file or MURL) when user clicks on button "Play" | |||
<pre>// ----------------------------------------------------------------------------- | |||
procedure TForm1.btnPlayClick(Sender: TObject); | |||
begin | |||
// create new vlc instance | |||
vlcInstance := libvlc_new(0, nil); | |||
// create new vlc media from file | |||
vlcMedia := libvlc_media_new_path(vlcInstance, 'e:\udp\239.10.10.9.ts'); | |||
// if you want to play from network, use libvlc_media_new_location instead | |||
// vlcMedia := libvlc_media_new_location(vlcInstance, 'udp://@225.2.1.27:5127'); | |||
// create new vlc media player | |||
vlcMediaPlayer := libvlc_media_player_new_from_media(vlcMedia); | |||
// now no need the vlc media, free it | |||
libvlc_media_release(vlcMedia); | |||
// play video in a TPanel, if not call this routine, vlc media will open a new window | |||
libvlc_media_player_set_hwnd(vlcMediaPlayer, Pointer(Panel1.Handle)); | |||
// play media | |||
libvlc_media_player_play(vlcMediaPlayer); | |||
end; | |||
</pre> | |||
=== Stop a media === | |||
And stop playing when user clicks on button "Stop" | |||
<pre>// ----------------------------------------------------------------------------- | |||
procedure TForm1.btnStopClick(Sender: TObject); | |||
begin | |||
if not Assigned(vlcMediaPlayer) then begin | |||
Showmessage('Not playing'); | |||
Exit; | |||
end; | |||
// stop vlc media player | |||
libvlc_media_player_stop(vlcMediaPlayer); | |||
// and wait until it completely stops | |||
while libvlc_media_player_is_playing(vlcMediaPlayer) = 1 do begin | |||
Sleep(100); | |||
end; | |||
// release vlc media player | |||
libvlc_media_player_release(vlcMediaPlayer); | |||
vlcMediaPlayer := nil; | |||
// release vlc instance | |||
libvlc_release(vlcInstance); | |||
end; | |||
</pre> | |||
[[Category:Coding]] [[Category:Delphi]] | [[Category:Coding]] [[Category:Delphi]] | ||
Revision as of 06:47, 9 January 2012
This is a sample code to play media files using libvlc with Delphi (test with Delphi XE2 VCL form, VLC 1.1.11).
Form design
Use a simple form with 3 control : Panel1 (TPanel) to display video, btnPlay (TButton) to play media, and btnStop (TButton) to stop playing
Full source code
Implementations
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
btnPlay: TButton;
btnStop: TButton;
Panel1: TPanel;
procedure btnPlayClick(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
plibvlc_instance_t = type Pointer;
plibvlc_media_player_t = type Pointer;
plibvlc_media_t = type Pointer;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
libvlc_media_new_path : function(p_instance : Plibvlc_instance_t; path : PAnsiChar) : Plibvlc_media_t; cdecl;
libvlc_media_new_location : function(p_instance : plibvlc_instance_t; psz_mrl : PAnsiChar) : Plibvlc_media_t; cdecl;
libvlc_media_player_new_from_media : function(p_media : Plibvlc_media_t) : Plibvlc_media_player_t; cdecl;
libvlc_media_player_set_hwnd : procedure(p_media_player : Plibvlc_media_player_t; drawable : Pointer); cdecl;
libvlc_media_player_play : procedure(p_media_player : Plibvlc_media_player_t); cdecl;
libvlc_media_player_stop : procedure(p_media_player : Plibvlc_media_player_t); cdecl;
libvlc_media_player_release : procedure(p_media_player : Plibvlc_media_player_t); cdecl;
libvlc_media_player_is_playing : function(p_media_player : Plibvlc_media_player_t) : Integer; cdecl;
libvlc_media_release : procedure(p_media : Plibvlc_media_t); cdecl;
libvlc_new : function(argc : Integer; argv : PAnsiChar) : Plibvlc_instance_t; cdecl;
libvlc_release : procedure(p_instance : Plibvlc_instance_t); cdecl;
vlcLib: integer;
vlcInstance: plibvlc_instance_t;
vlcMedia: plibvlc_media_t;
vlcMediaPlayer: plibvlc_media_player_t;
Get VLC installation path
Normally, the library libvlc.dll is in "C:\Program files\Videolan\VLC\". This function read registry to get the correct VLC installation path, stored in key HKEY_LOCAL_MACHINE\Software\VideoLAN\VLC.
// -----------------------------------------------------------------------------
// Read registry to get VLC installation path
// -----------------------------------------------------------------------------
function GetVLCLibPath: String;
var
Handle: HKEY;
RegType: Integer;
DataSize: Cardinal;
Key: PWideChar;
begin
Result := '';
Key := 'Software\VideoLAN\VLC';
if RegOpenKeyEx(HKEY_LOCAL_MACHINE, Key, 0, KEY_READ, Handle) = ERROR_SUCCESS then
begin
if RegQueryValueEx(Handle, 'InstallDir', nil, @RegType, nil, @DataSize) = ERROR_SUCCESS then
begin
SetLength(Result, DataSize);
RegQueryValueEx(Handle, 'InstallDir', nil, @RegType, PByte(@Result[1]), @DataSize);
Result[DataSize] := '\';
end
else Showmessage('Error on reading registry');
RegCloseKey(Handle);
Result := String(PChar(Result));
end;
end;
Load libvlc library into memory
Next, load library libvlc.dll into memory
// ----------------------------------------------------------------------------- // Load libvlc library into memory // ----------------------------------------------------------------------------- function LoadVLCLibrary(APath: string): integer; begin Result := LoadLibrary(PWideChar(APath + '\libvlccore.dll')); Result := LoadLibrary(PWideChar(APath + '\libvlc.dll')); end;
Get address of libvlc functions
This will get address of libvlc functions. Only neccessary functions loaded for this sample code, please refer to libvlc document if you need more functions
// -----------------------------------------------------------------------------
function GetAProcAddress(handle: integer; var addr: Pointer; procName: string; failedList: TStringList): integer;
begin
addr := GetProcAddress(handle, PWideChar(procName));
if Assigned(addr) then Result := 0
else begin
if Assigned(failedList) then failedList.Add(procName);
Result := -1;
end;
end;
// -----------------------------------------------------------------------------
// Get address of libvlc functions
// -----------------------------------------------------------------------------
function LoadVLCFunctions(vlcHandle: integer; failedList: TStringList): Boolean;
begin
GetAProcAddress(vlcHandle, @libvlc_new, 'libvlc_new', failedList);
GetAProcAddress(vlcHandle, @libvlc_media_new_location, 'libvlc_media_new_location', failedList);
GetAProcAddress(vlcHandle, @libvlc_media_player_new_from_media, 'libvlc_media_player_new_from_media', failedList);
GetAProcAddress(vlcHandle, @libvlc_media_release, 'libvlc_media_release', failedList);
GetAProcAddress(vlcHandle, @libvlc_media_player_set_hwnd, 'libvlc_media_player_set_hwnd', failedList);
GetAProcAddress(vlcHandle, @libvlc_media_player_play, 'libvlc_media_player_play', failedList);
GetAProcAddress(vlcHandle, @libvlc_media_player_stop, 'libvlc_media_player_stop', failedList);
GetAProcAddress(vlcHandle, @libvlc_media_player_release, 'libvlc_media_player_release', failedList);
GetAProcAddress(vlcHandle, @libvlc_release, 'libvlc_release', failedList);
GetAProcAddress(vlcHandle, @libvlc_media_player_is_playing, 'libvlc_media_player_is_playing', failedList);
GetAProcAddress(vlcHandle, @libvlc_media_new_path, 'libvlc_media_new_path', failedList);
// if all functions loaded, result is an empty list, otherwise result is a list of functions failed
Result := failedList.Count = 0;
end;
Create form
Load library on form create. If you use a incompartible libvlc version (older or newer than this demo), some functions may not be correct (obsolete or agruments changed). In this case, program will display a list of functions failed to load, and you can correct these according to your libvlc version.
// -----------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var sL: TStringList;
begin
// load vlc library
vlclib := LoadVLCLibrary(GetVLCLibPath());
if vlclib = 0 then begin
Showmessage('Load vlc library failed');
Exit;
end;
// sL will contains list of functions fail to load
sL := TStringList.Create;
if not LoadVLCFunctions(vlclib, sL) then begin
Showmessage('Some functions failed to load : ' + #13#10 + sL.Text);
FreeLibrary(vlclib);
sL.Free;
Exit;
end;
sL.Free;
end;
Close form
Remember to unload libvlc library when exit
// ----------------------------------------------------------------------------- procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin // unload vlc library FreeLibrary(vlclib); end;
Play a media
Play a media (file or MURL) when user clicks on button "Play"
// ----------------------------------------------------------------------------- procedure TForm1.btnPlayClick(Sender: TObject); begin // create new vlc instance vlcInstance := libvlc_new(0, nil); // create new vlc media from file vlcMedia := libvlc_media_new_path(vlcInstance, 'e:\udp\239.10.10.9.ts'); // if you want to play from network, use libvlc_media_new_location instead // vlcMedia := libvlc_media_new_location(vlcInstance, 'udp://@225.2.1.27:5127'); // create new vlc media player vlcMediaPlayer := libvlc_media_player_new_from_media(vlcMedia); // now no need the vlc media, free it libvlc_media_release(vlcMedia); // play video in a TPanel, if not call this routine, vlc media will open a new window libvlc_media_player_set_hwnd(vlcMediaPlayer, Pointer(Panel1.Handle)); // play media libvlc_media_player_play(vlcMediaPlayer); end;
Stop a media
And stop playing when user clicks on button "Stop"
// -----------------------------------------------------------------------------
procedure TForm1.btnStopClick(Sender: TObject);
begin
if not Assigned(vlcMediaPlayer) then begin
Showmessage('Not playing');
Exit;
end;
// stop vlc media player
libvlc_media_player_stop(vlcMediaPlayer);
// and wait until it completely stops
while libvlc_media_player_is_playing(vlcMediaPlayer) = 1 do begin
Sleep(100);
end;
// release vlc media player
libvlc_media_player_release(vlcMediaPlayer);
vlcMediaPlayer := nil;
// release vlc instance
libvlc_release(vlcInstance);
end;