Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
4.002 Beiträge
 
Delphi 12 Athens
 
#16

AW: ChatGPT - Wow! (Cron-Job)

  Alt 7. Jul 2024, 09:56
Und Claude Sonnet 3.5 kommt mit Deiner Frage wohl auch nicht sehr weit.
Das war auch auch ehrlicherweise nur das Standardmodell, weil ich noch keine Subscription habe.
Falls jemand vollenm Zugriff darauf hat, dann würde mich das Ergebnis auch interessieren.
Bisher ist ChatGPT 4o jedenfalls der klare Gewinner, aus meiner Sicht.

Delphi-Quellcode:
function GetMaxGranulePosition(const FileName: string): Int64;
var
  FileStream: TFileStream;
  Buffer: array[0..27] of Byte;
  PageHeader: array[0..3] of AnsiChar;
  GranulePosition: Int64;
  MaxGranulePosition: Int64;
begin
  MaxGranulePosition := 0;
  FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    while FileStream.Position < FileStream.Size do
    begin
      FileStream.ReadBuffer(PageHeader, 4);
      if PageHeader <> 'OggSthen
        raise Exception.Create('Ungültiges Ogg-Dateiformat');

      FileStream.ReadBuffer(Buffer, SizeOf(Buffer));
      GranulePosition := PInt64(@Buffer[6])^;

      if GranulePosition > MaxGranulePosition then
        MaxGranulePosition := GranulePosition;

      // Zum nächsten Ogg-Page springen
      FileStream.Seek(PCardinal(@Buffer[22])^ + 27, soFromCurrent);
    end;
  finally
    FileStream.Free;
  end;
  Result := MaxGranulePosition;
end;
Interessehalber habe ich den Prompt auch nochmal hier eingegeben, bei ChatGPT, dann kommt das raus.
Ähnlich, aber nicht exakt gleich. Kannst Du ja mal vergleichen, sieht jedenfalls deutlich strukturierter aus als alles andere.


Hier ist eine Delphi-Funktion, die die maximale absolute Granule-Position aus einer gegebenen Ogg-Datei extrahiert:
Delphi-Quellcode:
unit OggGranuleExtractor;

interface

uses
  Classes, SysUtils;

function GetMaxGranulePosition(const FileName: string): Int64;

implementation

type
  TOggPageHeader = packed record
    CapturePattern: array[0..3] of AnsiChar; // "OggS"
    Version: Byte;
    HeaderType: Byte;
    GranulePosition: Int64;
    BitstreamSerialNumber: Cardinal;
    PageSequenceNumber: Cardinal;
    Checksum: Cardinal;
    PageSegments: Byte;
  end;

function ReadOggPageHeader(Stream: TStream; out Header: TOggPageHeader): Boolean;
begin
  Result := Stream.Read(Header, SizeOf(TOggPageHeader)) = SizeOf(TOggPageHeader);
  if Result then
  begin
    Result := Header.CapturePattern = 'OggS';
    if not Result then
      Stream.Seek(-SizeOf(TOggPageHeader) + 1, soCurrent); // Synchronize to the next potential page start
  end;
end;

function GetMaxGranulePosition(const FileName: string): Int64;
var
  FileStream: TFileStream;
  OggHeader: TOggPageHeader;
  MaxGranulePos: Int64;
begin
  Result := -1;
  MaxGranulePos := -1;

  try
    FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    try
      while FileStream.Position < FileStream.Size do
      begin
        if ReadOggPageHeader(FileStream, OggHeader) then
        begin
          if OggHeader.GranulePosition > MaxGranulePos then
            MaxGranulePos := OggHeader.GranulePosition;

          // Skip page segments
          FileStream.Seek(OggHeader.PageSegments, soCurrent);
        end
        else
          Break; // No more valid headers
      end;
      Result := MaxGranulePos;
    finally
      FileStream.Free;
    end;
  except
    on E: Exception do
      Writeln('Error: ', E.Message);
  end;
end;

end.
Erklärung der Funktion:

TOggPageHeader: Eine Struktur, die den Header eines Ogg-Pakets repräsentiert.
ReadOggPageHeader: Eine Hilfsfunktion, die einen Ogg-Page-Header aus einem Stream liest und überprüft, ob das Capture-Muster ("OggS") korrekt ist.
GetMaxGranulePosition: Die Hauptfunktion, die die Ogg-Datei öffnet, durch die Pakete iteriert und die maximale Granule-Position ermittelt.

Schritte zur Verwendung:

Speichere den obigen Code in eine Delphi-Unit, z.B. OggGranuleExtractor.pas.
Verwende die GetMaxGranulePosition-Funktion, um die maximale absolute Granule-Position einer Ogg-Datei zu ermitteln:



Delphi-Quellcode:
uses
  OggGranuleExtractor, SysUtils;

var
  MaxGranulePos: Int64;
begin
  try
    MaxGranulePos := GetMaxGranulePosition('path_to_your_ogg_file.ogg');
    Writeln('Maximale Granule-Position: ', MaxGranulePos);
  except
    on E: Exception do
      Writeln('Fehler: ', E.Message);
  end;
end.
  Mit Zitat antworten Zitat