Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.52 MB
Время: 0.009 c
3-96117
Rel_
2003-09-09 08:53
2003.09.29
Проблема с кодировкой


1-96250
kalliopiy
2003-09-17 14:55
2003.09.29
ListView+TreeView


14-96345
Rauf
2003-09-10 03:06
2003.09.29
Где скачать ПРОЛОГ и ЛИСП???


14-96415
Nikolay M.
2003-09-11 10:21
2003.09.29
Тюнинг копейки :)


1-96180
Vitaliygavrilov
2003-09-16 10:46
2003.09.29
Как сделать по проще





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский