Generelle Frage zum OGG-Streaming unter PureBasic

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Generelle Frage zum OGG-Streaming unter PureBasic

Beitrag von es_91 »

Hallo, Gesellschaft.

Ich hatte irgendwie gehofft, ich könnte eine .ogg-Datei asynchron aus dem Netz ziehen und sie schon während sie geladen wird mittels #PB_Sound_Streaming einladen und abspielen. Doch da habe ich mich wohl gewaltig geirrt.

Das Öffnen schlägt bei "halbgeladenen" Dateien fehl. (Andere Player können das aber.) Wozu ist das Streaming denn eigentlich gut, wenn nicht um halbe Dateien abspielen zu können?

Grüße

es_91
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Generelle Frage zum OGG-Streaming unter PureBasic

Beitrag von Kurzer »

Hallo,

ohne jemals direkt damit etwas gemacht zu haben, würde ich trotzdem vermuten, dass mit streaming hier ein etwas anderes Vorgehen gemeint ist.

Ich vermute, dass Du damit speicherschonend eine sehr große Audiodatei abspielen kannst. Also, wenn Du z.B. eine 3 GiB OGG Datei auf Platte liegen hast, dann kannst Du mit dem streaming Mechanismus dafür sorgen, dass immer nur die paar KiB in den Speicher gelesen werden, die auch gerade abgespielt werden. Ohne das streaming-feature müsste PureBasic vermutlich die gesamten 3 GiB in den Speicher laden.

Bei Dir ist vermutlich das Problem aufgetreten, dass Du die OGG Datei nicht öffnen kannst, weil sie derzeit bereits für Schreibzugriff geöffnet wurde. Ob es planmäßig mit PureBasic möglich sein sollte, dass man eine noch in der Entstehung befindlichen OGG Datei per streaming abspielen kann, entzieht sich leider meiner Kenntnis. Da können evtl. andere mehr zu sagen.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Re: Generelle Frage zum OGG-Streaming unter PureBasic

Beitrag von es_91 »

Danke, Kurzer.

Genau, meine nächste Frage wäre, ob man mit PureBasic überhaupt streamen kann?

es_91
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: Generelle Frage zum OGG-Streaming unter PureBasic

Beitrag von Derren »

Wenn du die Datei mit den File-Befehlen öffnen kannst (z.B. ReadFile, readString etc) dann wird sie auch nicht "blockiert". Liegt dann an der OGG-lib die PB benutzt, dass sie das nicht kann.
Kannst ja mal eine Datei runterladen, mit Notepad++ öffnen, die Hälfte rauslöschen und dann in VLC oder so abspielen und in PB versuchen.
Signatur und so
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Re: Generelle Frage zum OGG-Streaming unter PureBasic

Beitrag von es_91 »

Hi, Derren.
Derren hat geschrieben:Liegt dann an der OGG-lib die PB benutzt, dass sie das nicht kann.
Doch, doch. Das kann sie. Der OGG-Parser der Sound-Bibliothek kann halbe .ogg-Dateien abspielen, nur...
Derren hat geschrieben:Wenn du die Datei mit den File-Befehlen öffnen kannst (z.B. ReadFile, readString etc) dann wird sie auch nicht "blockiert".
...zum Streamen braucht man eben Schreibzugriff. :wink:

Das gleiche ist es übrigens, wenn man die Daten in den Speicher lädt und von dort abzuspielen versucht - es spielt alles, was beim Laden da war, aber es lädt zur "Spielzeit" nich mehr ein, wenn man weiterschreibt.
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: Generelle Frage zum OGG-Streaming unter PureBasic

Beitrag von Derren »

Ich meinte, dass die Lib nicht mit halben Dateien umgehen kann. Nicht, dass es Probleme beim Spielen der volltändigen Datei gibt. Daher der Hinweis mal Teile zu löschen.

