Difference between revisions of "Using libvlc with Delphi"
Line 87: | Line 87: | ||
end; | end; | ||
end; | end; | ||
− | </pre> | + | </pre> |
+ | === Load libvlc library into memory === | ||
+ | |||
+ | Next, load library libvlc.dll into memory | ||
+ | <pre>// ----------------------------------------------------------------------------- | ||
+ | // Load libvlc library into memory | ||
+ | // ----------------------------------------------------------------------------- | ||
+ | function LoadVLCLibrary(APath: string): integer; | ||
+ | begin | ||
+ | Result := LoadLibrary(PWideChar(APath + '\libvlccore.dll')); | ||
+ | Result := LoadLibrary(PWideChar(APath + '\libvlc.dll')); | ||
+ | end; | ||
+ | |||
+ | </pre> | ||
+ | === 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 | ||
+ | <pre>// ----------------------------------------------------------------------------- | ||
+ | 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; | ||
+ | |||
+ | </pre> | ||
+ | === 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. | ||
+ | <pre>// ----------------------------------------------------------------------------- | ||
+ | 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; | ||
+ | |||
+ | </pre> | ||
[[Category:Coding]] [[Category:Delphi]] | [[Category:Coding]] [[Category:Delphi]] |
Revision as of 06:43, 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).
Contents
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;