Page 1 of 1
Add Mediaplayer (or video/audio) to RichView
Posted: Mon Oct 17, 2005 1:01 pm
by wvd_vegt
Hi,
Is there samplecode of how to add audio and video to TRichViewEdit, preferably by the MediaPlayer so it can be rendered to a (x)html page.
Posted: Wed Oct 19, 2005 4:48 pm
by Sergey Tkachenko
Posted: Wed Oct 19, 2005 6:43 pm
by wvd_vegt
Hi,
Thanks a lot, will check it out tommorrow!
Posted: Thu Oct 20, 2005 12:55 pm
by wvd_vegt
Hi,
It works but i still have some minor problems
1) I added the following code just after the Player.open call to resize the player to the movie. But TRIchViewEdit keeps showing the cursor at the old size and position.
Code: Select all
mw := Player.DisplayRect.Right - Player.DisplayRect.Left;
mh := Player.DisplayRect.Bottom - Player.DisplayRect.Top;
VideoPanel.Width := mw;
VideoPanel.Height := mh;
Panel.Width := mw;
Panel.Height := mh + Player.Height;
Player.Width := mw;
2) Addding a
behind above code starts it playing directly after insertion (no black square and more like the swf sample).
3) When I delete the avi and try add it again without closing the editor I get a message that 'The device name is alreay being used as an alias by this application'. It also happens whan you insert a second copy of the same movie into a document.
4) When I insert a movie into a tablecell the cell is enlarged a bit but not to the size of the movie being inserted (maybe related to point 1, as the avi was larger then the default player size).
Posted: Thu Oct 20, 2005 1:06 pm
by wvd_vegt
Hi,
I fixed points 1 and 4 of the previous reply by adding a
just after the finally block.
Another point i forgot to mention is that if the code is used in an application with more than one TRichView the OnPlayerClick needs to know which editor it's addressing. The following code finds the editor and selects the video for resizing:
Code: Select all
procedure T_MainForm.OnPlayerClick(Sender: TObject);
var Panel : TPanel;
begin
Panel := Sender as TPanel;
if Panel.Parent is TPanel then
Panel := TPanel(Panel.Parent);
if (Panel.Parent is TRichViewEdit) then
(Panel.Parent as TRichViewEdit).SelectControl(Panel);
end;
Posted: Thu Oct 20, 2005 2:36 pm
by wvd_vegt
Hi,
The following code centers the avi at it's original size and also supports audio.
Only problems left are:
1) to correctly enable the pause/stop button after the play command (Delphi problem) and
2) correctly size the mediaplayer that is emebbed in the exported htmlpage (as it has a different size than a TMediaplayer).
Code: Select all
procedure T_MainForm.rvActionVideoExecute(Sender: TObject;
Editor: TCustomRichViewEdit);
var Panel, VideoPanel: TPanel;
Player : TMediaPlayer;
mh : Integer;
mw : Integer;
begin
if OpenDialog2.Execute then
begin
// Creating the player panel
Panel := TPanel.Create(nil);
Panel.BevelInner := bvNone;
Panel.BevelOuter := bvNone;
Panel.Width := 200;
// Creating a panel to show video
VideoPanel := TPanel.Create(Panel);
VideoPanel.Parent := Panel;
VideoPanel.BevelInner := bvNone;
VideoPanel.BevelOuter := bvNone;
VideoPanel.Width := 200;
VideoPanel.Height := 200;
VideoPanel.Color := clBlack;
// Creating a player control
Player := TMediaPlayer.Create(Panel);
Player.Parent := Panel;
Player.ColoredButtons := [];
Player.VisibleButtons := [btPlay, btPause, btStop];
Player.Height := 20;
Panel.Height := VideoPanel.Height + Player.Height;
Player.Left := (Panel.Width - Player.Width) div 2;
Player.Top := VideoPanel.Height;
Player.Display := VideoPanel;
Panel.OnResize := OnPlayerResize;
Panel.OnClick := OnPlayerClick;
VideoPanel.OnClick := OnPlayerClick;
// Inserting in TRichViewEdit
Editor.TopLevelEditor.BeginUndoGroup(rvutInsert);
Editor.TopLevelEditor.SetUndoGroupMode(True); // grouping InsertControl & SetCurrentItemExtraIntProperty
try
if Editor.InsertControl('', Panel, rvvaBaseline) then
begin
Editor.SetCurrentItemExtraIntProperty(rvepResizable, 1, True);
Player.FileName := OpenDialog2.FileName;
Player.Open;
mw := Player.DisplayRect.Right - Player.DisplayRect.Left;
mh := Player.DisplayRect.Bottom - Player.DisplayRect.Top;
VideoPanel.Width := mw;
VideoPanel.Height := mh;
VideoPanel.Left := (Panel.Width - mw) div 2;
Panel.Width := Max(mw, Player.Width);
Panel.Height := Max(mh, 0) + Player.Height;
Player.Top := Panel.Height - Player.Height;
Player.Play;
end;
finally
Editor.TopLevelEditor.SetUndoGroupMode(False);
end;
Editor.Format;
end;
end;
and
Code: Select all
procedure T_MainForm.OnPlayerResize(Sender: TObject);
var Panel, VideoPanel: TPanel;
Player : TMediaPlayer;
begin
Panel := Sender as TPanel;
VideoPanel := Panel.Components[0] as TPanel;
Player := Panel.Components[1] as TMediaPlayer;
VideoPanel.Left := (Panel.Width - VideoPanel.Width) div 2;
VideoPanel.Top := ((Panel.Height - VideoPanel.Height - Player.Height) div 2);
Player.Left := (Panel.Width - Player.Width) div 2;
Player.Top := Panel.Height - Player.Height;
end;
and finally
Code: Select all
procedure T_MainForm.OnPlayerClick(Sender: TObject);
var Panel : TPanel;
begin
Panel := Sender as TPanel;
if Panel.Parent is TPanel then
Panel := TPanel(Panel.Parent);
if (Panel.Parent is TRichViewEdit) then
(Panel.Parent as TRichViewEdit).SelectControl(Panel);
end;
Posted: Thu Oct 20, 2005 5:22 pm
by Sergey Tkachenko
About resizing: call ResizeCurrentControl(NewWidth, NewHeight) instead of Format, it's much more faster.
Or better yet, resize it properly before the insertion to avoid flickering (resizing may require that the panel's Parent is assigned; in this case, temporarily make it hidden (Panel.Visible := False) and assign its parent (Panel.Parent := RichViewEdit1))
Please find answers to other your questions yourself, since they are not directly related to TRichView.
I am afraid that the problem of playing the same file by several players cannot be solved using TMediaPlayer. I believe it can be solved by providing an unique alias name in TMCI_Open_Parms structure when opening video (procedure TMediaPlayer.Open), but TMediaPlayer does not allow to specify aliases.