Dass "man" zum Streamen Schreibzugriff braucht ergibt für mich keinen Sinn. Also, wenn der Download "extern" geschieht z.B. durch den Browser.

Das mit dem Speicher ist ja wieder ne andere Story als Schreibrechte auf eine Datei.
Wenn du nur den Speicherbereich liest, der schon eingelesen wurde, dann ist es ja klar. Liest ja nur die erste Minute zB. ein.
Wenn du genug Speicher reservierst und diesen Bereich verwendest und es geht immer noch nicht, dann liegt das Problem wieder bei der OGG-Lib, da dann wohl der Speicherinhalt komplett kopiert wird. Ergo => Die Lib kann nicht streamen, ganz einfach deshalb, weil sie sich die vorhandenen Daten krallt und nicht weitere Daten nachladen kann, ohne die Datei komplett neu zu laden.

Wenn du die Datei während des Runterladens einlesen willst, musst du die Datei wohl wiederholt öffnen und schließen und immer die letzten Teile einlesen.
Signatur und so
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Generelle Frage zum OGG-Streaming unter PureBasic

Beitrag von GPI »

Da mit den ShareRead/Write ist imo etwas verwirrend.
Wenn A) eine Datei mit SharedWrite/Read öffnet, dann kann b) diese nicht mit SharedRead öffnen.

Hintergrund ist imo, dass das OS davon ausgeht, das B) die Datei zwar nur zum Lesen öffnet, aber durch das nur "SharedRead" erzwingen will, das sich die Datei nicht verändert, solange B) sie auf hat. Da A) aber sie mir Write geöffnet hat, ist das nicht der Fall.

Deshalb muss die Bibliothek die Datei zum Streamen eigentlich mit SharedRead/Write öffnen, sonst kann der andere Prozess diese nicht weiterführen. Das Problem ist vermutlich, das es mögilch ist, genau die Leseposition des Streams mit anderen Daten zu überschreiben. Das gibt Probleme. Genauso wenn das Schreiben langsamer ist als das Abspielen. Wenn die verwendete OGG-Bibliothek das nicht vorsieht und abfängt, gibts Probleme.

Darf man fragen, warum die eine Datei von Server streamen willst, anstatt sie einfach erstmal zu downloaden und dann abzuspielen?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: Generelle Frage zum OGG-Streaming unter PureBasic

Beitrag von Derren »

Aber wenn die Datei mit Shared-WR vom Downloader erstellt wird, kannst du sie doch auch mit Shared-WR öffnen? Sonst ergibt das Flag ja gar keinen Sinn, wenn man sie dann gar nicht öffnen kann.
Und zum lesen an sich, kann man da die Read-Befehle nehmen. Ob man jetzt ReadFile oder OpenFile verwendet ist doch egal, solange man nicht tatsächlich schreibt und das andere Programm trotzdem noch auf die Datei zugreifen kann.

Aber das Problem ist trotzdem die Ogg-Libe (oder viel mehr alle Datei Libs von PB), die ganz einfach eine Kopie der Datei im Speicher anlegen.
Hier im Forum wurde oft genug davon abgeraten IncludeBinary mit den Catch-Befehlen zu verwenden, da jede Datei dann doppelt Speicher belegt. Einmal beim includen, und einmal beim catchen der Datei mit der jeweiligen Lib (Sound, Sprite etc).

Von daher ist die einzige Möglichkeit wirklich zu streamen, kurz vor Ende der vorhanden Datei zu überprüfen ob neue Daten vorhanden sind, diese als neuen Sound zu laden, und zu versuchen, Sound 0 an der gleichen Stelle zu stoppen wie Sound 1 zu starten.

Dann spielt man Sound 1 bis kurz vor Ende und lädt die neue, vollständigere Version wieder in Sound 0. Solange bis man die komplette Datei hat.

Die Frage ist nur: Kann die PB-Lib so genau und fehlerfrei von einem Sound zum Anderen springen, ohne, dass man es hört.

