CSCore - Highperformance Audiobibliothek

    • Release
    • Open Source

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

      Das war auch schon eine Idee, die ich hatte.
      Hatte es schon mit dem Timeout probiert
      Der responseStream hat ja schon ein Timeout gesetzt.
      Habe auch schon versucht beim request einen Timeout einzusetzen - ohne Erfolg.
      Er gibt leider auch keinen anderen Fehler zurück.

      Das komische ist, dass wenn der Server z.B. auf Port 8000 liegt
      127.0.0.1:8005 o.ä. eine Exception verursacht (dort liegt ein weiterer Server) aber
      127.0.0.1 alleine oder
      127.0.0.1:80 nicht.

      :/
      Hallo ich bin neu im Forum.
      Ich versuche mit CsCore ein Programm zum splitten von aufgenommen Audio Dateien zu erstellen. Benutze dabei WasapiOut. Funktioniert für Wav und Mp3 Dateien. Wenn ich aber AAC Dateien abspielen will stürzt das Programm mit dem Fehler
      IAudioClient::Initialize caused an error: 0x88890008, "Unknown HRESULT".

      ab. Benutze ich WavOut tritt dieser Fehler nicht auf.
      Der Unterschied zu anderen Files liegt im WaveFormat wenn ich vorher zu Stereo wandle gibt es auch bei WasapiOut kein Fehler:
      WaveFormat der Audio Datei:

      C#-Quellcode

      1. {ChannelsAvailable: 6|SampleRate: 48000|Bps: 1152000|BlockAlign: 24|BitsPerSample: 32|Encoding: Extensible|SubFormat: 00000003-0000-0010-8000-00aa00389b71|ChannelMask: SpeakerFrontLeft, SpeakerFrontRight, SpeakerFrontCenter, SpeakerLowFrequency, SpeakerBackLeft, SpeakerBackRight}

      Was kann ich tun um auch multichannel files mit WasapiOut zu verarbeiten?
      Mein Beispiel:

      C#-Quellcode

      1. using CSCore;
      2. using CSCore.Codecs;
      3. using CSCore.CoreAudioAPI;
      4. using CSCore.SoundOut;
      5. using CSCore.Streams;
      6. using System;
      7. using System.Diagnostics;
      8. using System.Drawing;
      9. using System.Linq;
      10. using System.Windows.Forms;
      11. namespace AudioSplit
      12. {
      13. public partial class Form1 : Form
      14. {
      15. private IWaveSource waveSource;
      16. LoopStream loopStream;
      17. private NotificationSource _notificationSource;
      18. private ISampleSource _sampleSource;
      19. private WasapiOut _soundOut = new WasapiOut();
      20. public Form1()
      21. {
      22. InitializeComponent();
      23. _soundOut.UseChannelMixingMatrices = true;
      24. }
      25. private void button1_Click(object sender, EventArgs e)
      26. {
      27. PlayFile(@"D:\Eigene Dateien\Music\Audio.aac");
      28. }
      29. public void PlayFile(String file)
      30. {
      31. var selectedDevice = MMDeviceEnumerator.EnumerateDevices(DataFlow.Render, DeviceState.Active).First();
      32. var client = AudioClient.FromMMDevice(selectedDevice);
      33. _soundOut.Stop();
      34. if (_notificationSource != null)
      35. _notificationSource.Dispose();
      36. var source = CodecFactory.Instance.GetCodec(file);
      37. var ok = client.IsFormatSupported(AudioClientShareMode.Shared, source.WaveFormat, out WaveFormat wavfmt);
      38. _sampleSource = source.ToSampleSource();
      39. //_sampleSource = _sampleSource.ToStereo();
      40. //source.Position = 0;
      41. _notificationSource = new NotificationSource(_sampleSource) { Interval = 100 };
      42. _notificationSource.BlockRead += (o, args) =>
      43. {
      44. // UpdatePosition();
      45. };
      46. waveSource = _notificationSource.ToWaveSource();
      47. // Error with this waveformat
      48. //_waveFormat = {ChannelsAvailable: 6|SampleRate: 48000|Bps: 1152000|BlockAlign: 24|BitsPerSample: 32|Encoding: Extensible|SubFormat: 00000003-0000-0010-8000-00aa00389b71|ChannelMask: SpeakerFrontLeft, SpeakerFrontRight, SpeakerFrontCenter, SpeakerLowFrequency, SpeakerBack...
      49. loopStream = new LoopStream(waveSource);
      50. _soundOut.Initialize(waveSource);
      51. _soundOut.Play();
      52. }
      53. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
      54. {
      55. loopStream.Dispose();
      56. _soundOut.Stop();
      57. }
      58. private void button2_Click(object sender, EventArgs e)
      59. {
      60. _soundOut.Stop();
      61. }
      62. private void Form1_FormClosed(object sender, FormClosedEventArgs e)
      63. {
      64. Environment.Exit(Environment.ExitCode);
      65. }
      66. }
      67. }
      In den Screenshots steuert er die Lautstärke des Musikplayers, nicht direkt der Anwendung
      Mfg: Gather
      Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


      Ja, du hast recht, mein Fehler. Könntest du dir, wenn es keine zu großen Umstände mach, meinen Thread noch einmal anschauen, ich hatte dir dort eine Antwort hinterlassen ;)

      Vollzitat entfernt. ~Thunderbolt
      ?(

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

      Du kannst die Lautstärke von Anwendungen steuern.
      Anwendungen sind "Sessions". Wie du die Lautstärke dieser steuern kannst, kannst du hier abschauen: github.com/filoe/cscore/blob/m…AudioSessionTests.cs#L142


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

      Hab nun auch mal deine Lib getestet.
      Erstmal wirklich super Leistung und einer der besten AudioLibs :)

      Bis jetzt konnte ich alles super nachbauen und hat perfekt funktioniert.
      Jedoch wollen die Funktionen mit der SoundTouch.dll nicht funktionieren.
      Entweder man merkt keinen Unterschied am Song und/oder es hört einfach auf zu spielen.

      Gibt es da aktuell irgendwelche Infos?
      Hallo zusammen,

      das erste mal überhaupt muss ich mich mit Audioverarbeitung beschäftigen und fand nun dieses wunderbare CSCore, danke dafür!
      Um ganz ehrlich zu sein, ich brauche nur eine einzige Funktion und mir fällt es schwer, mich in CSCore einzuarbeiten.
      Es geht bei mir ausschließlich um einen kleinen Spectrumanalyzer mit 2x16 Bars für den linken und rechten Kanal eines Stereosignals.
      Ich benutze nicht die Technologie über ein dynamisches Image für eine ImageBox, wie in cscore\Samples\WinformsVisualization gezeigt, sondern habe ein eigenes Control, dass für die fest vorgegebenen 16 Bars nur eine Liste mit den Bar-Values benötigt.

      Darum habe ich die schöne Programmstruktur im Beispielprojekt so gelassen und nur in der LineSpectrum.cs die Methode CreateSpectrumLine für meine Zwecke überladen:
      Spoiler anzeigen

      C#-Quellcode

      1. public List<int> CreateSpectrumLine(int maxValue) {
      2. if (!UpdateFrequencyMappingIfNessesary(new Size(240, maxValue)))
      3. return null;
      4. List<int> barData = new List<int>();
      5. var fftBuffer = new float[(int)FftSize];
      6. //get the fft result from the spectrum provider
      7. if (SpectrumProvider.GetFftData(fftBuffer, this)) {
      8. //prepare the fft result for rendering
      9. SpectrumPointData[] spectrumPoints = CalculateSpectrumPoints(maxValue, fftBuffer);
      10. // Add calculated points to list.
      11. for (int i = 0; i < spectrumPoints.Length; i++) {
      12. SpectrumPointData p = spectrumPoints[i];
      13. barData.Add((int)p.Value);
      14. }
      15. return barData;
      16. }
      17. return null;
      18. }



      Das funktioniert einwandfrei:


      Mein Control erwartet zwei Listen, eine für den linken Kanal, eine für den rechten Kanal.
      Da ich nur die FFT für beide Kanäle zur Verfügung habe, ist die Ausgabe wie zu sehen momentan gleich für beide Kanäle.

      Meine Frage: wie bekomme ich z.B. im Beispielprojekt cscore\Samples\WinformsVisualization beide Stereokanäle für die FFT?
      Für einen kleinen Schubs in die richtige Richtung wäre ich sehr dankbar!