Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Никто не могбы сказать.... как это видео запихнуть в Panel ?


TankMan ©   (2003-05-19 19:05:00) 

Вобщем я тут смотрел примеры в круглом столе дельфи... вот там есть исходники программы, которая изменяет разрешение экрана, ставится в полноэкранный режим и показывает видео и рисует там всякие бмп-шки...
Я тут попарился и сделал на своей форме это все дело... но проблема в том, что видео открывается, но звука почему-то нету :(.... да и само видео отображается по определенным координатам и поверх всего, т.е. просто на Десктопе...
Вот вобщем исходник модуля моей формы... никто не мог бы посмотреть, как сделать так, чтобы появился звук, и видео отображалось в панельке расположенной на форме.


pasha676   (2003-06-04 09:28:00) [1]

http://www.delphikingdom.com/mastering/directx/drshow.htm


TankMan   (2003-06-04 00:34:00) [2]

>>Tihas
.... да вообще-то этот медиа плеер оооочень тормозная штука... я ее использовать не могу :( мне нужно, что-то побыстрее

>>pasha676
А можно что-то поконкретнее, а то я что-то не могу найти такую статью...


pasha676   (2003-05-26 09:58:00) [3]

Не вдаваясь в подробности - на том же Королевстве есть статью Азиза, там вроде и как на панель послать поток было написано.


Tihas   (2003-05-23 20:51:00) [4]

Слушай не проше ли взять MediaPlayer, установить ствойство
Display=Panel1, да и не парится. А звук регулировать http://www.delphimaster.ru/cgi-bin/forum.pl?look=1&id=1049864887&n=7
Удачи.


TankMan   (2003-05-21 21:26:00) [5]

Ну хоть ктонибудь читает темы кроме админов?...
Поможите плиизз.. пишу прожку.. вот застопорился на этой проблеме.. :(


TankMan   (2003-05-19 19:20:00) [6]

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-19 19:18:00) [7]

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;



Наверх

Титульная страница Поиск, карта сайта Написать письмо