CSCore - Highperformance Audiobibliothek

    • Release
    • Open Source

    Es gibt 589 Antworten in diesem Thema. Der letzte Beitrag () ist von simpelSoft.

      @thefiloe Klar, kann ich hier Posten, sobald ich wieder aus dem Urlaub zurück bin und Zugriff auf meinen Rechner habe ;) Das mit dem Fehler in der Wsapi sollte auch gar nicht böse gemeint sein, sry, wenn das so bei dir angekommen ist.
      Verwendet habe ich Windows 7 64- Bit mit Visual Studio 2012 express und .NET Framework 4.5 . Das Programm wird auf Any-CPU kompiliert. Weiterhin habe ich "nur" onboard Sound. Stacktrace und vollständig Exception folgen.

      Gruß Christian
      Sooo da ich jetzt erstmal ne ordentliche Zwischenversion wo alles funktioniert erreicht habe, ist das Projekt nun unter einer neuen Lizenz veröffentlicht: MS-PL -> Opensource. Verfügbar ist es ab jetzt auf Codeplex. cscore.codeplex.com/


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
      Ich hab hier n MP3 was im Explorer Informationen enthält, deine Lib allerdings nicht lädt.
      ID3v1 und ID3v2 sind beide null
      Geladen wird das ganze über

      C-Quellcode

      1. public void Load( string filename ) {
      2. Stop();
      3. if ( source != null )
      4. source.Dispose();
      5. source = CodecFactory.Instance.GetCodec( filename );
      6. var t1 = ID3v1.FromFile( filename );
      7. var t2 = ID3v2.FromFile( filename );
      8. sound.Initialize( source );
      9. }
      Das ist komisch. Wenn, dann musst du mir die Datei geben. Ansonsten kann ich das nicht nachvollziehen. Wenn die Tags jedoch der Spezifikation entsprechen, dürfte auf keinen Fall null zurück kommen.


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

      entschuldige, dass ich mich erst jetzt melde, aber ich hatte das Projekt schon wieder mehr oder weniger zurseite geschoben und wurde erst heute morgen auf die Lösung gestoßen: Die gute Nachricht: Dein Programm funktioniert einwandfrei :D
      Ich vermute mal stark, dass du auf unverwaltet Componenten aus c/c++ zugreifst, oder? Und da die Projekte bei mir immer auf einem Netzlaufwerk gehostet werden, werden sie als "nicht voll vertrauenswürdig" eingestufft, was dafür sorgt, dass bestimmte Speicheroperationen fehlschalgen, was wiederum zu einer AccessViolationException führt... Von daher saß der Fehler wie so oft 40 centimeter vor dem Bildschirm :rolleyes:

      Gruß Christian
      Wenn es wirklich nur daran liegt bin ich ja beruhigt, auch wenn ich davon auch nicht sonderlich begeistert bin...
      Danke trotzdem für das Feedback.


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

      Ein Schritt weiter auf dem Weg zum Release

      Update:
      Ich habe die letzen Tage etwas weiter programmiert. Neben ein paar Bugfixes, Unittests,... habe ich hauptsächlich an einer Implementation der Mediafoundation gearbeitet.
      Nun bin ich soweit, dass alle Mediafoundation-decoder funktionieren sollten. Dadurch werden viele neue Formate verfügbar(auf Windows Vista und höher). Unter anderem werden die Formate aac, wma, ac3,... inklusive Containerformate wie mp4, avi, asf,... unterstützt. Details werdet ihr in den nächster Zeit auf cscore.codeplex.com nachlesen können.
      Zudem werde ich versuchen in den nächsten Tagen noch Encoder zu implementieren. Ach ja und ich habe noch eine kleine Demo-App erstellt welche ebenfalls auf codeplex hochgeladen ist.


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

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

      Nach einer etwas längeren Zeit doch wiedermal ein kleines Update:
      • Wasapi capture
      • Wasapi loopback-capture(aufnehmen von Ausgabegeräten wie Kopfhörer, Boxen,...)
      • Code cleanup
      • Einige bugfixes

      Wasapi capture kann wie auch WaveIn(*) verwendet werden.
      Zum Beispiel aufnehmen des Default-Eingabegerätes im Exklusiven Modus inklusive EventSync.

      C-Quellcode

      1. using (WasapiCapture capture = new WasapiCapture(true, AudioClientShareMode.Exclusive))
      2. {
      3. capture.Initialize();
      4. using (WaveWriter w = new WaveWriter(@"C:\Temp\dump.wav", capture.WaveFormat))
      5. {
      6. capture.DataAvailable += (s, e) =>
      7. {
      8. w.Write(e.Data, e.Offset, e.ByteCount);
      9. };
      10. capture.Start();
      11. Console.ReadKey();
      12. capture.Stop();
      13. }
      14. }
      15. Console.ReadKey();


      Zum aufnehmen vom Default-Ausgabegerät einfach die 1. Zeile mit folgendem Inhalt ersetzen:

      C-Quellcode

      1. using (WasapiCapture capture = new WasapiLoopbackCapture())


      Somit wäre wieder ein Punkt abgehakt siehe cscore.codeplex.com/releases/view/110138


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

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

      Ich habe den Code für die Audio-Ausgabe in VB.NET benutzt, aber in der Zeile source = source.WaveFormat.ToWaveSource(16) bekomm ich den Fehler: "ToSampleSource" ist kein Member von "CSCore.IWaveSource".
      Grüße,
      Lukas

      Fragen über Themen im Forum per Konversation werden gelöscht und die Absender blockiert...
      Grr ich kack grad voll ab. Irgendwie kann ich keine Bin von Codeplex runterladen, hab mir dein letzten Commit geschnappt, ein Projekt auf gemacht, die DLL selbst kompiliert (da ich halt noch kein 2012er drauf habe) und hab folgenden Code in der Verwendung. Sobald ich auf Start drücke krieg ich nen NotImplemented bei Initialize.
      Spoiler anzeigen

      PHP-Quellcode

      1. using System;
      2. using System.Collections.Generic;
      3. using System.ComponentModel;
      4. using System.Data;
      5. using System.Drawing;
      6. using System.Linq;
      7. using System.Text;
      8. using System.Windows.Forms;
      9. using CSCore.Codecs.WAV;
      10. using CSCore.SoundIn;
      11. using CSCore.CoreAudioAPI;
      12. namespace Multirecorder
      13. {
      14. public partial class Form1 : Form
      15. {
      16. WasapiCapture captureMic;
      17. WasapiLoopbackCapture captureBG;
      18. WaveWriter writerBG, writerMic;
      19. public Form1 ( )
      20. {
      21. InitializeComponent( );
      22. MessageBox.Show( WasapiCapture.IsSupportedOnCurrentPlatform.ToString( ) );
      23. }
      24. private void btnStart_Click ( object sender, EventArgs e )
      25. {
      26. captureBG = new WasapiLoopbackCapture( );
      27. captureBG.Initialize( );
      28. writerBG = new WaveWriter( System.IO.Path.Combine( Application.ExecutablePath, DateTime.Now.ToString( "yyyy-MM-dd HH-mm-ss" ) + "_bg.wav" ), captureBG.WaveFormat );
      29. captureBG.DataAvailable += ( s, ee ) => { writerBG.Write( ee.Data, ee.Offset, ee.ByteCount ); };
      30. captureBG.Start( );
      31. captureMic = new WasapiCapture( true, AudioClientShareMode.Exclusive );
      32. captureMic.Initialize( );
      33. writerMic = new WaveWriter( System.IO.Path.Combine( Application.ExecutablePath, DateTime.Now.ToString( "yyyy-MM-dd HH-mm-ss" ) + "_mic.wav" ), captureMic.WaveFormat );
      34. captureMic.DataAvailable += ( s, ee ) => { writerMic.Write( ee.Data, ee.Offset, ee.ByteCount ); };
      35. captureMic.Start( );
      36. btnStart.Enabled = false;
      37. btnStop.Enabled = true;
      38. }
      39. private void btnStop_Click ( object sender, EventArgs e )
      40. {
      41. captureBG.Stop( );
      42. captureBG.Dispose( );
      43. captureMic.Stop( );
      44. captureMic.Dispose( );
      45. btnStart.Enabled = true;
      46. btnStop.Enabled = false;
      47. }
      48. }
      49. }
      Wieso erstellst du es selbst? Verwende den Build von NuGet. Wenn du bei Initialize ne NotImplementedException bekommst, deutet dies darauf hin, dass der Postcompiler nicht drüber gelaufen ist. In dem Fall nachschauen was im Postbuild-Event drinnen steht und was in der Ausgabe während des Buildvorgangs steht. Wenn der Postbuild nicht ausgeführt wird, so bleiben dummy methoden drinnen und werden nicht durch entsprechende CIL-Befehle ersetzt.

      Aber wie gesagt. Der Build auf NuGet müsste passen.

      EDIT: Hab grad geschaut. Der NuGet Build in der Version 1.0.0.0 läuft wunderbar.


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
      Hab NuGet noch nie verwendet und höre via CSCore zum ersten Mal davon. Ich musste es selbst erstellen, weil C#2010 keine 2012(?)SLNs öffnen kann. Ich hab nur auf Projektmappe erstellen geklickt und die resultierende DLL genommen. Die DLL, die ich jetzt via NuGet kompiliert habe funktioniert soweit wohl. Ist aber laut dem Log die Version 0.9.0.0. Wenn ich jetzt das Projekt starte krieg ich beim zweiten Initialize IAudioClient::IsFormatSupported returned 0x8889000e.
      Mach mal den NuGet-Packetmanager auf und schau nach bei Aktualisierungen. Bei mir lädt es die 1.0 -> ist schon seit tagen oben. siehe nuget.org/packages/CSCore/. Außerdem entspricht dein HRESULT dem Fehlercode von AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED. Du versuchst das Gerät im Exklusiven Modus zu verwenden. Dies müsstest du a) bei den Treibereinstellungen aktivieren und b) bezweifle ich, dass du das brauchst. Du brauchst das eigentlich nur bei hardcore Sache wie Tonstudios,... Im exklusiven Modus, darf nur dein Prozess das Gerät verwenden. Alle anderen Zugriffe werden abgedreht und neue werden abgeschottet. Als Folge wird die interne Mixerengine abgeschaltet und du kannst sämtliche Formate(natürlich keine komprimierten) direkt dem Treiber übergeben. Dies hat eine Latenzreduzierung zur Folge und zwingt die Applikation nicht mehr dazu eventuelle Qualitätsverluste hinnehmen zu müssen. In einem normalen Anwendungsfall brauchst das aber so gut wie niemand. Lange Rede kurzer Sinn -> ändere Exclusive auf Shared.


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

      Eingabeaufforderung schrieb:

      nuget.exe list CSCore
      CSCore 0.9.0.0
      CSCore.Visualization 0.8.9.1
      Den exklusiven Modus hab ich nur wegen deinem Codebeispiel weiter oben verwendet ^^. Beim zweiten Initialize im SharedMode krieg ich nen Unhandled exception in wasapi capture proc.
      Innerexception wäre natürlich hilfreich ;) Außerdem was nuget angeht hab mich vertan. Aktuelle version ist 0.9.0.0 sry^^ War schon beim ersten Release.


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
      Krieg ich nicht. VS reagiert da nicht drauf. Der will auf andere Quellen verweisen aber schmeißt mich nicht ins Catch. Wenn ich den Release Build nehme dann spuckt er mir zwei wavs aus aber Audacity kann damit nichts anfangen.
      Edit: Lol irgendwie recorded der jetzt, aber die Wavs sind umbrauchbar und ungleich groß.
      Edit oder auch nicht? Jetzt kommt wieder der Fehler -.-
      Edit:
      Spoiler anzeigen

      PHP-Quellcode

      1. using System;
      2. using System.Collections.Generic;
      3. using System.ComponentModel;
      4. using System.Data;
      5. using System.Drawing;
      6. using System.Linq;
      7. using System.Text;
      8. using System.Windows.Forms;
      9. using CSCore.Codecs.WAV;
      10. using CSCore.SoundIn;
      11. using CSCore.CoreAudioAPI;
      12. namespace Multirecorder
      13. {
      14. public partial class Form1 : Form
      15. {
      16. WasapiCapture captureMic;
      17. WasapiLoopbackCapture captureBG;
      18. WaveWriter writerBG, writerMic;
      19. public Form1 ( )
      20. {
      21. InitializeComponent( );
      22. MessageBox.Show( WasapiCapture.IsSupportedOnCurrentPlatform.ToString( ) );
      23. }
      24. private void btnStart_Click ( object sender, EventArgs e )
      25. {
      26. try
      27. {
      28. captureBG = new WasapiLoopbackCapture( );
      29. captureBG.Initialize( );
      30. writerBG = new WaveWriter( System.IO.Path.Combine( System.IO.Path.GetDirectoryName( Application.ExecutablePath ), DateTime.Now.ToString( "yyyy-MM-dd HH-mm-ss" ) + "_bg.wav" ), captureBG.WaveFormat );
      31. captureBG.DataAvailable += ( s, ee ) => { writerBG.Write( ee.Data, ee.Offset, ee.ByteCount ); };
      32. captureBG.Start( );
      33. captureMic = new WasapiCapture( true, AudioClientShareMode.Shared );
      34. captureMic.Initialize( );
      35. writerMic = new WaveWriter( System.IO.Path.Combine( System.IO.Path.GetDirectoryName( Application.ExecutablePath ), DateTime.Now.ToString( "yyyy-MM-dd HH-mm-ss" ) + "_mic.wav" ), captureMic.WaveFormat );
      36. captureMic.DataAvailable += ( s, ee ) => { writerMic.Write( ee.Data, ee.Offset, ee.ByteCount ); };
      37. captureMic.Start( );
      38. btnStart.Enabled = false;
      39. btnStop.Enabled = true;
      40. }
      41. catch ( Exception ex )
      42. {
      43. MessageBox.Show( ex.InnerException.Message );
      44. }
      45. }
      46. private void btnStop_Click ( object sender, EventArgs e )
      47. {
      48. captureBG.Stop( );
      49. captureBG.Dispose( );
      50. captureMic.Stop( );
      51. captureMic.Dispose( );
      52. btnStart.Enabled = true;
      53. btnStop.Enabled = false;
      54. }
      55. }
      56. }
      Der Try-Catch kam halt grad dazu. Das wird aber ja nicht ausgelöst.
      Bilder
      • Unbenannt.png

        120,78 kB, 1.360×768, 260 mal angesehen

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

      Und dann gehst du auf Details anzeigen und dann klappst du die Innerexception auf. Wenn es eine ArgumentOutOfRange-Exception beim Konstruktor von DataAvailableEventArgs ist, dann habe ich den Fehler. Wasapi sagt es gibt daten, aber es gibt gar keine Daten :P. Wie auch immer. Poste jedenfalls bitte den Fehler. Und nein du kannst den Fehler nicht in einem Try-Catch abfangen, da es in einem anderen Thread läuft um welchen du kein Try-Catch machen kannst. Wenn kein Debugger dran gestöpselt ist, kommt auch keine Exception sondern wird nur das Stopped Ereignis ausgelöst und die Ressourcen freigegeben.

      Btw: Ein Fehler geht auf deine Kappe. Du musst die WaveWriter disposen. Im DataChunk in der WaveDatei muss stehen wie lange die Datei ist. Dies kann der WaveWriter aber erst wissen wenn alles drinnen ist was rein soll. Und das wird dann rein geschrieben wenn du den WaveWriter frei gibst. Manchen playern(unter anderem auch cscore) ist es egal ob das drinnen steht. Dem wmp ist es aber offensichtlich nicht egal.

      Dass die beiden Wave-Dateien nicht gleich groß sind, ist absolut logisch. Du nimmst von zwei verschiedenen Geräten auf. Diese haben in der Mixerengine verschiedene Formate und wenn z.B. dein Micro ne höhere Samplerate hat, dann hast du mehr Samples und somit auch mehr bytes.


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

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