PS: Wenn es wirklich daran scheitert, dass die Datei die gerade heruntergeladen wird, beschrieben wird, muss man halt für jedes Laden vorher eine Kopie im Temp-Ordner erstellen. "Andere Player können das aber", wer weiß, vielleicht machen die das genau so.
Signatur und so
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Re: Generelle Frage zum OGG-Streaming unter PureBasic

Beitrag von es_91 »

Derren hat geschrieben:Wenn du die Datei während des Runterladens einlesen willst, musst du die Datei wohl wiederholt öffnen und schließen und immer die letzten Teile einlesen.

[...]

Von daher ist die einzige Möglichkeit wirklich zu streamen, kurz vor Ende der vorhanden Datei zu überprüfen ob neue Daten vorhanden sind, diese als neuen Sound zu laden, und zu versuchen, Sound 0 an der gleichen Stelle zu stoppen wie Sound 1 zu starten.

Dann spielt man Sound 1 bis kurz vor Ende und lädt die neue, vollständigere Version wieder in Sound 0. Solange bis man die komplette Datei hat.
Man hört die Sprünge zwischen den Sound-Dateien. Ich habe das mal probiert, es klingt zwar passabel, aber ist nicht ganz das, was "echtes Streaming" kann.
GPI hat geschrieben:Darf man fragen, warum die eine Datei von Server streamen willst, anstatt sie einfach erstmal zu downloaden und dann abzuspielen?
Aus Zeitgründen. Eine Musikdatei in minimaler Qualität zu downloaden dauert auf langsamen Leitungen immernoch mehrere Sekunden, teilweise sogar 1 Minute (DSL384).
Derren hat geschrieben:Aber das Problem ist trotzdem die Ogg-Libe (oder viel mehr alle Datei Libs von PB), die ganz einfach eine Kopie der Datei im Speicher anlegen.
Genau so ist es.
Derren hat geschrieben:PS: Wenn es wirklich daran scheitert, dass die Datei die gerade heruntergeladen wird, beschrieben wird, muss man halt für jedes Laden vorher eine Kopie im Temp-Ordner erstellen. "Andere Player können das aber", wer weiß, vielleicht machen die das genau so.
Denke ich nicht. Die müssten doch genauso zischen den Sounds springen, wie wir, oder? Vielleicht füllen die den Sound-Puffer gleich selbst ... dann gänge das aber auch, ohne die TEMP-Kopie, nicht wahr?

-----------

Ich habe eine kleine Notlösung gefunden. Ich wollte Webradio machen. Nun lädt meine Software zuerst eine Dummy-Datei, um die Verbindungsgeschwindigkeit zu testen. Abhängig von der Geschwindigkeit wird nur ein Teil einer Mono-Datei geladen. Sobald dieser Teil da ist (wenige Sekunden auch auf langsameren DSL-Verbindungen) wird diese abgespielt. Und bis diese Mono-Datei am Ende angelangt ist wurde die komplette Stereo-Datei nachgeladen und es wird, wie von Derren beschrieben, "hinübergesprungen". So kann man den kleinen "Hupperz" beim "Überspringen" von einer Datei in eine andere dem Kunden besser verkaufen - er wechselt von Mono auf Stereo. 8)
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: Generelle Frage zum OGG-Streaming unter PureBasic

Beitrag von Derren »

Schon mal probiert den Sound zu überlappen? Aber dann muss dein Event-Loop sehr präzise getimet sein..
Am idealsten wäre es, auf den Speicher der Ogg-Lib zuzugreifen. Oder seine eigene Lib zu schreiben.

Das mit dem Temp-Ordner war ja nicht für das Sprung-Problem, sondern das Shared-Read/Write Problem. Sofern es überhaupt existiert. Also falls du gar nicht die Datei lesen darfst, solange sie heruntergeladen wird. Ansonsten, klar. Da müsste man genauso springen.
Signatur und so
Antworten