TimeLine - Zeitleiste

  • VB.NET
  • .NET (FX) 4.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Das nennt sich Visualisierung. Das kann zum Beispiel CSCore von @thefiloe.
    google.de/url?sa=t&rct=j&q=&es…-Ng&bvm=bv.70138588,d.bGQ
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Hicki schrieb:

    siehe Anlage
    Das ist übrigens kein Spektrum, sondern eine Wave.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Schau mal in die CSCore Dokumentation auf Codeplex oder hier mal direkt im Forum:
    Klick mich!

    Eventuell steht da ja was, denn ein Visualisierungsbeispiel (sogar mehrere) sind da dabei. Ansonsten frage am Besten mal @thefiloe selbst!
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Also es sieht so aus. Das was du da siehst sind die Samples einer Audiodatei. Nennt man auch Waveform. Auf der y-Achse werden die Werte der Samples aufgetragen und auf der x-Achse die Zeit. Man kann also theoretisch ablesen: Zum Zeitpunkt X hat der Ton die Auslenkung Y. Um das alles zu zeichnen musst du also erst die Audiodaten decodieren und zu samples konvertieren. Je nach Format der Audiodaten hast du unterschiedlich viele Samples pro Sekunde. Übliche Werte sind 44100 oder 48000 samples pro Sekunde. Sagen wir ein Lied ist 3 Minuten lang und hat eine Samplerate von 44100 Hz dann hast du 3*60*44100 = 10584000 Samples. Du siehst schon... so eine Darstellung ist vll. 500-1000 Pixel (sagen wir der Einfachkeit halber einfach 1000 pixel). Somit wären pro Pixel 10584 Samples. Sowas geht natürlich extremst in die Performance. Deshalb solltest du erst alle Samples raussuchen (also die 10584*10³ samples). Hast du alle samples, dann würde ich (um es bildlich zu formulieren) Behälter bilden. In diesem Fall 1000 Behälter für 1000 Pixel breite. Jetzt gibst du dem ersten Behälter die ersten 10584 Samples, dem zweiten Behälter die nächsten 10584 Samples usw. Jetzt hast du 1000 Behälter mit den Samples welche du für einen einzelnen vertikalen Strich in der Darstellung verwenden willst. Du kannst jetzt z.b. immer den höchsten Wert nehmen (Achtung die Teile sind positiv und negativ - wie bei einer Welle halt üblich). Da 10584 Samples jedoch verdammt viele sind, hast du eine sehr hohe Chance, dass fast immer einer an den maximalen Wert ran kommt. Deshalb würde ich eher auf den Durchschnitt gehen. Du hast dabei halt das Problem, dass du bei z.B. einer Sinus Funktion je nach Größe des "Behälters" immer 0 raus bekommst. Deshalb würde ich z.B. alle positiven Werte des Behälters nehmen und deren Durchschnitt berechnen. Das gleiche für alle negativen Werte. Dann hast du zwei Durchschnitte und anschließend die Linie vom positiven zum negativen Wert zeichnen.
    Noch eine kleine Anmerkung: Da samples meistens in floats berechnet werden, brauchen alleine schon alle samples in ihren Behältern recht viel Speicher. Bei den 3 Minuten (40.37 MB). Das Zeug sollte aber auch darauf ausgelegt sein, dass man Lieder bzw. Dateien mit einer Länge von mehreren Stunden laden kannst. Somit wäre es natürlich sinnvoll wenn du beim einlesen der Samples immer einen Behälter einliest, dort die Durchschnitte berechnest, diese zeichnest, dann den zweiten Behälter,... (der erste Behälter wird nicht mehr benötigt -> kannste also weg hauen oder zumindest nur die beiden Durchschnittswerte behalten).

    Da das alles jedoch den aller meisten viel zu komplizierst ist, gehe ich jetzt auf die genaue Umsetzung gar nicht genauer ein und verwende nicht noch mehr Zeit.
    Bei Fragen, beantworte ich diese jedoch gerne.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Hicki schrieb:

    ein kleines Beispiel?
    So was:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim lines As New List(Of Point)
    3. Private draw As Boolean = False
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. Dim rnd As New Random
    6. For i = 0 To 200
    7. ' die Wave
    8. lines.Add(New Point(i, rnd.Next(Byte.MaxValue)))
    9. Next
    10. draw = True
    11. Me.Invalidate()
    12. Me.Update()
    13. End Sub
    14. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    15. If Not draw Then
    16. Return
    17. End If
    18. e.Graphics.DrawLines(Pens.Black, lines.ToArray)
    19. End Sub
    20. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!