CSCore - Highperformance Audiobibliothek

    • Release
    • Open Source

    Es gibt 588 Antworten in diesem Thema. Der letzte Beitrag () ist von n1nja.

      Ja hab ich entpackt. Onboardkarte. Hatte damit auch nie Probleme.
      Danke für das Feedback.
      Mp3 müsste ab xp laufen.
      Streams werden halt nur mp3-streams unterstützt zur Zeit. Bugs werde ich mir danach ansehen. WASAPI Loopbackcapture kenne ich und ist auch geplant. Vll. mach ich das heute noch schnell mal schauen. Derzeit bin ich aber an nem ogg-vorbis decoder dran welcher dann doch auch bisschen Zeit frisst :D.

      Wie auch immer werde mir die "Bugs" anschließend mal ansehen und schauen was sich machen lässt. Habe leider nicht wirklich die Möglichkeit auf vielen verschiedenen Systemen zu testen, deshalb bin ich auch für Feedback so dankbar.

      EDIT: Die MP3-Datei habe ich bereits ausprobiert. Win8 x64 und läuft ohne Probleme. Welcher Fehler tritt denn bei dir genau auf?
      EDIT2: Der Stream läuft bei mir auch wunderbar. Ist in dem Fall auch ein MP3-Stream.

      In persönlich hätte jetzt auf die schnelle keine Idee wo in meinem Code der Fehler liegen könnte.
      Ich hatte schon mal so einen ähnlichen Fall bei Windows XP. Dort hat auch MP3 nicht funktioniert. Das lag damals aber am System, da der Frauenhofer MP3 ACM Codec nicht vorhanden oder beschädigt war. Ich muss leider auf ACM zurückgreifen, da ich bei einem eigenen Decoder Lizenzgebühren bezahlen müsste. Kannst du vll. mal nachschauen ob du den Frauenhofer MP3 ACM Codec installiert hast?
      Dazu am einfachsten den Windows Media Player öffnen. Nun Alt drücken und es öffnet sich ein Dropdown. In diesem Dropdown nun den Unterpunkt Hilfe > Info auswählen. Es öffnet sich ein kleines Fenster welches einen Link mit Namen "Informationen für technischen Support" beinhalten sollte. Anklicken und es öffnet sich eine Datei im Browser. Dort in der Liste unter dem Unterpunkt Audiocodecs nachschauen ob du folgenden Eintrag hast:
      ACMFraunhofer IIS MPEG Layer-3 Codec (decode only)0055l3codeca.acm1.9.0.401
      Ansonsten müssten in der aktuellen Version noch bescheidene Logfiles erstellt werden. In der kommenden Version werden diese zwar verschwunden sein aber schau vll. mal nach ob da was drinnen steht.


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

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

      Hallo,

      kann jemand mir ein Beispiel geben, wie man einen Stream abspielen kann?

      @thefiloe:

      Könntest du, wenn es geht, die Projekte auch für VS 2010 zu Verfügung stellen,
      weil ich kann die Projekte nicht öffnen.

      MFG

      Alex-Digital :D
      ~ Alex-Digital :D

      if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
      Hallo,

      habe die .csproj geöffnet und er sagt mir:

      "Visual Studio 2010" schrieb:

      Dieses Projekt ist nicht mit dieser Version kompatibel.


      Und wie kann ich wenn ich eine Stream-URL habe,
      dieses dann in ein Stream umwandeln, um es abspielen zu können?

      MFG

      Alex-Digital :D
      ~ Alex-Digital :D

      if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
      Dann hast du warscheinlich visual Basic 2012 whatever und nicht visual Studio.
      KEINE FRAGEN ÜBER VB PER PN - DIESE WERDEN IGNORIERT UND LANDEN IM PAPIERKORB

      Ich habe kein Visual Studio 2010 mehr. Deshalb wird dies schwierig. Jedoch könntest du dir so oder so die neue Version laden, da diese meiner Meinung nach sehr große Verbesserungen beinhaltet( <- offtopic ). Oder du öffnest einfach die .csproj was eigentlich weiterhin funktionieren müsste. Wenn nicht kannst du als letzer Ausweg auch die Dateien manuell zu einem Projekt hinzufügen was auch nicht das große Problem sein sollte, da die Projekte so oder so nicht mehr als ein paar Dateien beinhalten.


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

      In welchem Namespace befindet sich das Peak auslesen?

      Und wie kann ich einen Radiostream abspielen?

      Freue mich auf Antworten.

      MFG

      Alex-Digital :D
      ~ Alex-Digital :D

      if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
      Hallo,

      zu a)

      Bei mir funktioniert der Peakmeter nicht.
      Die Progressbars bewegen sich nicht.

      Habe ich etwas vergessen?

      C-Quellcode

      1. private void button1_Click(object sender, EventArgs e)
      2. {
      3. ISoundOut soundOut = new DirectSoundOut();
      4. //String newfilename = filename.Replace("\\", "/");
      5. var stream = new CSCore.Codecs.MP3.Mp3WebStream("http://pub4.di.fm:80/di_epictrance", false);
      6. PeakMeter peak = new PeakMeter(stream);
      7. peak.BlockRead += BlockRead;
      8. soundOut.Initialize(stream);
      9. soundOut.Play();
      10. }
      11. private void BlockRead(object sender, BlockReadEventArgs e)
      12. {
      13. peakLeft.Value = (int)(e.MaxLeftPeak * peakLeft.Maximum);
      14. peakRight.Value = (int)(e.MaxRightPeak * peakRight.Maximum);
      15. }



      zu b) Danke, es hat funktioniert.

      Freue mich auf Antworten.

      MFG

      Alex-Digital :D
      ~ Alex-Digital :D

      if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
      soundOut.Initialize(peak.ToWaveSource(16));

      Du musst auch mit dem peak initialisieren. Der Grund: Du kannst verschiedene Elemente verketten. Am einen Ende ist z.B. eine Datei von der gelesen wird und am anderen die Ausgabe durch die Lautsprecher. Dazwischen könnte z.B. ein Effekt, ein Peakmeter, etc. stehen. Diese Elemente werden verkettet. In deinem einfachen Beispiel wird ein Mp3WebStream mit einem Peakmeter verkettet. Damit aber auch das Peakmeter zum Einsatz kommt musst du auch das letze Glied der Kette initialisieren. In diesem Fall ist das das Peakmeter. Denn DirectSoundOut liest vom Peakmeter, welches wieder vom Mp3WebStream liest. Wenn DirectSoundOut vom Mp3WebStream liest, kommt nie die Klasse Peakmeter zum Einsatz. Zur Vorstellung: Du hast eine Kette und an beiden Enden wird gezogen. Damit diese auf der ganzen Länge belastet wird musst du auch von beiden Enden aus ziehen. Wenn du nur von einem Ende aus und von der Mitte der Kette ziehst wird die Hälfte der Kette unbelastet bleiben.

      Außerdem wenn ich dir schon einen Code poste wo die derzeit empfohlene Vorgehensweise zum Erstellen eines SoundOuts gezeigt wird, solltest du diese auch vll. verwenden.


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

      @thefiloe:

      Es gibt bei dem Peakmeter kein ToWaveSource.

      MFG

      Alex-Digital :D
      Bilder
      • Bild1.PNG

        3,29 kB, 326×81, 134 mal angesehen
      • Bild2.PNG

        7,03 kB, 408×86, 125 mal angesehen
      ~ Alex-Digital :D

      if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
      Importiere den Namespace CSCore. In diesem befindet sich eine Utils-Klasse welche einige Extensions beinhaltet.
      Dies erspart dir das ganze herumhantieren mit verschiedenen Streams etc.

      Außerdem würde ich wenn du beim WebStream kein async verwendet einen Try-Catch Block verwenden. a) Könnte es sich um keinen MP3-Stream handeln und b) Könnten Web-Exceptions fliegen. Diese muss man abfangen.


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

      jetzt geht das ToWaveSource, aber jetzt
      wird eine InvalidOperationException geworfen
      (siehe Anhang)

      MFG

      Alex-Digital :D
      Bilder
      • Bild.PNG

        36,75 kB, 964×292, 168 mal angesehen
      ~ Alex-Digital :D

      if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
      Wie Artentus schon gesagt hat, hat dies nichts mit der Lib zu tun. Du musst natürlich erst Invoken. Das ist aber auch im Beispiel "Recorder" so gemacht.


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
      Sehr coole Bibliothek, respekt für die Arbeit und Leistung ersteinmal von meiner Seite dafür.

      Ich hab allerdings das Problem, dass immer, wenn ich SoundOut initaliesieren möchte, eine System.AccessViolationException geworfen wird... Die IDE zeigt das ganze als fehler in deiner .dll an, die ich dementsprechend nur schwer debuggen kann :/
      Somit stellt sich mir die Frage, ob ich einfach was verbockt habe, oder es ein Bug in der Lib ist. Das Beispiel Projekt funktioniert auch nur sporadisch in 50% der Fälle. In den anderen 50% tut sich Nix. Weder wird ein SOund abgespielt, noch erscheint eine Visualisierung

      Das Log-File vom Crash

      Spoiler anzeigen


      [DEBUG]: ID3v2.Parse(Stream, bool): No ID3v2 Header found.
      [FATAL]: Mp3Frame.FindFrame(Stream): Stream EOF.
      [DEBUG]: AcmBufferConverter.ctor(WaveFormat, WaveFormat, IntPtr: [MMSYSERR_NOERROR]: acmStreamOpen



      Und ein Auszug aus dem C# Quellcode
      Spoiler anzeigen

      Quellcode

      1. ISoundOut _soundout = null;
      2. public MainWindow()
      3. {
      4. InitializeComponent();
      5. CSCore.Context.Current.CreateDefaultLogger();
      6. if (WasapiOut.IsSupportedOnCurrentPlatform) // > Vista
      7. {
      8. _soundout = new WasapiOut(false, CSCore.CoreAudioAPI.AudioClientShareMode.Shared, 100);
      9. }
      10. else // < Vista
      11. {
      12. _soundout = new DirectSoundOut() { Latency = 100 };
      13. }
      14. }
      15. private void btPlayPause_Click(object sender, RoutedEventArgs e)
      16. {
      17. _soundout.Initialize(CodecFactory.Instance.GetCodec(@"F:\MP3Files\Eingang\GhostBusters - Ska_Theme.mp3"));
      18. _soundout.Play();
      19. }


      Ich wünsche noch ein schönes Wochende
      Gruß Christian

      Edit:
      So, ich hab nochmal volgenden simplen Code auspobiert, der ebenfalls mit dem selben Fehlerbild abbricht...
      Spoiler anzeigen

      Quellcode

      1. class Program
      2. {
      3. static void Main(string[] args)
      4. {
      5. IWaveSource _in = CodecFactory.Instance.GetCodec(@"F:\MP3Files\Eingang\GhostBusters - Ska_Theme.mp3");
      6. ISoundOut _out;
      7. if (WasapiOut.IsSupportedOnCurrentPlatform) // > Vista
      8. {
      9. _out = new WasapiOut(false, CSCore.CoreAudioAPI.AudioClientShareMode.Shared, 100);
      10. }
      11. else // < Vista
      12. {
      13. _out = new DirectSoundOut() { Latency = 100 };
      14. }
      15. _out.Initialize(_in);
      16. _out.Play();
      17. Console.ReadKey();
      18. }
      19. }


      Edit2:
      So und zu guter letzte: Wenn ich zum Testen nicht Wasapi sondern DirectSound benutze, so funktioniert alles wie Erwünscht... Ich denke daher, dass der Fehler höchstwahrscheinlich irgendwo in der Wasapi Umsetzung schlummert...

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Zakath“ ()

      Hi

      Mein Kompliment das Beispielprojekt funktioniert echt hervorragend :thumbup: . Das einzige was mir aufgefallen ist manchmal "hängen" die Visualisierungen ein wenig nach. Aber ansonsten echt gut. Das hast du nur mit DirectSoundOut hingekriegt? Respekt :thumbup:

      8-) faxe1008 8-)
      So war jetzt im Urlaub und konnte deshalb hier nicht antworten.
      @Zakath könntest du mir vll. noch den Stacktrace und die Innerexception falls vorhanden posten? Ich persönlich wüsste jetzt nicht wo ich WASAPI verbockt haben sollte. Bei mir ist auch noch nie ein Fehler aufgetreten. Spontan hätte ich jetzt, dass der Postcompiler die Offsets der Cominterface-Pointer falsch berechnet, da jedoch DirectSound zu funktionieren scheint kann ich es mir ehrlich gesagt nicht erklären(vll. wird irgendwo eine Struktur nicht richtig gemarshalt).
      Ansonsten welches System besitzt du(Name und x64 oder x86?) und welche Buildconfig hat dein Projekt? x64, x86 oder Any CPU.

      @faxe1008 die Visualierungen sind teilweise nicht wirklich optimal implementiert. Das Problem mit dem nachhängen ist mir bei etwas schwächeren Rechnern bewusst. Die Ursache ist, dass die Visualisierung async. gezeichnet wird um keine Verzögerungen und somit Knistern in der Ausgabe zu erzielen. Da es jedoch ganz simpel durch BeginInvoke async ausgeführt wird und ich noch kein Synchronisierung erstellt habe, kann es zu kleineren Verzögerungen in der Darstellung kommen. Es müsste aber auch schon reichen die FPS also quasi die Aktualisierungsrate zu beschränken.


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

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