German B4A: Große Datei mit 16bit Werten einlesen

Midimaster

Active Member
Licensed User
Zunächst vorne weg, ich bin B4A-Anfänger, aber auf Windows ziemlich erfahren.

Ich muss eine große Datei (70MB) öffnen und die Werte darin in ein ARRAY einlesen. Dort werden sie dann laufen und in Echtzeit weiter verarbeitet. Nun bin ich sehr überrascht, dass es in B4A scheinbar keine Möglichkeit gibt die signed-16bit-Werte direkt auch als SHORTs aus der Datei zu holen. Immer lese ich nur von Byte-Streams.

Meine Vorgehensweise am PC ist so:
  1. FileStream öffnen
  2. ReadShort und FileSeek um durch den FileStream zu navigieren
  3. Die mit ReadShort gelesenen Werte in das mehrdimensionale ShortArray eintragen
  4. Am Ende FileStream wieder schließen.
Kann ich das so auch nicht auf eine Android-App übertragen? Ich habe inzwischen die Library RandomAccessFile() gefunden. Die aber funktioniert nicht bei File.DirAssets Dateien.

Wer kann mir hier erste Tipps oder Hinweise auf Tutorials geben? Wer hat schon mal was ähnliches gemacht?
 

DonManfred

Expert
Licensed User
Longtime User
Die aber funktioniert nicht bei File.DirAssets Dateien.
Kopiere die Datei zunächst nach File.DirInternal und benutze sie dann von da aus. RAF funktioniert dann auch.
 

Midimaster

Active Member
Licensed User
Danke für die schnelle Antwort.

Ist denn RAF generell die beste Methode für sowas, oder sollte ich lieber doch Byte-weise einlesen und "von Hand" SHORTs erzeugen? Wie wirkt sich das auf die Performance aus?
Mir wäre ein Verbergen der Daten in der APK schon lieber. Gibt es eine Möglichkeit SHORTweise auf Assets zuzugreifen?
 

Midimaster

Active Member
Licensed User
Hallo Ihr, danke für Eure Antworten. Mittlerweile ist das Problem gelöst und ich hatte mich für den ByteConverter entschieden. Der ist ausreichend schnell. Meine Routine liest damit die 80MB als Byte-Array() ein und konvertiert sie mir in Short-Array(), mit dem ich dann wieder eine Short-Array(3.000.000,20) fülle. Und das ganze unter 100msec.

Bei den Daten handelt es sich um eine Audio-Datei mit 20 Tracks unterschiedlicher Instrumente, die alle gleichzeitig abgespielt werden sollen. Der User kann dabei in Echtzeit die einzelnen Spuren regeln und mischen.

So weit bin ich schon, alles läuft bereits:
1593586473378.png


@emexes
Schön, dich hier zu treffen, Du hattest mir ja schon im Englischen Forum geantwortet und geholfen. Deinen Vorschlag doch mit 20msec-Stücken bei der Timer()-Ungenaugkeit zu arbeiten habe ich dann doch noch gebraucht. Es gab inzwischen Situationen wo man den Fehler durch meinen 1msec-Ausgleich nicht wieder hinbekommen hätte.
 
Last edited:
Top