AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi bbMPEG.DLL verwenden
Thema durchsuchen
Ansicht
Themen-Optionen

bbMPEG.DLL verwenden

Ein Thema von Garfield · begonnen am 4. Jul 2009 · letzter Beitrag vom 4. Jul 2009
Antwort Antwort
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#1

bbMPEG.DLL verwenden

  Alt 4. Jul 2009, 17:29
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.
Angehängte Dateien
Dateityp: 7z bbmpeg_383.7z (1,44 MB, 7x aufgerufen)
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: bbMPEG.DLL verwenden

  Alt 4. Jul 2009, 17:31
Lagere mal den Aufruf in einen eigene Thread aus. dann belibet deine GUI zumindest zugreifbar.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#3

Re: bbMPEG.DLL verwenden

  Alt 4. Jul 2009, 19:20
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.

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;
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#4

Re: bbMPEG.DLL verwenden

  Alt 4. Jul 2009, 20:02
function Thread(p: PThreadParams): Integer; Wie komme ich jetzt an das Result?

Jetzt war ich zu schnell mit dem Nachfragen:

GetExitCodeThread(hThread, Result);
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 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