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 <> '
OggS'
then
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.