Kann mir jemand helfen was von c++ hin zu PB zu übersetzen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Kann mir jemand helfen was von c++ hin zu PB zu übersetzen?

Beitrag von inc. »

Im forum.doom9.org wurde von tritical gezeigt, wie man

Es handelt sich um Avisynth. Avisynth ist ein Frameserver, welcher als avisynth.dll im sys32 Verzeichnis liegt. Erstellt man ein Textscript mit .avs als Endung, wird dieses Script als Avisynth Frameserverfile von mediaplayern erkannt und wiedergegeben. Innerhalb eines solches scriptes existiert am anfang eine Mediandatei-Import-Line und darauffolgende Filter calls.

Ich kann ein avs script via vfw API öffnen, wiedergeben oder Informationen beziehen.
Nun möchte ich aber nicht über vfw, sondern DIREKT die Avisynth.dll ansprechen und am Ende den Videoframe im Speicher an meine Applikation übergeben.

Hier deer Thread:
http://forum.doom9.org/showthread.php?t=103195

Hier ein c++ Beispiel, wie man einen Frame aus einem "Script.avs" via avisynth.dll und dessen API Befehl "Invoke("import"....)" herausfischt.

Code: Alles auswählen

int main(int argc, char* argv[])
{
  HINSTANCE hDLL;
  IScriptEnvironment* (__stdcall *CreateEnv)(int);
  IScriptEnvironment *env;
  PClip Video;
  PVideoFrame src;

  // load avisynth.dll
  hDLL = LoadLibrary("avisynth"); 
  if (!hDLL)
  {
    fprintf(stderr,"Couldn't load Avisynth.dll\n");
    exit(1);
  }

  // retrieve address of createscriptenvironment function
  CreateEnv = (IScriptEnvironment *(__stdcall *)(int))GetProcAddress(hDLL, 
                                 "CreateScriptEnvironment"); 
  if (!CreateEnv)
  {
    fprintf(stderr, "Couldn't access CreateScriptEnvironment\n");
    exit(1);
  }

  // create a new scriptenvironment
  env = CreateEnv(AVISYNTH_INTERFACE_VERSION);
  if (!env)
  {
    fprintf(stderr, "Couldn't create scriptenvironment\n");
    exit(1);
  }

  // load the script and add converttorgb24 if not already outputting rgb24
  AVSValue args[1] = { "script.avs" };
  try {
    Video = env->Invoke("Import",AVSValue(args,1)).AsClip();
    if (!Video->GetVideoInfo().IsRGB24())
    {
      AVSValue args_conv[1] = { Video };
      Video = env->Invoke("ConvertToRGB24", AVSValue(args_conv, 1)).AsClip();
    }
  }
  catch (AvisynthError e) {
    fprintf(stderr, "Error (Avisynth Error) loading avisynth script!\n");
    fprintf(stderr, "%s.\n", e.msg);
    delete env;
    exit(1);
  }
  catch (...) {
    fprintf(stderr, "Error (Unknown) loading avisynth script!\n");
    delete env;
    exit(1);
  }

  // request a frame
  src = Video->GetFrame(frameNum, env);
  
  // copy to output
  env->BitBlt(bufferVidOut, outPitch, src->GetReadPtr(), src->GetPitch(), 
    src->GetRowSize(), src->GetHeight());

  // request some audio samples (will be copied directly into output buffer)
  if (Video->GetVideoInfo().HasAudio())
    Video->GetAudio(bufferAudOut, SamplePos, SampleCount, env);

  // clean up and finish
  delete env;
  FreeLibrary(hDLL);
  exit(0);
}
Wie würde das in PB aussehen?
Mir ist klar, dass ich ebenso das "Avisynth.h" Headerfile in PB umschreiben müsste, was ich auch bereits angefangen habe, da es auch schon in delphi übersetzt wurde, demnach schonmal einen Hauch übersichtlicher.

Man könnte somit in PB dann auch Videofilter für Avisynth programmieren, was imho viele VideoAppl.-Entwickler auf die Seite von PB ziehen könnte ;)

