Форум: "Media";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
ВнизНикто не могбы сказать.... как это видео запихнуть в Panel ? Найти похожие ветки
← →
TankMan (2003-05-19 19:05) [0]Вобщем я тут смотрел примеры в круглом столе дельфи... вот там есть исходники программы, которая изменяет разрешение экрана, ставится в полноэкранный режим и показывает видео и рисует там всякие бмп-шки...
Я тут попарился и сделал на своей форме это все дело... но проблема в том, что видео открывается, но звука почему-то нету :(.... да и само видео отображается по определенным координатам и поверх всего, т.е. просто на Десктопе...
Вот вобщем исходник модуля моей формы... никто не мог бы посмотреть, как сделать так, чтобы появился звук, и видео отображалось в панельке расположенной на форме.
← →
TankMan (2003-05-19 19:18) [1]unit MediaPlayer;
interface
uses
DirectDraw,ActiveX,DShow,ComObj,ButtonEdit,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ExtCtrls, MPlayer, StdCtrls;
type
TfrmMediaPlayer = class(TForm)
MP: TMediaPlayer;
MPPanel: TPanel;
TrackBar: TTrackBar;
btnCloseMedia: TButton;
OpenDialog1: TOpenDialog;
btnOpenFile: TButton;
Palitra : IDirectDrawPalette;
MMStream : IMultiMediaStream;
FDirectDraw: IDirectDraw;
FPrimarySurface: IDirectDrawSurface;
FSpriteSurface: IDirectDrawSurface;
FPictureSurface: IDirectDrawSurface;
Timer1: TTimer;
procedure btnCloseMediaClick(Sender: TObject);
procedure btnOpenFileClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormResize(Sender: TObject);
procedure RenderStreamToSurface(Surface : IDirectDrawSurface; MMStream : IMultiMediaStream);
procedure RenderFileToMMStream(FileName : WideString; var MMStream : IMultiMediaStream ; DDraw : IDirectDraw);
Procedure DirecDrawZapusk;
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
public
end;
var
DDStarted : boolean = False;
hr: HRESULT;
frmMediaPlayer: TfrmMediaPlayer;
MyGraphBuilder : IGraphBuilder;
MyMediaControl : IMediaControl;
VideoWindow : IVideoWindow;
Sample : IDirectDrawStreamSample;
PrimaryVidStream : IMediaStream;
DDStream : IDirectDrawMediaStream;
implementation
{$R *.DFM}
procedure TfrmMediaPlayer.DirecDrawZapusk;
var
hr: HRESULT;
SurfaceDesc: TDDSurfaceDesc;
DDSCaps: TDDSCAPS2;
begin
hr := DirectDrawCreate(nil, FDirectDraw, nil);
if(hr = DD_OK) then begin
hr := FDirectDraw.SetCooperativeLevel(MPPanel.Handle, DDSCL_NORMAL);
if(hr = DD_OK) then begin
FillChar(SurfaceDesc,SizeOf(SurfaceDesc),0);
SurfaceDesc.dwSize := SizeOf(SurfaceDesc);
SurfaceDesc.dwFlags := DDSD_CAPS {or DDSD_BACKBUFFERCOUNT} ;
SurfaceDesc.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX;
SurfaceDesc.dwBackBufferCount := 1;
hr := FDirectDraw.CreateSurface(SurfaceDesc, FPrimarySurface, nil); end;
end;
end;
procedure TfrmMediaPlayer.RenderStreamToSurface(Surface : IDirectDrawSurface; MMStream : IMultiMediaStream);
var
RECT : TRect;
ddsd : TDDSURFACEDESC;
Z1 : DWORD;
begin
MMStream.GetMediaStream(MSPID_PrimaryVideo, PrimaryVidStream);
PrimaryVidStream.QueryInterface(IID_IDirectDrawMediaStream, DDStream);
ddsd.dwSize := sizeof(ddsd);
DDStream.GetFormat(ddsd, Palitra, ddsd, Z1);
rect.top:=(600 - ddsd.dwHeight) div 2;
rect.left:=(800 - ddsd.dwWidth) div 2;
rect.bottom := rect.top+ddsd.dwHeight;
rect.right := rect.left+ddsd.dwWidth;
DDStream.CreateSample(Surface, Rect{}, 0, Sample);
( STREAMSTATE_RUN) unit MediaPlayer;
interface
uses
DirectDraw,ActiveX,DShow,ComObj,ButtonEdit,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ExtCtrls, MPlayer, StdCtrls;
type
TfrmMediaPlayer = class(TForm)
MP: TMediaPlayer;
MPPanel: TPanel;
TrackBar: TTrackBar;
btnCloseMedia: TButton;
OpenDialog1: TOpenDialog;
btnOpenFile: TButton;
Palitra : IDirectDrawPalette;
MMStream : IMultiMediaStream;
FDirectDraw: IDirectDraw;
FPrimarySurface: IDirectDrawSurface;
FSpriteSurface: IDirectDrawSurface;
FPictureSurface: IDirectDrawSurface;
Timer1: TTimer;
procedure btnCloseMediaClick(Sender: TObject);
procedure btnOpenFileClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormResize(Sender: TObject);
procedure RenderStreamToSurface(Surface : IDirectDrawSurface; MMStream : IMultiMediaStream);
procedure RenderFileToMMStream(FileName : WideString; var MMStream : IMultiMediaStream ; DDraw : IDirectDraw);
Procedure DirecDrawZapusk;
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
public
end;
var
DDStarted : boolean = False;
hr: HRESULT;
frmMediaPlayer: TfrmMediaPlayer;
MyGraphBuilder : IGraphBuilder;
MyMediaControl : IMediaControl;
VideoWindow : IVideoWindow;
Sample : IDirectDrawStreamSample;
PrimaryVidStream : IMediaStream;
DDStream : IDirectDrawMediaStream;
implementation
{$R *.DFM}
procedure TfrmMediaPlayer.DirecDrawZapusk;
var
hr: HRESULT;
SurfaceDesc: TDDSurfaceDesc;
DDSCaps: TDDSCAPS2;
begin
hr := DirectDrawCreate(nil, FDirectDraw, nil);
if(hr = DD_OK) then begin
hr := FDirectDraw.SetCooperativeLevel(MPPanel.Handle, DDSCL_NORMAL);
if(hr = DD_OK) then begin
FillChar(SurfaceDesc,SizeOf(SurfaceDesc),0);
SurfaceDesc.dwSize := SizeOf(SurfaceDesc);
SurfaceDesc.dwFlags := DDSD_CAPS {or DDSD_BACKBUFFERCOUNT} ;
SurfaceDesc.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX;
SurfaceDesc.dwBackBufferCount := 1;
hr := FDirectDraw.CreateSurface(SurfaceDesc, FPrimarySurface, nil); end;
end;
end;
procedure TfrmMediaPlayer.RenderStreamToSurface(Surface : IDirectDrawSurface; MMStream : IMultiMediaStream);
var
RECT : TRect;
ddsd : TDDSURFACEDESC;
Z1 : DWORD;
begin
MMStream.GetMediaStream(MSPID_PrimaryVideo, PrimaryVidStream);
PrimaryVidStream.QueryInterface(IID_IDirectDrawMediaStream, DDStream);
ddsd.dwSize := sizeof(ddsd);
DDStream.GetFormat(ddsd, Palitra, ddsd, Z1);
rect.top:=(600 - ddsd.dwHeight) div 2;
rect.left:=(800 - ddsd.dwWidth) div 2;
rect.bottom := rect.top+ddsd.dwHeight;
rect.right := rect.left+ddsd.dwWidth;
DDStream.CreateSample(Surface, Rect{}, 0, Sample);
MMStream.SetState(STREAMSTATE_RUN);
end;
← →
TankMan (2003-05-19 19:20) [2]procedure TfrmMediaPlayer.RenderFileToMMStream(FileName : WideString; var MMStream : IMultiMediaStream ; DDraw : IDirectDraw);
var
AMStream : IAMMultiMediaStream;
NewMediaStremVideo, NewMediaStremAudio : IMediaStream;
begin
CoCreateInstance(CLSID_AMMultiMediaStream, nil, CLSCTX_INPROC_SERVER,IID_IAMMultiMediaStream, AMStream);
AMStream.Initialize(STREAMTYPE_READ, AMMSF_NOGRAPHTHREAD, nil);
AMStream.AddMediaStream(DDraw, @MSPID_PrimaryVideo, 0, NewMediaStremVideo);
AMStream.AddMediaStream(nil,@MSPID_PrimaryAudio, AMMSF_ADDDEFAULTRENDERER, NewMediaStremAudio);
AMStream.OpenFile(PWideChar(FileName), 0);
MMStream := AMStream;
end;
procedure TfrmMediaPlayer.btnOpenFileClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
DirecDrawZapusk;
RenderFileToMMStream(OpenDialog1.filename, MMStream, FDirectDraw);
//irectDraw.QueryInterface(
//MMstream.QueryInterface(;
// if VideoWindow=nil then Application.terminate;
{ VideoWindow.put_Owner(Self.MPPanel.Handle);
VideoWindow.put_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS);
VideoWindow.SetWindowPosition(0,0,MPPanel.ClientRect.Right,MPPanel.ClientRect.Bottom);}
RenderStreamToSurface(FPrimarySurface, MMStream);
{ hr:=Sample.Update(0 , 0, nil, 0); }
DDStarted:=True;
Timer1.Enabled:=True;
end;
end;
procedure TfrmMediaPlayer.FormCreate(Sender: TObject);
begin
...........
end;
procedure TfrmMediaPlayer.FormResize(Sender: TObject);
begin
MPPanel.Left:=5;
MPPanel.SetBounds(5,5,frmMediaPlayer.width-17,frmMediaPlayer.height-85);
if videoWindow<>nil then
VideoWindow.SetWindowPosition(0,0,MPPanel.ClientRect.Right,MPPanel.ClientRect.Bottom);
btnOpenFile.Left:=5;
btnOpenFile.Top:=frmMediaPlayer.Height-btnOpenFile.Height-btnOpenFile.Height-5;
btnCloseMedia.Left:=frmMediaPlayer.Width-btnCloseMedia.Width-12;
btnCloseMedia.Top:=frmMediaPlayer.Height-btnCloseMedia.Height-btnCloseMedia.Height-5;
TrackBar.Left:=5;
TrackBar.Width:=frmMediaPlayer.Width-15;
TrackBar.Top:=frmMediaPlayer.Height-TrackBar.Height-TrackBar.Height-30;
end;
procedure TfrmMediaPlayer.FormDestroy(Sender: TObject);
begin
if(FDirectDraw <> nil) then begin
MMStream.SetState(STREAMSTATE_STOP);
FDirectDraw.FlipToGDISurface; ///переключаемся на тот Surface который использует GDI
FDirectDraw.SetCooperativeLevel(Handle, DDSCL_NORMAL);
if FSpriteSurface <> nil then
FSpriteSurface := nil;
if FPrimarySurface <> nil then
FPrimarySurface := nil;
FDirectDraw := nil;
MMStream:=nil;
end;
end;
procedure TfrmMediaPlayer.Timer1Timer(Sender: TObject);
var
hr: HResult;
OldKvadrat,Kvadrat : TRect;
MyDDBltFx : TDDBltFX;
begin
if not DDStarted then exit;
OldKvadrat:=MPPanel.ClientRect;
FillChar(MyDDBltFx,SizeOf(MyDDBltFx),0);
MyDDBltFx.dwSize:=SizeOf(MyDDBltFx);
hr:=FPrimarySurface.Blt(@OldKvadrat,FPictureSurface,@OldKvadrat,DDBLT_WAIT,@MyDDBltFx);
if (hr = DDERR_SURFACELOST) then ///пользователь уходил, нажав Alt+Tab - а теперь вернулся
begin
// FDirectDraw.RestoreAllSurfaces;
end;
hr:=Sample.Update(0 , 0, nil, 0);
if hr = $40003 {MS_S_ENDOFSTREAM} then
procedure TfrmMediaPlayer.RenderFileToMMStream(FileName : WideString; var MMStream : IMultiMediaStream ; DDraw : IDirectDraw);
var
AMStream : IAMMultiMediaStream;
NewMediaStremVideo, NewMediaStremAudio : IMediaStream;
begin
CoCreateInstance(CLSID_AMMultiMediaStream, nil, CLSCTX_INPROC_SERVER,IID_IAMMultiMediaStream, AMStream);
AMStream.Initialize(STREAMTYPE_READ, AMMSF_NOGRAPHTHREAD, nil);
AMStream.AddMediaStream(DDraw, @MSPID_PrimaryVideo, 0, NewMediaStremVideo);
AMStream.AddMediaStream(nil,@MSPID_PrimaryAudio, AMMSF_ADDDEFAULTRENDERER, NewMediaStremAudio);
AMStream.OpenFile(PWideChar(FileName), 0);
MMStream := AMStream;
end;
procedure TfrmMediaPlayer.btnOpenFileClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
DirecDrawZapusk;
RenderFileToMMStream(OpenDialog1.filename, MMStream, FDirectDraw);
//irectDraw.QueryInterface(
//MMstream.QueryInterface(;
// if VideoWindow=nil then Application.terminate;
{ VideoWindow.put_Owner(Self.MPPanel.Handle);
VideoWindow.put_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS);
VideoWindow.SetWindowPosition(0,0,MPPanel.ClientRect.Right,MPPanel.ClientRect.Bottom);}
RenderStreamToSurface(FPrimarySurface, MMStream);
{ hr:=Sample.Update(0 , 0, nil, 0); }
DDStarted:=True;
Timer1.Enabled:=True;
end;
end;
procedure TfrmMediaPlayer.FormCreate(Sender: TObject);
begin
...........
end;
procedure TfrmMediaPlayer.FormResize(Sender: TObject);
begin
MPPanel.Left:=5;
MPPanel.SetBounds(5,5,frmMediaPlayer.width-17,frmMediaPlayer.height-85);
if videoWindow<>nil then
VideoWindow.SetWindowPosition(0,0,MPPanel.ClientRect.Right,MPPanel.ClientRect.Bottom);
btnOpenFile.Left:=5;
btnOpenFile.Top:=frmMediaPlayer.Height-btnOpenFile.Height-btnOpenFile.Height-5;
btnCloseMedia.Left:=frmMediaPlayer.Width-btnCloseMedia.Width-12;
btnCloseMedia.Top:=frmMediaPlayer.Height-btnCloseMedia.Height-btnCloseMedia.Height-5;
TrackBar.Left:=5;
TrackBar.Width:=frmMediaPlayer.Width-15;
TrackBar.Top:=frmMediaPlayer.Height-TrackBar.Height-TrackBar.Height-30;
end;
procedure TfrmMediaPlayer.FormDestroy(Sender: TObject);
begin
if(FDirectDraw <> nil) then begin
MMStream.SetState(STREAMSTATE_STOP);
FDirectDraw.FlipToGDISurface; ///переключаемся на тот Surface который использует GDI
FDirectDraw.SetCooperativeLevel(Handle, DDSCL_NORMAL);
if FSpriteSurface <> nil then
FSpriteSurface := nil;
if FPrimarySurface <> nil then
FPrimarySurface := nil;
FDirectDraw := nil;
MMStream:=nil;
end;
end;
procedure TfrmMediaPlayer.Timer1Timer(Sender: TObject);
var
hr: HResult;
OldKvadrat,Kvadrat : TRect;
MyDDBltFx : TDDBltFX;
begin
if not DDStarted then exit;
OldKvadrat:=MPPanel.ClientRect;
FillChar(MyDDBltFx,SizeOf(MyDDBltFx),0);
MyDDBltFx.dwSize:=SizeOf(MyDDBltFx);
hr:=FPrimarySurface.Blt(@OldKvadrat,FPictureSurface,@OldKvadrat,DDBLT_WAIT,@MyDDBltFx);
if (hr = DDERR_SURFACELOST) then ///пользователь уходил, нажав Alt+Tab - а теперь вернулся
begin
// FDirectDraw.RestoreAllSurfaces;
end;
hr:=Sample.Update(0 , 0, nil, 0);
if hr = $40003 {MS_S_ENDOFSTREAM} then
MMStream.Seek(0);
end;
end.
Извиняюсь за повторы :(... инет оочень глючный...
Так вот... помотрите пожалуйста, кто разбирается....
Ну Очень нуна поместить в Панельку это видео....
Заранее благодарен...
← →
TankMan (2003-05-21 21:26) [3]Ну хоть ктонибудь читает темы кроме админов?...
Поможите плиизз.. пишу прожку.. вот застопорился на этой проблеме.. :(
← →
Tihas (2003-05-23 20:51) [4]Слушай не проше ли взять MediaPlayer, установить ствойство
Display=Panel1, да и не парится. А звук регулировать http://delphimaster.net/view/8-1049864887/
Удачи.
← →
pasha676 (2003-05-26 09:58) [5]Не вдаваясь в подробности - на том же Королевстве есть статью Азиза, там вроде и как на панель послать поток было написано.
← →
TankMan (2003-06-04 00:34) [6]>>Tihas
.... да вообще-то этот медиа плеер оооочень тормозная штука... я ее использовать не могу :( мне нужно, что-то побыстрее
>>pasha676
А можно что-то поконкретнее, а то я что-то не могу найти такую статью...
← →
pasha676 (2003-06-04 09:28) [7]http://www.delphikingdom.com/mastering/directx/drshow.htm
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.009 c