Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi bbMPEG.DLL verwenden (https://www.delphipraxis.net/136631-bbmpeg-dll-verwenden.html)

Garfield 4. Jul 2009 16:29


bbMPEG.DLL verwenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich möchte die bbMPEG.DLL zum Muxen benutzen. Die für DVD2SVCD modifizierte Version kann zwar einfach mit der RunbbMPEG.exe benutzt werden, aber es wäre schön ohne RunbbMPEG.exe. Aus dem Sample aus dem Source von bbMPEG habe ich mir diese Unit erstellt.

Delphi-Quellcode:
unit Unit2;

interface

uses
  Forms, Windows;

type
  TbbMPEG = class
  const
    szbbMPEGDLL     = 'bbMPEG.dll';    // Name der Biblothek
    szbbMPEGInit    = 'bbMPEGInit';    // bbMPEG initialisieren
    szbbMPEGAppWnd  = 'bbMPEGAppWnd';  // Handle des ParentWindow
    szbbMPEGMakeMPEG = 'bbMPEGMakeMPEG'; // bbMPEG ausführen
    szbbMPEGShutdown = 'bbMPEGShutdown'; // bbMPEG deinitialisieren
    szbbMPEGSetFocus = 'bbMPEGSetFocus';
  type
    TmakeMPEGRecInfo = Record
      doVideo       : Byte;       // if non-zero, video encoding is performed
      width         : Cardinal;   // video width, if not even the last column is ignored
      height        : Cardinal;   // video height, if not even the last row is ignored
      startFrame    : Cardinal;   // first video frame number
      endFrame      : Cardinal;   // last video frame number
      startSample   : Cardinal;   // first audio sample
      endSample     : Cardinal;   // last audio sample
      doAudio       : Byte;       // if non-zero, audio encoding is performed
      audioRate     : Cardinal;   // audio sample rate, only 32000, 44100 and 48000 allowed
      stereo        : Byte;       // non-zero indicates stereo samples
      sampleSize    : Cardinal;   // size in bits of samples, must be 16
      outputFilename : PChar;      // pointer to a NULL terminated output filename
      getVideo      : Pointer; {bbGetVideo;}  // pointer to a get audio callback function
      getAudio      : Pointer; {bbGetAudio;}  // pointer to a get video callback function
    end;
    PmakeMPEGRecInfo = ^TmakeMPEGRecInfo;
  type
    TFNbbMPEGInit    = function : Integer; cdecl {$IFDEF WIN32} stdcall {$ENDIF};
    TFNbbMPEGMakeMPEG = function (makeInfo: PmakeMPEGRecInfo): Integer; cdecl {$IFDEF WIN32} stdcall {$ENDIF};
    TFNbbMPEGAppWnd  = procedure (AppWnd: HWND); cdecl {$IFDEF WIN32} stdcall {$ENDIF};
    TFNbbMPEGShutdown = procedure cdecl; {$IFDEF WIN32} stdcall {$ENDIF};
    TFNbbMPEGSetFocus = procedure cdecl; {$IFDEF WIN32} stdcall {$ENDIF};
  private
    fbbMPEGLib      : THandle;
    fbbMPEGInit     : TFNbbMPEGInit;
    fbbMPEGMakeMPEG : TFNbbMPEGMakeMPEG;
    fbbMPEGAppWnd   : TFNbbMPEGAppWnd;
    fbbMPEGShutdown : TFNbbMPEGShutdown;
    fbbMPEGSetFocus : TFNbbMPEGSetFocus;
    fOutputFilename : String;
    function GetEntryPoints : boolean;
  public
    constructor Create;
    destructor Destroy; override;
    function   Execute: Integer;
  published
    property outputFilename: String write fOutputFilename;
  end;

implementation

function TbbMPEG.GetEntryPoints: boolean;
begin
  @fbbMPEGInit    := NIL;
  @fbbMPEGMakeMPEG := NIL;
  @fbbMPEGShutdown := NIL;
  @fbbMPEGSetFocus := NIL;

  fbbMPEGLib := LoadLibrary(@szbbMPEGDLL[1]);
  Result    := (fbbMPEGLib <> INVALID_HANDLE_VALUE) and (fbbMPEGLib <> 0);

  if Result
  then begin
    @fbbMPEGInit    := GetProcAddress(fbbMPEGLib, @szbbMPEGInit[1]);
    if not Assigned(fbbMPEGInit) then Result := False;

    @fbbMPEGMakeMPEG := GetProcAddress(fbbMPEGLib, @szbbMPEGMakeMPEG[1]);
    if not Assigned(fbbMPEGMakeMPEG) then Result := False;

    @fbbMPEGAppWnd := GetProcAddress(fbbMPEGLib, @szbbMPEGAppWnd[1]);
    if not Assigned(fbbMPEGAppWnd) then Result := False;

    @fbbMPEGShutdown := GetProcAddress(fbbMPEGLib, @szbbMPEGShutdown[1]);
    if not Assigned(fbbMPEGShutdown) then Result := False;

    @fbbMPEGSetFocus := GetProcAddress(fbbMPEGLib, @szbbMPEGSetFocus[1]);
    if not Assigned(fbbMPEGSetFocus) then Result := False;
  end;
end;

constructor TbbMPEG.Create;
begin
  inherited Create;
end;

destructor TbbMPEG.Destroy;
begin
  if Assigned(fbbMPEGShutdown) then fbbMPEGShutdown; // call bbMPEG's shutdown routine
  if (fbbMPEGLib <> INVALID_HANDLE_VALUE) and (fbbMPEGLib <> 0) then FreeLibrary(fbbMPEGLib);
  inherited;
end;

function TbbMPEG.Execute: Integer;
var
  makeMPEGInfo : TmakeMPEGRecInfo;
begin
  Result := -1;
  FillChar(makeMPEGInfo, SizeOf(makeMPEGInfo), 0); // zero the buffer

  if GetEntryPoints
  and (fbbMPEGInit = 0)
  then begin
    fbbMPEGSetFocus; // does not need to be called, just there if needed

    makeMPEGInfo.outputFilename := PChar(fOutputFilename); // output MPEG filename

    Result := fbbMPEGMakeMPEG(@makeMPEGInfo);  // call the makeMPEG routine to create an MPEG
  end;
end;

end.
Die modifizierte Version von bbPEG.dll macht fast alles, was sie soll. Nur nach dem Muxen kann weder auf meine GUI noch auf das Fenster von bbMPEG zugegriffen werden. Das heißt, beim Aufruf von fbbMPEGMakeMPEG hängt etwas. Bei der originalen bbMPEG.dll ist es ähnlich, jedoch werden dort noch nicht einmal die Quelldateien aus der ini gelesen.

Weiß zufällig jemand, was da schief läuft?

Im Anhang ist mein Projekt und die notwendigen Dateien.

mkinzler 4. Jul 2009 16:31

Re: bbMPEG.DLL verwenden
 
Lagere mal den Aufruf in einen eigene Thread aus. dann belibet deine GUI zumindest zugreifbar.

Garfield 4. Jul 2009 18:20

Re: bbMPEG.DLL verwenden
 
Zitat:

Zitat von mkinzler
Lagere mal den Aufruf in einen eigene Thread aus. dann belibet deine GUI zumindest zugreifbar.

Nicht nur das, es ist sogar die Lösung für das Problem mit der modifizierten Version von bbMPEG. Vielen dank. :thumb:

Mit Threads habe ich bisher nur wenig zu tun gehabt. Ich hoffe, das sieht jetzt nicht ganz so stümperhaft aus:

Delphi-Quellcode:
function TbbMPEG.Execute: Integer;
type
  TThreadParams = record
    fbbMPEGMakeMPEG : TFNbbMPEGMakeMPEG;
    fOutputFile    : String;
  end;
  PThreadParams = ^TThreadParams;
var
  ThreadParams: PThreadParams;
  hThread : THandle;
  ThreadID : Cardinal;
  wf      : DWORD;

  function Thread(p: PThreadParams): Integer;
  var
    makeMPEGInfo : TmakeMPEGRecInfo;
  begin
    FillChar(makeMPEGInfo, SizeOf(makeMPEGInfo), 0);                    // zero the buffer
    makeMPEGInfo.outputFilename := PChar(PThreadParams(P)^.fOutputFile); // output MPEG filename
    Result := PThreadParams(P)^.fbbMPEGMakeMPEG(@makeMPEGInfo);         // call the makeMPEG routine to create an MPEG
    FreeMem(p, sizeof(TThreadParams));
  end;

begin
  Result := -1;

  if GetEntryPoints
  and (fbbMPEGInit = 0)
  then begin
    fbbMPEGSetFocus; // does not need to be called, just there if needed

    GetMem(ThreadParams, sizeof(TThreadParams));
    ThreadParams.fOutputFile    := fOutputFilename;
    ThreadParams.fbbMPEGMakeMPEG := fbbMPEGMakeMPEG;
    hThread := BeginThread(nil, 0, @Thread, ThreadParams, 0, ThreadID);
    if hThread <> INVALID_HANDLE_VALUE
    then begin
      while WaitForSingleObject(hThread, 1000) = WAIT_TIMEOUT
      do Application.ProcessMessages;
      WaitForSingleObject(hThread, INFINITE);
    end;
  end;
end;

Garfield 4. Jul 2009 19:02

Re: bbMPEG.DLL verwenden
 
Delphi-Quellcode:
function Thread(p: PThreadParams): Integer;
Wie komme ich jetzt an das Result?

Jetzt war ich zu schnell mit dem Nachfragen:

Delphi-Quellcode:
GetExitCodeThread(hThread, Result);


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz