Mathe

16/12/2011 - 07:41 von Hermie | Report spam
Ich bràuchte bitte Hilfe bei Mathe in VB6.

Ich habe eine Audiodatei über einen Codec komprimiert.
320 unkomprimierte Bytes werden dabei zu 62 Bytes in komprimierter Form.
Man kann die Audiodatei damit also 5x so klein machen.

Nun möchte ich einen Teil der Audiodatei auslesen, bzw. zurückkomprimieren.
Ich weiß z. B., dass ich (in unkomprimierter Form) von Byte-Position 50
ab 1000 Bytes lesen möchte.

Ein für mich großes Mathe-Problem ist die Tatsache, dass der Codec in
"Frames" komprimiert. Das heißt, wenn man etwas de-coden möchte, muss
man immer die 62-Bytes-Regel einhalten.

Wenn ich also (unkomprimiert) ab Byte-Position 50 1000 Bytes lesen
möchte, müsste ich Frame 1 (Byte 1 bis Byte 62), Frame 2 (Byte 63 bis
125), Frame 3 (Byte 126 bis 186) und Frame 4 (187 bis 248) lesen, damit
hàtte ich dann in Byte 1 bis 1280 des unkomprimierten Audiofiles.

Diese 4 Frames würde ich dann decoden und dann diejenigen Bytes
(Position 50 bis 1050) nehmen.

Ich komm mit der Mathegeschichte dahinter nicht klar, wenn ich das in
eine Formel packen soll.

Erbarmt sich jemand, mir dabei zu helfen?

Viele Grüße,
Hermann
 

Lesen sie die antworten

#1 Christian Zimmermann
16/12/2011 - 11:04 | Warnen spam
Hallo Hermann,




Am 16.12.2011 07:41, schrieb Hermie:
Ich bràuchte bitte Hilfe bei Mathe in VB6.

Ich habe eine Audiodatei über einen Codec komprimiert.
320 unkomprimierte Bytes werden dabei zu 62 Bytes in komprimierter Form.
Man kann die Audiodatei damit also 5x so klein machen.



zuersteinmal ist die Mathematik eine "genaue Wissenschaft", d. h. die
komprimierte Audioausgabe ist nicht 5x kleiner, sondern ca. 5x (320/62)
kleiner ;-)

Nun möchte ich einen Teil der Audiodatei auslesen, bzw. zurückkomprimieren.
Ich weiß z. B., dass ich (in unkomprimierter Form) von Byte-Position 50
ab 1000 Bytes lesen möchte.

Ein für mich großes Mathe-Problem ist die Tatsache, dass der Codec in
"Frames" komprimiert. Das heißt, wenn man etwas de-coden möchte, muss
man immer die 62-Bytes-Regel einhalten.

Wenn ich also (unkomprimiert) ab Byte-Position 50 1000 Bytes lesen
möchte, müsste ich Frame 1 (Byte 1 bis Byte 62), Frame 2 (Byte 63 bis
125), Frame 3 (Byte 126 bis 186) und Frame 4 (187 bis 248) lesen, damit
hàtte ich dann in Byte 1 bis 1280 des unkomprimierten Audiofiles.

Diese 4 Frames würde ich dann decoden und dann diejenigen Bytes
(Position 50 bis 1050) nehmen.

Ich komm mit der Mathegeschichte dahinter nicht klar, wenn ich das in
eine Formel packen soll.



Ich vermute mal, du möchtest den Start- und den Endframe resp. die
Positionen des ersten und letzten Bytes in der komprimierten Bytefolge
berechnen, den du zur Gewinnung der unkomprimierten Audiodaten
benötigst. Die Berechnung lautet folgendermassen:

Gegeben: Byte-Startposition unkomprimiert (StUn)
Lànge in Bytes der Sequenz unkomprimiert (LUn)

Startframe:
StartFrame = (StUn \ 320) + 1

Endframe:
EndFrame = ((StUn + LUn) \ 320) + 1

Jetzt liest du die 62-Byte-Pakete aus der Bytefolge der unkomprimierten
Audiodaten aus und dekomprimierst sie zu den entsprechenden
320-Byte-Paketen. Davon liest du dann die Bytesequenz der Lànge LUn ab
der Position StUn aus.

Die Anfangsposition im ersten Frame bzw. die Endposition im letzten
Frame kannst du mit dem Modulo-Operator berechnen.

a = StUn Mod 320
If a = 0 Then a = 320

e = StUn + LUn - 1 Mod 320
If e = 0 Then e = 320

Bei deinem Bsp. wàren es demnach die 271 letzten Bytes (Byte 50 bis 320)
aus dem ersten Frame (1) und die 89 ersten Bytes aus dem letzten Frame
(4): 271 + 320 + 320 + 89 = 1000

In etwa so:

' Code Beginn
Private Sub AudioSequenzUnKomp(ByVal StUn As Long, _
ByVal LUn As Long, _
ByRef ASU() As Byte)
Dim i As Long, j As Long, audiofile As Long
Dim a As Long, z As Long
Dim startframe As Long, endframe As Long
Dim AudioKomp(1 To 62) As Byte
Dim AudioUnKomp(1 To 320) As Byte

startframe = (StUn \ 320) + 1
endframe = ((StUn + LUn) \ 320) + 1

ReDim ASU(1 To LUn)
audiofile = FreeFile
Open "D:\Audiofile.afi" For Binary As #audiofile Len = 62
z = 0
For i = startframe To endframe
Get #audiofile, i, AudioKomp()
DeComp AudioKomp(), AudioUnKomp()
' Im ersten und letzten Frame werden
' evt. nicht alle Bytes benötigt
If i = startframe Then
a = StUn Mod 320
If a = 0 Then a = 320
For j = a To 320
z = z + 1
ASU(z) = AudioUnKomp(j)
Next j
ElseIf i = endframe Then
e = StUn + LUn - 1 Mod 320
If e = 0 Then e = 320
For j = 1 To e
z = z + 1
ASU(z) = AudioUnKomp(j)
Next j
Else
For j = 1 To 320
z = z + 1
ASU(z) = AudioUnKomp(j)
Next j
End If
Next i
Close audiofile
End Sub
' Code Ende

Im Array ASU(1 To LUn) stehen nun die unkomprimierten Audiodaten der
Lànge LUn.

Gruß

Christian

Ähnliche fragen