PDA

Ver la Versión Completa : Capturar frames del TMediaPlayer


chrisredfield
27-06-2003, 22:28:24
Hola a todos.
Quiero capturar algunos frames de un fichero de video que esta ejecutando el TMEdiaPlayer.
¿Como lo hago?.
Habia pensado, una vez posicionado en el frame a grabar, en copiar el frame a un TImage y grabarlo como jpg.
Pero.....¿como accedo al "dibujo" del frame?.
Gracias de antemano.

madriles
29-06-2003, 08:03:21
bueno, creo que lo primero que tienes que hacer es que se ejecute el media player en un contenedor que puedas tratar, por ejemplo en un TPanel.
Pon en tu formulario un TPanel (Left y Top := 0 ) y un TImage, luego este codigo donde mas te guste ( OnCreate, OnShow, OnClick...)

with MediaPlayer1 do
begin
Display:=Panel1;
Panel1.Width:=DisplayRect.Right;
Panel1.Height:=DisplayRect.Bottom;
Image1.Height:=Panel1.Height;
Image1.Width:=Panel1.Width;
end;

luego te posicionas en la imagen que quieres grabar y pulsas en un TButton que tengas con este codigo

Image1.Canvas.CopyRect(Image1.ClientRect,Self.Canvas,Panel1.ClientRect);

luego, no te queda mas que salvar la imagen que me temo tendra que ser en bmp y luego tendras que convertirla a jpg

chrisredfield
29-06-2003, 16:37:17
Lo he probado, pero aparece todo en negro.
Es decir, lo que captura del tpanel y copio en el timage
es una imagen en negro.
¿donde estara el frame?

madriles
30-06-2003, 10:13:27
he estado haciendo la prueba y funciona correctamente, pero tienes que tener en cuenta que lo que copias a TImage no es el contenido del TPanel sino del form, fijate que pone Self.Canvas, por tanto, aunque el clientrect sea el del panel realmente se refiere al formulario de hay que te indique que debe estar en left y top a 0 para evitar las distorsiones. en definitiva es copiar cualquier zona del formulario en la imagen.
de todas formas si sigue sin funcionarte y no sabes a que es debido dimelo y te envio por e-mail un ejemplo.
un saludo

chrisredfield
30-06-2003, 14:38:35
Vaya, es curioso. Haré mas pruebas esta noche. Ya te comentare algo. Gracias.

chrisredfield
30-06-2003, 14:43:24
Lo he probado ahora en un form nuevo y funciona.
Como lo puse en el programa completo tendria algo por ahi que falla.
Ahora en un programa limpio, funciona!!!.
Gracias.

chrisredfield
01-07-2003, 11:05:25
Bueno, eso creo.
Resulta que en casa, lo probe con el Delphi7 y no funciona.
El mismito programa con el Delphi5 si que funciona.
¿Por que sera?.
¿El mediaplayer del delphi7 no manda la imagen
al canvas del form?.
En fin. Tendre que hacerlo con el 5.
La verdad es que es curioso. Si alguien sabe porque, que hable ahora o calle para siempre. Jeje

chrisredfield
01-07-2003, 11:11:45
Bueno, parece ser que el delphi7 no es.
He probado con el Delphi7 y tambien funciona. Pero en el pc de mi casa no. Lo unico que se me ocurre es la version del directx y/o el windows medialplayer
Donde funciona tengo instalada las directx 8.1 y el mediaplayer 8.00.00.44.77. Esta noche mirare las versiones del ordenador donde no funciona. ¿que otra cosa podria ser?.

madriles
01-07-2003, 13:40:34
me temo que en este tema estoy bastante "pez", pero por logica no debe ser el mediaplayer ni posiblemente el directX.
estamos tratando simplemente con el canvas, y por tanto lo que con el se relacione. si yo copio un trozo de la pantalla, me da lo mismo que venga de un mediaplayer un image o simplemente que tengas tbutton en la zona a copiar, simplemente copia lo que ve.
de todo esto deduzco que al pasar de un ordenador a otro las versiones de Graphics que aparecen en el uses, encuentran algun conflicto.
en teoria :D un ejecutable deberia funcionar sin mas. comprueba pues pasando solo el ejecutable a los ordenadores que tengas y mira a ver si funciona.
lo lamento pero no se me ocurre otra cosa, a ver si los compañeros pueden hecharte una mano

