![]() |
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:
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.
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. Weiß zufällig jemand, was da schief läuft? Im Anhang ist mein Projekt und die notwendigen Dateien. |
Re: bbMPEG.DLL verwenden
Lagere mal den Aufruf in einen eigene Thread aus. dann belibet deine GUI zumindest zugreifbar.
|
Re: bbMPEG.DLL verwenden
Zitat:
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; |
Re: bbMPEG.DLL verwenden
Delphi-Quellcode:
Wie komme ich jetzt an das Result?
function Thread(p: PThreadParams): Integer;
Jetzt war ich zu schnell mit dem Nachfragen:
Delphi-Quellcode:
GetExitCodeThread(hThread, Result);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz