![]() |
stream korrekt?
Bass Library!
Irgendein Entwickler schickt einen schlechten Stream an meinen Visualisierungs-Wrapper. Wie kann ich prüfen ob ein Stream die richtigen Daten enthält? Ich kann 8, 16 und (32Bit Floating point) verarbeiten. Trotzdem sehe ich das die Daten von manchen Streams einfach zu hoch für die Spectrum\Wave Daten sind wenn er falsch übergeben wird. Zum beispiel ein nicht korrekt initialisierter Mixer Stream. Ich möchte in dem Fall das Rendern einfach unterbinden. Irgendwelche Ideen? |
AW: stream korrekt?
Kannst Du eventuell mit demhier
![]() ![]() ![]()
Code:
...
BASS_SAMPLE_8BITS The channel's resolution is 8-bit. If neither this or the BASS_SAMPLE_FLOAT flags are present, then the channel's resolution is 16-bit. BASS_SAMPLE_FLOAT The channel's resolution is 32-bit floating-point. ... |
AW: stream korrekt?
Wenn das mit Channel(get)Info nicht fruchten sollte, schau Dir mal den Nemp Player Quelltext an.
Benutzer Gausi hat Nemp inklusive Sourcen auf seiner ![]() |
AW: stream korrekt?
Da es hier um Visualisierung geht, könnte man dann genauso gut in die Demo-Programme der bass.dll gucken (Spectrum_vis oder so ähnlich). Denn was anderes läuft bei meinem Player an der Stelle auch nicht ab. Ich habe den Bass-Demo-Code da nur ein wenig modifiziert, aber im Wesentlichen übernommen. ;-)
Die "Visualisierung" ist bei mir nur eine kleine Spielerei, die kaum den Namen verdient. |
AW: stream korrekt?
Zitat:
Ich sagte auch ich kann 8, 16, und 32Bit Sample Float verarbeiten. Danke. Das Problem ist eher das wenn ein Mixer Stream übergeben wird die Daten einfach nicht stimmen meist sind\liegen sie im höchsten bereich. Was bedeutet das beim Spectrum zum Beispiel die Daten im absoluten roten Bereich liegen. Die Spectrum\Wave Daten sind quasi übersteuert. EDIT: Ich glaube mache da gar nichts. Wenn der Developer nicht in der Lage ist den richtigen Stream zu übergeben dann ist es halt so das er ungenügende Ausgaben der Visualisierung bekommt. Es ist halt nicht möglich alle Eventualitäten gegenzuprüfen. |
AW: stream korrekt?
Du hast das in dem Zitat aber auch richtig verstanden?
Delphi-Quellcode:
Was sind für dich unrichtige Daten?
if BASS_SAMPLE_FLOAT // 32 Bit
else if BASS_SAMPLE_8BITS // 8 Bit else // 16 Bit * richtige Daten aber Aufnahme total übersteuert (dann ist das Rot richtig) * richtige Daten in einem von dir nicht beachteten Format * ungültige/falsche Daten (irgendwas, aber keine Sound-Daten) Und jupp, wenn Letzeres, dann ist das halt so und ich würde das auch nicht behandeln. OK, man könnte maximal irgendwie versuchen rauszubekommen, ob die wirklich ungültig sind, und z.B. mit einer Exception reagieren, was aber schwer/unmöglich wird, wenn die Daten dennoch der Spezifikation entsprechen. |
AW: stream korrekt?
Du meinst also was ganz anderes, als ich aus Deiner Fragestellung entnommen habe.
Es hat also nichts mit 8, 16, und 32Bit Sample Float zu tun, sondern mit der Lautstärke der Streams. Unterschiedliche Internetradios sind unterschiedlich laut und deshalb bekommt man da bei BASS_ChannelGetLevel teils "exorbitante" Werte heraus. Je höher die Werte, umso "übersteuerter" die Anzeige. Leider weiß man am Beginn eines Streams nicht, ob er insgeamt zu laut ist oder nur am Anfang ein paar etwas lautere Töne, deshalb kann man eigentlich erst am Ende sagen, dass er insgesamt zu laut war. Wenn Du also in der Anzeige eine "Übersteuerung" vermeiden willst, musst Du Dir einen Algorithmus überlegen, mit dem Du die per BASS_ChannelGetLevel erhaltenen Werte auf ein "erträgliches" Maß herunterrechnest. Zugegeben hab' ich keine Ahnung, wie man das sinnvoll lösen kann. Bei meinem NetRadio sind übersteuerte Sender halt auch in der Anzeige übersteuert ;-) Wobei: In diesem Zusammenhang ist der Ausdruck "Übersteuert" etwas irreführend: Früher war es bei Tonbändern und Cassetten so, dass übersteuerte Aufnahmen akustisch verzerrt wurden. Die Übersteuerung führte, je nach Höhe, zu einem massiven Qualitätsverlust, die Akustik, die Wiedergabequalität litt. Dies ist im Zusammenhang mit lauten Streams nicht der Fall, da sieht halt "nur die Anzeige rot" und nicht die Ohren ;-) Achso, Dein Nachsatz per Edit: Ich glaube mache da gar nichts. ist meiner Meinung nach in diesem Zusammenhang die einzig sinnvolle Entscheidung. |
AW: stream korrekt?
Zitat:
also gerne noch einmal. Zitat:
Delphi-Quellcode:
ChannelDaten mit BASS können einmal als normaler Stream 8, 16, 32 Bit Floating Point übergeben werden.
if ((flags and BASS_SAMPLE_FLOAT) = BASS_SAMPLE_FLOAT) then
// Ich tue etwas if ((flags and BASS_SAMPLE_MONO) = BASS_SAMPLE_MONO) then // Ich tue etwas anderes if ((flags and BASS_SAMPLE_8BITS) = BASS_SAMPLE_8BITS) then // Ich tue etwas ganz anders Diese werden dann mit Bass_ChannelGetdata über entsprechenden Stream und übergebenen Flags eingelesen. Abhängig von den Flags werden die Daten dann mit 8, 16, oder 32 Bit analysiert. Daten können aber auch als Mixer Stream übergeben werden. Dazu wird der Mixer erstellt.
Delphi-Quellcode:
Mixer_Handle := BASS_Mixer_StreamCreate(..
Spielt man nun einen Titel dann wird der Stream (normale unveränderte Daten) entsprechend der Datei erstellt.
Delphi-Quellcode:
Stream_Handle := Bass.BASS_StreamCreateFile(..
Verwendet man nun den Mixer dann wird dieser Stream dem Mixer Stream hinzugefügt.
Delphi-Quellcode:
BASS_Mixer_StreamAddChannel(Mixer_Handle, Stream_Handle...
Wenn ich nun Pech habe wird dieser Stream auch noch einmal mit DSP und oder Equalizer Effekte verändert und dann an meinem Wrapper geschickt. Das nenne ich nicht normalen Stream er wurde vorher extrem verfälscht\verändert) Nun! Wie kann ich das prüfen? Denke gar nicht. Deswegen mein Edit in der vorherigen Post. Ich mache gar nichts. Ansonsten müsste ich den Stream in seine Einzelteile zerlegen um wieder auf den normalen Stream zu kommen. Das scheint mir aber unmöglich zu sein. Zitat:
Zitat:
Danke für euer Interesse. |
AW: stream korrekt?
Nja, speziell das hier "If neither this or the BASS_SAMPLE_FLOAT flags are present, then the channel's resolution is 16-bit." ist eine Ausnahme, die bei deinen IFs fehlt.
Tja, wenn die Daten wirklich so sind, dann stimmt die Anzeige ja eigentlich. |
AW: stream korrekt?
Zitat:
Aber das kannst du nicht sehen. Bitte..
Delphi-Quellcode:
Du bist ein Perfektionist so wie ich.
BASS_ChannelGetInfo(VisRenderThread.Stream, ChanInfo);
if (ChanInfo.flags and BASS_SAMPLE_8BITS) = BASS_SAMPLE_8BITS then BassSoInfo.BitsPerSample := 8 else if (ChanInfo.flags and BASS_SAMPLE_FLOAT) = BASS_SAMPLE_FLOAT then BassSoInfo.BitsPerSample := 32 else BassSoInfo.BitsPerSample := 16; Zitat:
Für mich sind sie in der Darstellung auf das äußerste Ausgelastet, aber gut muss der Developer selbst für sorgen das es stimmt. Falscher Stream falsche Ausgabe und fertig. Sein eigenes Problem. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz