Bass.dll Speichern von Datei

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Thilo.

    Bass.dll Speichern von Datei

    Hallo Leute,

    ich bastel gerade an einem Programm, welches den Sound der Soundkarte aufnehmen soll.
    Diese Sounddatei soll dann noch Eigenschaften enthalten, wie z.B. Titel, Interpreten, oder einem Cover.
    Doch wie mache ich das, ich bastle jetzt schon gut zwei Stunden herrum und finde einfach kein Tutorial.

    Vielen Dank schonmal im Vorraus,

    Peter
    du meinst also den gesamten sound vom system?
    Uff das wird mit der bass schwer... zumindest könnte ich mich nicht errinnern, dass ich sowas je bei der bass gesehen hätte. alternative kannste auch ma ins un4see.com forum gehen. Ist eig. guter support. Und sonst halt ne alternative suchen.


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

    Aufnahmen von der Soundkarte mittels bass.dll ist sehr gut realisierbar. Für die Fütterung der Aufnahme mit ID3V2 Tags (Interpret, Album, Cover...) empfehle
    ich die taglib-sharp.dll.

    Du wirst nicht umhin kommen Dich im un4see.com Forum umzuschauen.

    möglicher Aufbau in Kurzfassung:

    1. ein Ausgabegerät initialisieren
    Un4seen.Bass.Bass.BASS_Init(-1, 44100, CType(Un4seen.Bass.BASSInit.BASS_DEVICE_DEFAULT Or Un4seen.Bass.BASSFlag.BASS_STREAM_PRESCAN Or BASSFlag.BASS_STREAM_AUTOFREE, BASSInit), Me.Handle)

    2. Combobox mit Aufnahmegeräten füttern:

    VB.NET-Quellcode

    1. Private RecDev_Nr As Integer 'Soundkarte-Aufnahmegeräte-Nummer
    2. Private Sub(....
    3. Try
    4. Bass.BASS_RecordInit(-1)
    5. Dim IT_List As String() = Bass.BASS_RecordGetInputNames
    6. For i = 0 To IT_List.Length - 1
    7. cbx_record_devices.Items.Add(IT_List(i).ToString)
    8. Next
    9. Dim Idx As Integer = 0
    10. Dim info As New BASS_DEVICEINFO()
    11. While (Bass.BASS_RecordGetDeviceInfo(Idx, info))
    12. Bass.BASS_RecordInit(Idx)
    13. Bass.BASS_RecordSetInput(Idx, BASSInput.BASS_INPUT_OFF, -1)
    14. Idx += 1
    15. End While
    16. If RecDev_Nr > -1 Then
    17. Else : RecDev_Nr = 0
    18. End If
    19. cbx_record_devices.SelectedIndex = RecDev_Nr
    20. Catch ex As Exception
    21. MessageBox.Show("lade_record_devices()" & vbCrLf & vbCrLf & _
    22. "InnerException: " & vbCrLf & ex.Message.ToString & vbCrLf & vbCrLf & _
    23. "Ausnahme: " & vbCrLf & ex.ToString, "Fehlermeldung", _
    24. MessageBoxButtons.OK, MessageBoxIcon.Error)
    25. End Try
    26. End Sub


    3. ne Trackbar für Dein Aufnahmegerät: (Pegelsteuerung) min=0 max=100

    VB.NET-Quellcode

    1. Private Sub rec_Trackbar_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rec_Trackbar.ValueChanged
    2. Dim vol_a As Single = CSng((rec_Trackbar.Value / 100))
    3. Bass.BASS_RecordSetInput(RecDev_Nr, BASSInput.BASS_INPUT_NONE, vol_a)
    4. End Sub


    4. ne Trackbar für Dein Wiedergabegerät(Lautsprecher): (Pegelsteuerung) min=0 max=100

    VB.NET-Quellcode

    1. Private Sub Master_Trackbar_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Master_Trackbar.ValueChanged
    2. Dim vol_a As Single = CSng(Master_Trackbar.Value / 100)
    3. Bass.BASS_SetVolume(vol_a)
    4. End Sub


    5. Aufnahme-Start (Aufnahme als mp3)

    VB.NET-Quellcode

    1. Private SC_stream As Integer 'Aufnahme-Stream (Handle)
    2. Private _myRecProc As RECORDPROC 'ein Delegate
    3. Private Sub Button_Rec_Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Rec_Start.Click
    4. Bass.BASS_RecordInit(RecDev_Nr)
    5. Bass.BASS_RecordSetInput(RecDev_Nr, BASSInput.BASS_INPUT_ON, -1)
    6. _myRecProc = New RECORDPROC(AddressOf inRecording)
    7. SC_stream = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_RECORD_PAUSE, _myRecProc, IntPtr.Zero)
    8. Aufnahme_Start()
    9. End Sub


    Für mp3-Aufnahme brauchst Du die lame.exe (Version 3.99.2.2 ist gut)

    VB.NET-Quellcode

    1. Private Sub Aufnahme_Start()
    2. 'Beginn: lame encoder
    3. l = New EncoderLAME(SC_stream)
    4. l.EncoderDirectory = "komplette Pfadangabe zu lame.exe"
    5. Dim lameexe As Boolean = l.EncoderExists
    6. If lameexe = False Then
    7. MsgBox("Die Encoderdatei lame.exe existiert nicht!" + vbCrLf + vbCrLf + _
    8. "Diese Datei in folgenden Ordner kopieren:" + vbCrLf + Directory_Encoder, MsgBoxStyle.Critical)
    9. l.Dispose()
    10. l = Nothing
    11. Exit Sub
    12. End If
    13. Dim output_mp3 As String = Path.Combine("Aufnahmen-Verzeichnis", "Dateiname.mp3")
    14. l.InputFile = Nothing 'STDIN
    15. l.OutputFile = output_mp3
    16. 'hier kannst Du rumprobieren:
    17. l.LAME_Mode = EncoderLAME.LAMEMode.JointStereo
    18. l.LAME_UseVBR = True
    19. l.LAME_VBRQuality = EncoderLAME.LAMEVBRQuality.VBR_Q0
    20. 'Ende: lame encoder
    21. l.Start(Nothing, IntPtr.Zero, False)
    22. Bass.BASS_ChannelPlay(SC_stream, False)
    23. 'updateTimer.[Start]() - wenn Du Aufnahmezeit und Pegel anzeigen willst, empfiehlt es sich einen Bass.Timer zuzuschalten,
    24. 'der würde an dieser Stelle mit gestartet
    25. End Sub


    6. der Delegate nicht zu vergessen

    VB.NET-Quellcode

    1. Private Function inRecording(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    2. Return True
    3. End Function


    7. Aufnahme stoppen

    VB.NET-Quellcode

    1. Private Sub GBT_Rec_Stop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GBT_Rec_Stop.Click
    2. l.Stop() 'lame encoder stoppen
    3. Bass.BASS_ChannelStop(SC_stream)
    4. Bass.BASS_StreamFree(SC_stream)
    5. 'updateTimer.[Stop]() '-Bass.Timer
    6. End Sub


    Wie geschrieben, dies ist eine Kurzfassung und nicht unbedingt C&P tauglich. Ordentlich angewandt, kannst Du mit diesen Schnipseln prima Aufnahmen machen. Ist von mir hundertfach erprobt.
    Du bist auch nicht auf mp3 beschränkt. Für Wave und Konsorten brauchst Du keinen externen Encoder. Das bringt die bass.dll mit. Ginge sogar auch für mp3,
    aber die lame.exe ist nun mal um einiges besser und vielfältiger einzustellen.

    mfg OnkelR

    Mal sehen, ob hier noch jemand rein schaut

    Hallo OnkelR oder wer sonst noch helfen kann,

    ich habe die Codeschnipsel oben so weit vervollständigt, dass es fast funktioniert.
    Eine MP3-Datei wird geschrieben, enthällt aber leider keinen Ton.
    Der Header scheint ok, die Bitrate und Laufzeit stimmen bei der Wiedergabe, aber es herrscht Stille.

    Da die "Stille" aber ein immer wiederkehrendes Bytemuster hat, glaube ich nicht, dass es an einem fehlenden Eingangssignal liegt.
    Als Eingänge habe ich "Was sie hören" mit CD-Wiedergabe und den "S/PDIF-In" mit Dauer-Rockantenne probiert.
    Ein Stück Aufnahme lade ich als .txt mit hoch.

    Hier der der Programmabschnitt für die Aufnahme. Vielleicht entdeckt jemand den Haken:

    VB.NET-Quellcode

    1. Private Sub Button_Rec_Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Rec_Start.Click
    2. Bass.BASS_RecordInit(RecDev_Nr)
    3. Bass.BASS_RecordSetInput(RecDev_Nr, BASSInput.BASS_INPUT_ON, -1)
    4. _myRecProc = New RECORDPROC(AddressOf inRecording)
    5. SC_stream = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_RECORD_PAUSE, _myRecProc, IntPtr.Zero)
    6. Aufnahme_Start()
    7. End Sub
    8. Private Sub Aufnahme_Start()
    9. 'Beginn: lame encoder
    10. Dim l As New EncoderLAME(SC_stream)
    11. l.EncoderDirectory = "c:\RecMP3\Lame"
    12. Dim lameexe As Boolean = l.EncoderExists
    13. If lameexe = False Then
    14. MsgBox("Die Encoderdatei lame.exe existiert nicht!" + vbCrLf + vbCrLf + _
    15. "Diese Datei in folgenden Ordner kopieren:" + vbCrLf + l.EncoderDirectory, MsgBoxStyle.Critical)
    16. l.Dispose()
    17. l = Nothing
    18. Exit Sub
    19. End If
    20. Dim output_mp3 As String = Path.Combine("k:\MP3\", "Rec.mp3")
    21. l.InputFile = Nothing 'STDIN
    22. l.OutputFile = output_mp3
    23. 'hier kannst Du rumprobieren:
    24. l.LAME_Bitrate = Convert.ToInt32(EncoderLAME.BITRATE.kbps_192)
    25. l.LAME_Mode = EncoderLAME.LAMEMode.Default
    26. l.LAME_Quality = EncoderLAME.LAMEQuality.Quality
    27. 'Ende: lame encoder
    28. l.Start(Nothing, IntPtr.Zero, False)
    29. Bass.BASS_ChannelPlay(SC_stream, False)
    30. 'updateTimer.[Start]() - wenn Du Aufnahmezeit und Pegel anzeigen willst, empfiehlt es sich einen Bass.Timer zuzuschalten,
    31. 'der würde an dieser Stelle mit gestartet
    32. End Sub
    33. Private Function inRecording(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    34. Return True
    35. End Function


    Eigentlich habe ich hier nur im Lame-Bereich Änderungen vorgenommen. Die Original-Version hat dort auch funktioniert aber nur mit 32 kbit gespeichert.
    Lame ist gerade die Version 3.98.4. Bei 3.99.5 sieht es aber auch so aus.

    Gruß
    Thilo
    Dateien
    • Rec-1.txt

      (21,94 kB, 211 mal heruntergeladen, zuletzt: )
    Hab das zwar mit bass nie gemacht aber wo gibst du dem recorder an wo er das hinspeichern soll? Also die rohen PCM daten müssen ja irgendwo zwischengespeichert sein um sie dann von lame zu encodieren.

    EDIT:
    ah ok jetzt hab ichs.
    Du Recordest in SC_stream und encodest den dann.
    Ok dann probier mal nur als pcm aufnehmen?
    Und anschließend mal encodieren.


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

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

    Hallo Thilo

    Leider habe ich in meinem alten Post nicht alles beschrieben, was zur Aufnahme notwendig ist.
    War halt nur als Stütze gedacht.

    thefiloe hat es genau richtig erkannt.

    Mal kurz zum Verständnis, es wird bei Start der Aufnahme eine Wav-Datei erstellt und gefüttert.
    Nach Beendigung der Aufnahme kann diese Datei in mp3 enkodiert werden, mittels lame.exe.
    Es gibt auch Wege direkt als mp3 aufzunehmen, da hab ich aber leider grad kein Beispiel zur Hand,
    da ich in der Regel die Wav-Datei im Nachhinein mehrfach bearbeite und deshalb eben auf eine Quelle
    mit ordentlicher Qualität angewiesen bin.

    Ich hab mal nen Projekt für Visual Studio 2010 gemacht. Ich hab so viel wie möglich kommentiert.
    Mit dem Teil nimmste von Deiner Soundkarte auf und kannst nach Aufnahmestop direkt enkodieren.
    Also laufen tut das Teil, habs mit verschiedenen Quelen probiert.
    Was Deinen "S/PDIF-In" Eingang betrifft, da kann ich keine Aussage machen. Ist das nen optischer
    Eingang? Egal.
    CD-Wiedergabe sollte funzen. Wenn Du z.B. mit VLC was abspielst und mit meinem Teil aufnimmst, wärs
    net schlecht, wenn Du als Aufnahmegerät "Stereomix" verwendest. Insofern das bei Deiner Soundkarte
    so aufgeführt ist.

    Zum Programm selbst:
    Im Programmverzeichnis (Application.StartupPath) befinden sich 2 Ordner.
    1. Aufnahmen\ hier befinden sich die Aufnahme-Wav und die fertige mp3
    2. Werkzeuge\ hier ist die lame.exe drin, kannste ja mit ner neueren Version austauschen

    Denk auch daran, die Aufnahme ordentlich auszupegeln, damit se net übersteuert.
    Hab Dir 2 Trackbars reingemacht, Master und Soundkarten-Pegel.

    Und bitte nicht so streng über meinen Code richten, hatte jetzt nicht allzuviel Zeit für korrektnes.
    Option Strict On is aber gesetzt.

    Ich hoffe es klappt und hilft Dir.
    lg OnkelR

    Projekt: Rekorder.zip
    707,42 kB
    Hallo OnkelR,

    ich muß gleich wieder weg, hab das Projekt aber schnell mal getestet.
    Funktioniert gleich, die MP3 sieht aber nicht anders aus, wie die gestern von mir.
    Die Wav habe ich nicht gelöscht - sie zwar groß aber auch leer.
    Habe S/PDIF und CD-Wiedergabe probiert.
    MP3 und Wavwieder als .txt im Anhang.

    Grüße über den Berg
    Thilo
    Dateien
    Es wäre schon mal sehr geholfen wenn du mal das WAVEFORMAT deiner records preis geben könntest.
    Dann kann man das Zeug wenigstens als Rohdaten mal richtig anschauen.

    EDIT:
    die tmp hat ma eh nen waveheader und die 2. müsste dann ne mp3 sein... sehe ganz am Anfang nen Xing Frame

    außerdem wunderst du dich echt, dass du bei der wave nix hörst? schau dir das doch mal mit nem hex editor an.
    du hast nen wunderschönen riff header drinnen und danach sind alle samples 0. Da muss ich nicht groß nen Graph zeichnen lassen denn meine hellseherischen Fähigkeiten sagen mir dass der auf der Nulllinie picken wir d und keinen Millimeter davon abweicht. --> Du hast keine Wellen --> Keine Wellen kein Ton.

    Und keine Ahnung was du dem armen Encoder angetan hast aber sowas wie der encodiert hat ist definitiv nicht normal.
    Schau dir doch mal das Zeug in nem Hexeditor an... Der spamt nämlich nur nur "UUUUUUUUUUUUUUUUUUUUUUULAME3.98.4UUUUUUUUUUUUUUUUUUUUUUUUU" rein und danach ist datei zu ende.
    Nach nem Frame sieht das sicher nicht aus. Und außerdem ist das auch viel zu kurz für nen iwas vernümpftiges. Das sind grad mal 7697 Bytes. Also zeig mal code und sag jetzt genau was du machst.

    Weil hier bist du genausoweit von nem anständigen Resultat entfernt wie wenn du nen filestream öffnest und new Random().Next() reinspamst....

    EDIT2:
    Hab mir jetzt auch mal die Applikation von Onkel angeschaut (den Source nicht). Also bei mir nimmt er das Richtige auf. Liegt es an deiner Soundkarte?
    Hab im Anhang nen Prog mit dem ich früher bisschen APIs ausprobiert hab. einfach starten und nach ner gewissen zeit stoppen. Das aufgenommene ist dann im ordner. (ACHTUNG nicht unter Vista kompatibel)
    Dateien


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

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

    Jo, ich noch mal.
    Also wenn Du mit meinem Prog auch keine Aufnahme bekommst, tipp ich ma ganz sachte auf deine Soundkarte bzw. die Einstellungen für deine Soundkarte.
    Bekommst Du denn überhaupt nen Pegel angezeigt, wenn ein Eingangssignal ankommt?
    Ich hab das Prog unter Realtek und SoundMax Treiber getestet.
    Wenn mir mal jemand den "S/PDIF-In" Eingang erklären könnte, wäre nett. Was ich nicht kenne, kann ich auch nicht als Fehlerquelle ausschliessen.
    Haste auch mal mit ner anderen Software Aufnahmen getestet?

    Der Analyse von thefiloe bezüglich Deiner angehängten Dateien kann ich mich nur anschliessen. Zu wenig Information vorhanden.

    Gruss nach Breitungen
    lg OnkelR
    Hallo OnkelR und thefiloe,

    viel Schaden kann ich heute nicht mehr anrichten aber schnell noch ein par Antworten:

    @thefiloe: Die Soundcardrecord.exe startet nicht wegen einer fehlenden AVRT.dll gibts die im Web oder kannst Du sie hier hoch laden?

    @beide: Die hoch geladenen Dateischnipsel sind nur eine zwei Sekunden lange Aufnahme. Mehr sieht auch nicht anders aus.
    Meine Soundkarte ist eine Sound Blaster X-Fi Extreme die habe ich extra wegen dem optischen S/PDIF-Eingang eingebaut(womit der erklärt sein dürfte). Daran hängt ein Satreceiver für die Rockantenne.
    Die Karte funktioniert einwandfrei. Ein Programm namens Clipinc nimmt bei mir permanent die Rockantenne auf. Ich müßte jetzt nochmal testen, ob der Clipinc mir das Signal weg fängt, aber eine parallele Aufnahme mit Cooledit funktioniert auch. Die leeren Schnipsel waren aber CD-Wiedergabe mit VLC, die ich auch gehört habe.

    Ich werde die Sache morgen erst mal auf meinem "Probierrechner" testen. Der hat Realtek onboard vielleicht geht es ja da.
    Die ganze Bastelei mache, weil Clipinc unter Win7 nicht mehr läuft und ich irgendwann mal umsteigen will oder muß. Der Nachfolger RadioFX kann nur Webstream mit 128kbit und geht auch wegen LTE mit 10 GB im Monat nicht.

    Melde mich wieder ob gut oder schlecht
    Gruß
    Thilo
    Was hast du für ein Betriebssystem. Bei Win7 wird die Standartmäßig als Systemdll installiert. Und liegt in C:\WINDOWS\System32\avrt.dll


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

    Update von heute Abend:
    Ich habe die Sache auf meiner noch jungfäulichen Win7-Installation getestet.
    Der Recorder vom Onkel hat sofort funktioniert. Wir setzen aber noch einen drauf, die oben gepostete direkte MP3-Speicherung funktioniert mit einem kleinen Haken auch.
    Hier wird die MP3 erst gespeichert, wenn ich das Programm beende. Ich denke, die erzeugte Rec.mp3 muß noch geschlossen werden. Habt Ihr dafür einen Tip?

    Was ist nun anders: Auf dem System habe ich noch keinen Treiber für die Soundblaster installiert (mußte auch VB erst drauf packen). Außer dem Stereo-Mix wird für die Combobox auch kein Eingang gefunden. Aufnehmen wollte ich nun eine CD-Wiedergabe, aufgenommen hat er aber in beiden Fällen vom S/PDIF.

    Da jetzt der wichtigste Brocken bewältigt ist, werde ich nun mal den Rahmen drumherum basteln und zu jeder vollen Stunde eine neue Aufnahmedatei starten.
    Dazu noch ein par Kleinigkeiten wie sofortiger Neustart einer Aufnahmne, damit ich ein Filetstückchen gleich raus schneiden kann und natürlich die Aufnahmen nach ein par Tagen wieder löschen. Damit wäre der Clipinc-Ersatz schon fertig.

    Bei Bedarf kann ich das funktionierende Projekt jetzt schon mal hoch laden.

    Danke schon mal
    Thilo
    Hallo,

    ist erst mal alles bestens. Das Problem mit dem Schließen der gespeicherten Datei habe ich gefunden. War eine Deklaration des Lame-Encoders zu viel.
    Ich habe praktisch immer einen gestartet und einen anderen gestoppt.

    Ich habe jetzt schon mal einen Timer rein gebastelt, der zyklisch eine neue Datei startet - geht auch.
    Wenn die Soundkarte mit den eigenen Treibern nicht mehr tut, bleibt es wie es jetzt ist. Vor der Installation gibt es auf jeden Fall ein Image der Partition.

    Ich werde nun erst am Samstag weiter machen, wenn da der Biergarten nicht zu sehr ruft.

    Gruß
    Thilo