Hi Leigh - I'm not sure at this point.

I've found some code that will let me provide a memory stream for the TMediaPlayer - I had to go in and change a couple of lines of code in MPlayer unit though. I also have to be careful how it's encoded. The media player control seems a little flaky to me - it doesn't seem to handle a lot of AVIs that the Microsoft Media Player program plays.

I've also got some code that let's me play it without the TMediaPlayer (basically just uses the same mci commands) so I may end up using that - haven't decided yet.

Anyway, There is a control here:
http://www.wilsonc.demon.co.uk/misccomponents.htm

called TMediaPlayerMemoryFile which works when you change the lines in TMedia Player. All I changed in MPlayer were the lines in the TMediaPlayer.Open method, starting line 844:

changed:

 if FDeviceType <> dtAutoSelect then
   FFlags := FFlags or mci_Open_Type;

 if FDeviceType <> dtAutoSelect then
   FFlags := FFlags or mci_Open_Type
 else
   FFlags := FFlags or MCI_OPEN_ELEMENT;

which seems to be a bug to me (doing the same thing twice).
Change to this:

 if FDeviceType <> dtAutoSelect then
   FFlags := FFlags or mci_Open_Type;

 if FElementName <> '' then
   FFlags := FFlags or MCI_OPEN_ELEMENT;

It doesn't work if you don't have the MCI_OPEN_ELEMENT flag set.
There are no instructions included in the TMediaPlayerMemoryFile component so here they are:
1. MediaPlayerMemoryFile.FileName := 'TEST.XXX', where 'XXX' is some
unregistered file type
2.MediaPlayer.FileName := MediaPlayerMemoryFile.FileName + '+';
The 'plus' sign tells the MM IO subsystem to get the data from the hooked IO
proc.
3.MediaPlayer.DeviceType := dtAVIVideo; for .avi or
  MediaPlayer.DeviceType := dtWaveAudio; for  .wav.

and then call MediaPlayer.Open, and MediaPlayer.Play.

The stand-alone code I found is here (provided by Nils Haeck on a NLDelphi forum):
-----------------------------------------------------------------------------
unit Unit1;
{
 This demo shows how to play AVI video from memory using
 the mciSendCommand and mmio functions

 Date: 17 Oct 2003

 (c) Nils Haeck www.simdesign.nl

}

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, MMSystem, ExtCtrls;

