Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.29;
Скачать: CL | DM;

Вниз

Никто не могбы сказать.... как это видео запихнуть в 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 вся ветка

Текущий архив: 2003.09.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
7-96464
Андрей М.
2003-07-17 23:34
2003.09.29
аудит принтера


14-96443
Gorlum
2003-09-09 16:57
2003.09.29
Парадокс


3-96093
Sour
2003-09-09 15:46
2003.09.29
Domain??


1-96194
Александр из Минска
2003-09-13 19:52
2003.09.29
Как узнать размер файла в байтах?


4-96493
Delf
2003-07-25 13:36
2003.09.29
Как узнать ProcessID зная дескриптор (hangle) окна