chrisredfield
01-07-2003, 22:05:18
He ejecutado el programa ya compilado en mi casa y no funciona.
Asi, que el delphi no tiene nada que ver.
Supongo que sera la tarjeta, los drivers, vete tu a saber.
En casa, tengo las directx9 y el windows mediaplayer 9.
Bueno, si lo consigo ya te lo hare saber. Gracias...

chrisredfield
03-07-2003, 00:31:34
Al menos ya he encontrado la causa. ¡¡¡Los drivers de la tarjeta!!.
Iguale el directx y el mediaplayer y seguia fallando, luego solo quedaban los drivers. Arranque el xp con una vga normal, y voala!!!, funciona.
El problema es a ver como explicao todo esto a los de nvidia.
En fin, creo que tendre que arrancar en modo vga normal para generar los thumbnails.
El caso es que estoy haciendo un programa para ordenar y catalogar videos, generando una serie de thumbnails por clip.
El Acdsee solo genera el primer fotograma del video, que sirve de poco.
En mi programa, seleccionas un directorio, y te genera varios thumbnails (configurables) por cada uno de los videos.
Luego tengo pensado en hacer un browser de los directorios catalogados. Si la cosa queda bien, tengo pensado colgarlo todo en esta web para que entre todos lo mejoremos.
Pero eso si....no funciona con gforce ti 4200. :(
Bueno.....por ahora....

ingel
20-09-2011, 15:18:35
Hola.. no se si activar un hilo tan antiguo sera correcto , pero es justamente el problema que tengo .. puntualmente tengo un video reproduciendose en el tmediaplayer que esta contenido en un panel (mas pequeño que el form principal) y coloque un Timage DENTRO del panel( panel4 ) con el mismo tamaño y la propiedad Stretch en true y autosize en false..
La captura la realiza pero me toma la imagen desde la coord 0,0 del FORM1 y no del panel4 que es donde esta el video..
He aqui el codigo



IF Opendialog1.execute then begin
Mediaplayer1.filename:= opendialog1.filename;
Mediaplayer1.Open;
Mediaplayer1.Display:= panel4;
Image1.Height:=Panel4.Height;
Image1.Width:=Panel4.Width;
MediaPlayer1.DisplayRect := Rect(0, 0, panel4.Width, panel4.Height);
Mediaplayer1.Play

Image1.Canvas.CopyRect(Image1.ClientRect,Self.Canvas,Panel4.ClientRect);
Image1.Picture.SaveToFile('d:\temp\foto.jpg');

end;


Gracias y sds

beginner01
20-09-2011, 20:52:21
Saludos.

Prueba este código que encontré en la página de Experts Exchange, a ver si es lo que nesesitas


//uses Jpeg;
procedure TForm1.Capturar;
var
BMP : TBitmap;
ADC : HDC;
GetPoint : TPoint;
MyJpeg: TJpegImage;
begin
BMP := TBitmap.Create;
BMP.Height := Panel1.Height;
BMP.Width := Panel1.Width; // it is also the size of Panel1
MediaPlayer1.TimeFormat := tfFrames;
//MediaPlayer1.Display := Panel1;
GetPoint := Panel1.ClientToScreen(Point(0,0));
ADC := GetDC(0);
//MediaPlayer1.Position := FrameNumberToCapture;
Application.ProcessMessages;
Bitblt(BMP.Canvas.Handle, 0,0,
BMP.Width,BMP.Height,
ADC, GetPoint.X, GetPoint.Y, SRCCOPY);

MyJpeg:= TJpegImage.Create;
MyJpeg.Assign(BMP);
MyJpeg.SaveToFile('D:\Temp\Captura.JPG');
end;

Cambia Panel1 por el que usas para visualizar el video.