Hey Leute,
ich bin gerade dabei einen Reader für ASF Dateien zu schreiben. Dabei richte ich mich nach der Spezifikation von MS (zu finden hier: Download Details - Microsoft Download Center - ASF Specification).
Das ganze mache ich, um aus .wma Dateien die Musikinformationen herauszufiltern. Da WMA auf ASF basiert sollte das ja kein problem sein.
In dieser Spezifikation ist nun von Header-Objekten die rede. Diese "Objekte" (nicht die, wie man sie von Java her kennt!) beginnen ALLE mit einem Int128 der ihre GUID wiederspeigelt. In der Spezifikation steht auch, dass in jeder ASF-Datei diese 3 objekte eingebaut sind:
-File Properties Objekt
-Header Extensions Objekt
-Stream Properties Objekt
in belibiger reihenfoleg.
Die GUID des File Properties Objekts sollte laut MS [c]ASF_File_Properties_Object[/c] sein, dieser String geht aber über das erreichbare von 16 bytes hinaus.
Ich habe also mal alle GUIDs von allen Header-Objekten aus meiner Beispiel WMA ausgelesen. Aber egal, welches Objekt ich als [c]File Properties Objekt[/c] behandle, das [c]FileSize Field[/c] (das laust MS die größe der gesamten datei enthält) ist nichtmal annähernd an der tatsächlichen Dateigröße dran (4.98 MB).
Diese GUIDs sind in der WMA drin (übrigens auch in 2 anderen, die ich getestet habe):
Bie [c]525536[/c] und [c]392743[/c] ist das [c]FileSize Field[/c] in der gleichen stellenlänge wie die Dateigröße aus File.length();, aber nichtmal nahe dran.
Hier noch, wie ich die Int128 (und die anderen Zahlen) auslese:
Hat da jemand eine Idee was ich (oder MS) falsch mache? Wäre eine RIESEN hilfe! Danke im vorraus an alle die sich gedanken machen
.
EDIT: Ich hab mit dem Windows Media Player mal ne CD gerript. Im HEX-Editor sehen diese Dateien mal gaaanz anders aus
Aber immernoch finde ich das [c]FilePropertiesObject[/c] nicht. Es sind nochmal neue GUIDs dazugekommen, s.o.
ich bin gerade dabei einen Reader für ASF Dateien zu schreiben. Dabei richte ich mich nach der Spezifikation von MS (zu finden hier: Download Details - Microsoft Download Center - ASF Specification).
Das ganze mache ich, um aus .wma Dateien die Musikinformationen herauszufiltern. Da WMA auf ASF basiert sollte das ja kein problem sein.
In dieser Spezifikation ist nun von Header-Objekten die rede. Diese "Objekte" (nicht die, wie man sie von Java her kennt!) beginnen ALLE mit einem Int128 der ihre GUID wiederspeigelt. In der Spezifikation steht auch, dass in jeder ASF-Datei diese 3 objekte eingebaut sind:
-File Properties Objekt
-Header Extensions Objekt
-Stream Properties Objekt
in belibiger reihenfoleg.
Die GUID des File Properties Objekts sollte laut MS [c]ASF_File_Properties_Object[/c] sein, dieser String geht aber über das erreichbare von 16 bytes hinaus.
Ich habe also mal alle GUIDs von allen Header-Objekten aus meiner Beispiel WMA ausgelesen. Aber egal, welches Objekt ich als [c]File Properties Objekt[/c] behandle, das [c]FileSize Field[/c] (das laust MS die größe der gesamten datei enthält) ist nichtmal annähernd an der tatsächlichen Dateigröße dran (4.98 MB).
Diese GUIDs sind in der WMA drin (übrigens auch in 2 anderen, die ich getestet habe):
Code:
489602
525563
392743
165129
405255
317551
378757
neu:
450754
560005
342805
18 446 744 073 709 547 655
Bie [c]525536[/c] und [c]392743[/c] ist das [c]FileSize Field[/c] in der gleichen stellenlänge wie die Dateigröße aus File.length();, aber nichtmal nahe dran.
Hier noch, wie ich die Int128 (und die anderen Zahlen) auslese:
Java:
// Laut MS handelt es sich hierbei IMMER um little-endian und unsigned werte.
public static long read(int bits, int[] in) throws NumberFormatException {
if ((int) Math.floor(bits/8)!=bits/8) throw new NumberFormatException("Bitnumber must be a multiple of 8.");
long i=0;
for (int n=bits/8-1;n>0;n--) {
i+=in[n]*(256^n);
}
return i+in[0];
}
public static int readInt16(InputStream in) throws IOException {
int[] ar=new int[2];
ar[0]=in.read();
ar[1]=in.read();
return (int) read(16, ar);
}
public static long readInt32(InputStream in) throws IOException {
return (
readInt16(in)+
readInt16(in)*256
);
}
public static long readInt64(InputStream in) throws IOException {
return (
readInt32(in)+
readInt32(in)*256
);
}
public static long readInt128(InputStream in) throws IOException {
long i=0;
for (int n=15;n>0;n--) {
i+=in.read()*(256^n);
}
return i+in.read();
}
Hat da jemand eine Idee was ich (oder MS) falsch mache? Wäre eine RIESEN hilfe! Danke im vorraus an alle die sich gedanken machen
EDIT: Ich hab mit dem Windows Media Player mal ne CD gerript. Im HEX-Editor sehen diese Dateien mal gaaanz anders aus
Zuletzt bearbeitet: