Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi stream korrekt? (https://www.delphipraxis.net/205344-stream-korrekt.html)

venice2 31. Aug 2020 08:13

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?

Delphi.Narium 31. Aug 2020 08:57

AW: stream korrekt?
 
Kannst Du eventuell mit demhier BASS_CHANNELINFO oder demhier BASS_ChannelFlags bzw. demhier BASS_ChannelGetInfo an die gewünschten Infos kommen?
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.
...

KodeZwerg 31. Aug 2020 11:25

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 Webseite bereit gestellt, vielleicht entdeckst Du bei der Einbindung von Fremdquellen genau das was Dir weiterhelfen kann oder aber es basiert auf Channel(get)Info... gucken kost ja nix :-)

Gausi 31. Aug 2020 13:03

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.

venice2 31. Aug 2020 17:15

AW: stream korrekt?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1472642)
Kannst Du eventuell mit demhier BASS_CHANNELINFO oder demhier BASS_ChannelFlags bzw. demhier BASS_ChannelGetInfo an die gewünschten Infos kommen?
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.
...

Das tue ich alles schon.
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.

himitsu 31. Aug 2020 17:31

AW: stream korrekt?
 
Du hast das in dem Zitat aber auch richtig verstanden?
Delphi-Quellcode:
if BASS_SAMPLE_FLOAT // 32 Bit
else if BASS_SAMPLE_8BITS // 8 Bit
else // 16 Bit
Was sind für dich unrichtige Daten?
* 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.

Delphi.Narium 31. Aug 2020 17:55

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.

venice2 31. Aug 2020 17:57

AW: stream korrekt?
 
Zitat:

Du hast das in dem Zitat aber auch richtig verstanden?
Entschuldige aber ich weis jetzt nicht was du nicht verstanden hast.

also gerne noch einmal.
Zitat:

Ich sagte auch ich kann 8, 16, und 32Bit Sample Float verarbeiten. Danke.
Delphi-Quellcode:
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
ChannelDaten mit BASS können einmal als normaler Stream 8, 16, 32 Bit Floating Point übergeben werden.
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:

Es hat also nichts mit 8, 16, und 32Bit Sample Float zu tun, sondern mit der Lautstärke der Streams.
Ja die Amplitude halt.

Zitat:

die einzig sinnvolle Entscheidung.
Ja denke auch ;)

Danke für euer Interesse.

himitsu 31. Aug 2020 18:39

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.

venice2 31. Aug 2020 19:18

AW: stream korrekt?
 
Zitat:

Zitat von himitsu (Beitrag 1472693)
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.

Nein sie fehlt nicht.
Aber das kannst du nicht sehen.
Bitte..
Delphi-Quellcode:
    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;
Du bist ein Perfektionist so wie ich.

Zitat:

Tja, wenn die Daten wirklich so sind, dann stimmt die Anzeige ja eigentlich.
Liegt im Auge des Betrachters.
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 14:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz