Bass.Dll Record Tutorial

    • VB.NET

    Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von DiloUsta.

      Bass.Dll Record Tutorial

      BASS.Dll Record Tutorial


      Heute möchte ich euch zeigen, wie ihr mit der Bass.dll einen Stream (z.B. Onlineradio) aufnehmen könnt. Das ganze funktioniert über einen DOWNLOADPROC, welcher bereits von der Library zur verfügung gestellt wird. Das DOWNLOADPROC Objekt bekommt im Konstruktor eine Funktion übergeben - eine sogenannte Callback Funktion. Der gedanke davon ist, das diese innerhalb eines bestimmten Zeitraumes immer wieder aufgerufen wird und die Daten des aktuellen Streams in eine Datei schreibt. Also gucken wir uns das ganze mal an:

      VB.NET-Quellcode

      1. Imports Un4seen.Bass
      2. Imports System.IO


      Die Un4seen.Bass Library brauchen wir logischerweise um die vollen Funktionen der DLL zu Nutzen. Den System.IO Import nutzen wir um einen Filestream zu erzeugen mit welchem wir später in die Datei schreiben. Nun erzeugen wir noch den Stream, welcher später gefüllt und abgespielt werden soll.



      Nun benötigen wir noch ein paar globale Variablen, welche zum abspielen und aufnehmen benötigt werden.

      VB.NET-Quellcode

      1. Public stream As Integer
      2. Public fs As System.IO.FileStream = Nothing
      3. Public myDownloadProc As DOWNLOADPROC
      4. Public data() As Byte


      Der Stream wird später mit Infos gefüllt und kann dann mit der dll abgespielt werden. Den Filestream benutzen wir um die Daten vom stream in einer Datei auf der Festplatte zu speichern und so den Stream aufzunehmen. Der DOWNLOADPROC nimmt im nächsten ein Funktion entgegen, in welcher wir den Stream speichern. Wir haben also totalen Einfluss darauf wie, wann und wo der Stream gespeichert werden soll. Das Byte Array nimmt die INformationen vom Stream entgegen, welche wir dann später in der Datei Speichern.



      Als nächstes muss die Dll konfiguriert werden und der Stream, welchen wir abspielen wollen, mit Infos gefüllt werden. Dies geschiet so:

      VB.NET-Quellcode

      1. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, IntPtr.Zero, Nothing)
      2. myDownloadProc = New DOWNLOADPROC(AddressOf MyDownload)
      3. Dim url As String = "*Link zum Stream des Onlineradios*" 'Besteht meistens einfach nur aus einer IP Adresse
      4. stream = Bass.BASS_StreamCreateURL(url, 0, BASSFlag.BASS_STREAM_AUTOFREE, myDownloadProc, 0)
      5. Bass.BASS_ChannelPlay(stream, True)


      So nun zur Erklärung: In der ersten Zeile, wird die DLL iniziallisiert. Dies sollte im normalfall einfach os bleiben. Darunter wird schon das von oben erwähnte DOWNLOADPROC Objekt erzeugt. Hier sieht man gut das die Callback Funktion an das Objekt übergeben wird. In den nächsten 3 Zeilen, erzeugen wir einen Stream, welcher mit dem letzen Befehl abgespielt wird. dem Stream wird das DOWNLOADPROC Objekt (myDownloadProc) übergeben und von da an immer wieder erneut aufgerufen.



      Jetzt fehlt nur noch die Download Funktion welche wir oben an den DOWNLOADPROC übergeben haben. DIese sieht folgendermaßen aus (für einen ganz einfaches Speichern des Streams)

      VB.NET-Quellcode

      1. Private Sub MyDownload(ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr)
      2. If fs Is Nothing Then
      3. ' Datei erzeugen
      4. fs = File.OpenWrite("C:\Radio.mp3")
      5. End If
      6. If buffer = IntPtr.Zero Then
      7. ' Download fertig
      8. fs.Flush()
      9. fs.Close()
      10. Else
      11. ' Größe des Buffers anpassen
      12. If data Is Nothing OrElse data.Length < length Then
      13. data = New Byte(length) {}
      14. End If
      15. ' Speicher in Buffer kopieren
      16. System.Runtime.InteropServices.Marshal.Copy(buffer, data, 0, length)
      17. ' In Datei schreiben
      18. fs.Write(data, 0, length)
      19. End If
      20. End Sub


      Wenn das ganze jetzt gestartet wird (mit einem gültigen Onlineradio-Link) wird auf Festplatte C die Radio.mp3 erzeugt, welche nach dem Programmende aufgerufen werden kann und den aufgezeichneten Stream enthält. Somit habt ihr es erfolgreich geschafft den Stream zu speichern. Eigentlich wars das jetzt - die Aufnahme ist vollständig und kann so ausgeführt werden.



      Zur vollständigkeit halber aber hier noch ein paar Tipps wie ihr die Aufnahme des Streams verbessern könnt:

      VB.NET-Quellcode

      1. Bass.BASS_SetConfig(BASSConfig.BASS_CONFIG_NET_BUFFER, 300)
      2. Bass.BASS_SetConfig(BASSConfig.BASS_CONFIG_BUFFER, 300)


      Mit diesen beiden Eigenschaften könnt ihr festlegen, in welchem Abstand die Callback Funktion aufgerufe werden soll. Die Zahl gibt den Abstand der AUfrufe in Millisekunden an. Es kann ein bisschen vergleichen werden mit dem Intervall von einem Timer. Wenn ihr eine genau Trennung des Stream haben wollt muss der Wert kleiner werden ansonsten liegt er so bei ca 7000. Spielt ein wenig damit rum. Der Wert sollte allerdins nicht zu niedrig werden, da sonst der Stream nicht mehr richtig wiedergeben / aufgezeichnet werden kann.

      Außerdem könnt ihr mit:

      VB.NET-Quellcode

      1. Bass.BASS_ChannelSetAttribute(stream, BASSAttribute.BASS_ATTRIB_VOL, 0) ' 0=leise 1=laut


      festlegen ob ihr während der Aufnahme den Stream hören wollt oder nicht. Ihr legt damit die Lautstärke des gesammten Streams fest - allerdings wirkt es sich über diese Funktion nicht auf die Aufnahme aus. Wenn ihr

      VB.NET-Quellcode

      1. Bass.BASS_ChannelsetVolume(stream, 0)


      verwenden würdet, währe der ganze Stream gemutet und auch die Aufnahme wäre leise.



      Zur Installation verweise ich mal auf diesen Thread wo Kombrinki die Installation der Dll sehr gut und ausführlich beschrieben hat. Allerdings muss dazu gesagt werden,dass (zumindest bei mir) VB 2010 verbuggt ist und die Dll in der Liste, welche im Screenshot zu sehen ist, nicht aufführt. In diesem Fall muss einfach der Installationspfad gewählt werden und die bass.dll aus dem Verzeichniss manuell als Verweis hinzugefügt werden. Desweiteren ist zu beachten, dass wen man die dll unter einem 64 Bit Betriebssystem nutzen möchte man das Platformtarget änder muss. Auch dies wird hier sehr gut beschrieben.

      Ein Beispielprojekt zur Aufnahme des Streams ist hier verfügbar:
      Record Beispiel.zip



      Ich hoffe ich konnte euch helfen und ihr könnt dieses Tutorail gut gebrauchen. Ich bin auf eure Programmideen im Showroom gespannt ;) Viel Spaß damit. Bei weiteren Fragen, Kritik oder anderen Erweiterungsideen könnt ihr hier gerne posten. Ich, und ich bin mir sicher die anderen hier im Forum auch werden euch gerne Helfen. Dafür ist das Forum ja da ;)

      Viele Grüße
      Crosaider

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Croasider“ ()

      Ein Beispielprojekt wäre nett... denn irgendwie klapps bei mir net.
      Mfg: Gather
      Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


      Hab's direkt mal gestetst aber es nimmt nur die ersten paar Sekunden auf. Die Größe beträgt IMMER 4kb.


      EDIT: Ok es funktioniert wenn ich die mp3 unter C:\Radio.mp3 speicher . Aber sobald ich das ändere funktioniert es nicht mehr.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „G4ME“ ()

      Wenn ich versuche, Dein Projekt auf einem x64 zu starten, kommt dieser Fehler (Anhang):
      Stelle bitte Dein Projekt von AnyCPU auf x86 um, da die Bass.DLL explizit für x86 erstellt wurde.
      Bilder
      • BassDllRecord.jpg

        55,75 kB, 758×299, 344 mal angesehen
      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).
      VB-Fragen über PN / Konversation werden ignoriert!
      Bekomme diesee Wahrnung (Programm stoppt):
      Die DLL "bass.dll": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.
      Bei:

      VB.NET-Quellcode

      1. stream = Bass.BASS_StreamCreateURL(url, 0, BASSFlag.BASS_STREAM_AUTOFREE, myDownloadProc, 0)
      Mfg: Gather
      Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


      Das Programm benötigt sowohl die bass.dll als auch die Bass.Net.dll.
      Ist die Bass.Net.dll nicht da, meckert das System. Ist die Bass.dll nicht da, meckert die Bass.Net.dll mit genau dieser Ausschrift.
      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).
      VB-Fragen über PN / Konversation werden ignoriert!
      Wie nehme auch auf UND stoppe es wieder und kann es dann sofort wieder starten?

      Das erste Starten weis ich ja, und stoppen. Aber beim 2. Mal kommt ein Error.

      Meine Methode:

      VB.NET-Quellcode

      1. Sub StopRecord() Bass.BASS_ChannelStop(recordstream) recordstream = Bass.BASS_StreamCreateURL(URL, 0, BASSFlag.BASS_STREAM_AUTOFREE, Nothing, 0) fs.Flush() fs.Close() End Sub



      Geht nicht. Nur einmal halt!
      @Krschy
      Ich habe einfach den Stream gestoppt und dann einfach normal wieder den Stream neugestartet, so war die Aufnahme beendet.

      Zum Starten:

      VB.NET-Quellcode

      1. Bass.BASS_ChannelStop(stream)
      2. stream = Bass.BASS_StreamCreateURL("http://listen.technobase.fm/tunein-dsl-asx", 0, BASSFlag.BASS_STREAM_AUTOFREE, myDownloadProc, 0)
      3. Bass.BASS_ChannelPlay(stream, False)


      Zum normalen Abspielen:

      VB.NET-Quellcode

      1. Bass.BASS_ChannelStop(stream)
      2. stream = Bass.BASS_StreamCreateURL("http://listen.technobase.fm/tunein-dsl-asx", 0, BASSFlag.BASS_STREAM_AUTOFREE, Nothing, IntPtr.Zero)
      3. Bass.BASS_ChannelPlay(stream, False)


      @Croasider
      Dein Speichern des Streams klappt soweit ganz gut, nur muss ich bei mir jedesmal das Programm beenden, wenn ich erneut aufnehmen will, da es heißt, es kann nicht in eine geschlossene Datei geschrieben werden.
      Keine Ahnung, ob das hier angesprochen wurde, wollte mich nicht durch die ganzen Posts arbeiten, da es klappte.

      Lösung:
      Vor dem Aufrufen eine neue Instanz des Filestream erstellen

      VB.NET-Quellcode

      1. datei = ComboBox1.Text & "-Aufnahme-" & TimeOfDay.TimeOfDay.ToString & "#" & Now.Date & ".mp3"
      2. fs = New FileStream(datei, FileMode.CreateNew)
      3. myDownloadProc = New DOWNLOADPROC(AddressOf MyDownload)
      Hallo Zusammen,

      Ist bischen her das dieses Thema behandelt wurde, hoffe jedoch das jemand mir helfen kann.

      soweit alles gut, habe es teils hinbekommen das das Radio auch abgespielt wird auch die Aufnahme funktion ist ok!
      Mein Problem: Bei einigen Internet stream wird abgespielt, bei einigen kein Ton zu hören! Stream ist eigentlich ok da ich es mit Windows Media Player getestet habe, also kann es nicht
      sein das Url nicht funktioniert. Bass.dll erkennt irgenwie url nicht.

      Meine Frage was muss ich ändern, damit alle Radio Stationen abgespielt wird?


      Danke Im vorraus