Tausend Dank!
Inc.
Heinz Mendax
Beiträge: 50
Registriert: 29.03.2013 12:25
Wohnort: Eisenach

Re: Kann mir jemand helfen was von c++ hin zu PB zu übersetz

Beitrag von Heinz Mendax »

Hallo Inc.,
immer wieder gibt es Neulinge in der PB-Anwendung. Ich habe früher in Quickbasic 4.5 viel programmiert, meist mathematische Programme zur Lösung meiner Hobbyaktivitäten (Sonnenuhren, Farbenlehre, Optik). Danach war es VB6, der zunehmenden Verbreitung von Windows und der grafischen Oberfläche geschuldet. Es wurden vor allem Anwendungen, die VB6 zur Steuerung in Excel und in der
CNC-Messsoftware an der Arbeit benutzen, programmiert. Es war besonders interessant, die internen Befehle von Excel u.s.w von den bereitgestellten VB-Bibliotheken in eigenständige EXE-Dateien umzusetzen. Auf diese Art möchte ich weiter machen, nur das es jetzt PB sein soll (die Werbung dafür hat einiges bewirkt) und der Programmiergegenstand Stereo-AVI-dateien (Fuji W3) sein
sollen. Es geht dabei um die Entfernung des Verwackelns bei der Aufnahme (in 2 verbundenen Streams). Eine von verschiedenen Lösungen die es gibt, ist die Verwendung eines Deshakerfilters in Avisynthscripten in Verbindung mit Virtualdub. Dieser kann aber immer nur einen einzelnen Stream bearbeiten. Wenn man die Streams mittels Avisynth trennt und einzeln mit dem Deshaker bearbeitet
kann es sein, das er beide vollkommen verschieden bearbeitet, obwohl ja linke und rechte Aufnahmeoptik zusammenhängen. Der Deshaker hat aber die Option, das man die Relativbewegung in den Frames in eine lesbare Datei schreiben kann. Die Werte für x,y und Drehung des linken und rechten Avi-streams sollen in dem angestrebten Programm mathematisch bearbeitet (angeglichen und geglättet ) werden, dann rückwirkend mittels Deshaker und Avisynth auf die beiden Streams angewendet werden. Damit ist der Film dann entwackelt und kann wieder zum Stereofilm verbunden werden. Und nachdem Sie jetzt sicher ungeduldig werden, kommen Sie ins Spiel, ein deutschsprechender Fachmann für PB und Avisynthanwendung. Ich habe natürlich Ihre Umsetzung von Avisynth in PB gesehen und auch heruntergeladen. Die Verwendung der Avisynthinternas im PB-programm wäre praktisch das Gegebene.
Die Vorgehensweise wie in avisynth_get_video_info.pb nur mit anderen Avisynthbefehlen könnte ich mir vorstellen. Leider funktionieren die beiden Beispieldateien mit der heutigen PB-version(5.20) und Avisynth(2.58) nicht mehr fehlerlos. Als Anfänger bin ich aber nicht in der Lage zu entscheiden, ob beim zeilenweisen Ablauf der Fehler beispielsweise durch Entfernen oder Setzen eines ".l" oder "*" behoben
werden könnte. Das betrifft hauptsätzlich die avisynth.pbi. Eine fehlerfrei ablaufende avisynth.pbi wäre enorm wichtig, für Sie sicher eine Kleinigkeit. Bei der Datei avisynth_get_video_info ist es so, das die Ursprungsdaten des Films eingeblendet werden, dann aber des Programm abstürzt. (sicher wegen meiner falscher Änderungen an avisynth.pbi)
Bei diesem Beispiel wäre auch eine Erweiterung nützlich, wie aus dem veränderten Stream wieder eine AVI-datei wird, um die Bearbeitung z.B. in Virtualdub nachzuprüfen. Ich möchte Sie im Namen verzweifelter aber hoffnungsvoller PB- und Avisynthanwender bitten, ein dem aktuellen PB-stand entsprechendes Programmierbeispiel zu erstellen und zu veröffenlichen oder mir in der Ihnen
gebotenen Zeit weiterzuhelfen.

peter.hossfeld@online.de
Antworten