type
 TForm1 = class(TForm)
   edFilename: TEdit;
   Label1: TLabel;
   btnPick: TButton;
   btnOpen: TButton;
   btnPlay: TButton;
   lbDeviceID: TLabel;
   Panel1: TPanel;
   procedure btnPickClick(Sender: TObject);
   procedure btnOpenClick(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure btnPlayClick(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   FIsOpened: boolean;
   FDeviceID: Word;
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

// Global memory pointer - for now
var
 FMem: pointer = nil;
 FSize: integer = 0;
 FOpened: boolean = False;
const
FFourCC = 'IOCB'; // acronym for IO CallBack (but it really does not matter - choose as you wish)

function MyIOCallback(lpmmioinfo: PChar; uMessage: UINT; lParam1, lParam2: LPARAM): Longint stdcall; // This function is called and will provide access to the file. The MM system "thinks"
// this is a file, while we use the global memory stream.
var
 AInfo: pmmioInfo;
begin
 AInfo := pmmioInfo(lpmmioinfo);
 case uMessage of
 MMIOM_OPEN:
   // Open the "file"
   begin
     if FOpened then begin
       Result := 0;
       exit;
     end;
     FOpened := True;
     AInfo.lDiskOffset := 0;
     Result := 0;
   end;
 MMIOM_CLOSE:
   // Close the "file"
   Result := 0;
 MMIOM_READ:
   // Read data from the "file"
   begin
     // Copy from memory - no checking
Move(pointer(integer(FMem) + AInfo.lDiskOffset)^, pointer(lParam1)^, lParam2);
     AInfo.lDiskOffset := AInfo.lDiskOffset + lParam2;
     Result := lParam2;
   end;
 MMIOM_SEEK:
   // Seek new position in the "file"
   begin
     case lParam2 of
     // From beginning:
     0: AInfo.lDiskOffset := lParam1;
     // From current:
     1: AInfo.lDiskOffset := AInfo.lDiskOffset + lParam1;
     // From end:
     2: AInfo.lDiskOffset := FSize - 1 - lParam1;
     end;
     Result := AInfo.lDiskOffset;
   end;
 else
// Unexpected msgs. For instance, we do not process MMIOM_WRITE in this sample
   Result := -1;
 end;
end;
---------------------------------------------------------------------
You will have to recreate the form, but that's pretty straight forward.

That's about as far as I have got yet - more urgent things have taken over for now.

Phil.

Leigh Wanstead wrote:
Hi Phil,
How is going for this issue? Regards
Leigh
www.smootharm.com <http://www.smootharm.com>

    -----Original Message-----
    *From:* [EMAIL PROTECTED]
    [mailto:[EMAIL PROTECTED] Behalf Of *Phil Middlemiss
    *Sent:* Wednesday, 17 May 2006 5:19 p.m.
    *To:* NZ Borland Developers Group - Delphi List
    *Subject:* Re: [DUG] Play a movie from a stream

    OK, had a closer look at it and I can see how it is supposed to
    work (kind of). But I can't get it to work. It's supposed to
    somehow work with the standard TMediaPlayer. However, the main
    technique it uses (using mmioInstallIOProc) is applicable and I've
    found some sample code that I can use instead hopefully.

    If I get it working, I'll post the working code to the list.

    Cheers,
    Phil.

    Ben Taylor wrote:
    well, from the 2sec i spent looking at it, it installs a custom io-handler 
to the
    mediaplayer, then implements the iorequests using a memorystream.. there's
    definately no file-based activity there. yes, you need to set a filename in 
the
    mediaplayer, but thats only used to identify which named-memorystream to 
use as a
    datasource..

    hth,
    b

    --- Phil Middlemiss <[EMAIL PROTECTED]> wrote:


    ---------------------------------
      Hi Ben,

    yes, found that before too. Works by writing to a temporary file as faras I 
can tell
    by looking at the source code. As I said, I spent half aday scouring the 
internet.

    Has no one done this before?

    Phil.

Ben Taylor wrote: 1min on google found this:
    http://www.wilsonc.demon.co.uk/misccomponents.htm"TMediaPlayerMemoryFile 
allows you
to play wave and AVI memory images using theregular Delphi TMediaPlayer component. You can create the memory images on-the-flyor load them from resources."looks like a
    nice workaround to the mediaplayer limitation..no idea if it works.. --- 
Phil
Middlemiss <[EMAIL PROTECTED]> wrote: I need to play a video clip (with audio) from a memory stream instead of Send instant messages to your online friends http://au.messenger.yahoo.com
    _______________________________________________Delphi mailing
[EMAIL PROTECTED]://ns3.123.co.nz/mailman/listinfo/delphi
    begin:vcard
    fn:Phil Middlemiss
    n:Middlemiss;Phil
    org:Vision Software, MTS Ltd
    email;internet:[EMAIL PROTECTED]
    title:Project Leader
    tel;work:+64 7 3480001
    tel;cell:+64 27 4592648
    x-mozilla-html:TRUE
    url:http://www.tumonz.co.nz
    version:2.1
    end:vcard

    _______________________________________________
    Delphi mailing list
    Delphi@ns3.123.co.nz
    http://ns3.123.co.nz/mailman/listinfo/delphi



Send instant messages to your online friends http://au.messenger.yahoo.com _______________________________________________
    Delphi mailing list
    Delphi@ns3.123.co.nz
    http://ns3.123.co.nz/mailman/listinfo/delphi




------------------------------------------------------------------------

_______________________________________________
Delphi mailing list
Delphi@ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
begin:vcard
fn:Phil Middlemiss
n:Middlemiss;Phil
org:Vision Software, MTS Ltd
email;internet:[EMAIL PROTECTED]
title:Project Leader
tel;work:+64 7 3480001
tel;cell:+64 27 4592648
x-mozilla-html:TRUE
url:http://www.tumonz.co.nz
version:2.1
end:vcard

_______________________________________________
Delphi mailing list
Delphi@ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi

Reply via email to