CSCore - Abspielen funktioniert nicht

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Alex-Digital.

    CSCore - Abspielen funktioniert nicht

    Hallo,

    ich habe mir die CSCore-Lib von thefiloe angesehen und
    ich war überzeugt, damit vielleicht ein Programm zu schreiben.

    Ich habe es mit dem Beispiel mit der Konsole ausprobiert und
    das hat funktioniert.

    Dann wollte ich eine WinForms-Anwendung erstellen, hab eine
    MenüStrip benutzt und lade mit einem OpenFileDialog zuerst
    den Dateinamen und dann wenn ich auf einen Button klicke,
    soll die MP3-Datei abgespielt werden.

    Dazu habe ich mir einen Code zusammengebastelt:

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. public String filename;
    4. public Form1()
    5. {
    6. InitializeComponent();
    7. }
    8. private void öffnenToolStripMenuItem_Click(object sender, EventArgs e)
    9. {
    10. openFileDialog1.ShowDialog();
    11. filename = openFileDialog1.FileName;
    12. }
    13. private void button1_Click(object sender, EventArgs e)
    14. {
    15. ISoundOut soundOut;
    16. using (soundOut = new DirectSoundOut())
    17. {
    18. //String newfilename = filename.Replace("\\", "/");
    19. soundOut.Initialize(CodecFactory.Instance.GetCodec(filename));
    20. soundOut.Play();
    21. }
    22. }
    23. }


    Ich habe drei Varianten ausprobiert:

    1. Ganz normal den Dateinamen aus openFileDialog.FileName benutzen.

    2. Weil C# Escapesequenzen unterstützt, musste das "\" in "\\" geändert werden
    und habe es mit Replace("\\","/") in "/" umgeändert.

    3. Habe den Dateipfad mit "/" anstatt "\" manuell geschrieben.

    In Konsolenanwendung habe ich die 3. Variante verwendet und es hat funktioniert.
    In WinForms-Anwendung haben alle 3 Varianten nichts gebracht. :(

    Wieso funktioniert das Abspielen bei WinForms-Anwendungen nicht?

    Ich hoffe, jemand kann mir helfen.

    Freue mich auf Antworten.

    MFG

    Alex-Digital :D
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    Frag im Thread zu der Lib und warte einfach bis er antwortet. Ist ja nicht so, dass er nicht aktiv wäre.
    Der using Block ruft automatisch Dispose() vom DirectSoundOut auf. Dieses wiederum ruft Stop() auf, gibt alle Ressourcen frei und schließt den FileStream der Source.
    Du kannst dir mal das WPF-Beispielprojekt anschauen. Ich habe dort auch nur einfach ein Codebehind verwendet und somit kann man dies recht einfach auf Winforms anwenden.

    Noch ganz kurz der Unterschied zu der Konsole und der Form. In der Konsole war nach soundOut.Play() noch ein Console.ReadKey() oder etwas vergleichbares(weiß nicht genau). Dort hält das Programm solange an bis du eine Taste drückst. Wenn du jedoch eine Taste drückst wird zuerst die Ausgabe beendet und das Programm schließt sich. Wenn du das so schreibst wie du es geschrieben hast, wird es bei Play() abgespielt und rauscht durch, der using Block schließt sich, die Ausgabe wird beendet und du hörst logischer weise nichts oder bei einem Lag vll. für einen Bruchteil einer Sekunde etwas.

    Du kannst den Code z.B. so anpassen:

    Quellcode

    1. public partial class Form1 : Form
    2. {
    3. private ISoundOut _soundOut;
    4. private IWaveSoure _source;
    5. public Form1()
    6. {
    7. InitializeComponent();
    8. }
    9. private void öffnenToolStripMenuItem_Click(object sender, EventArgs e)
    10. {
    11. if(openFileDialog1.ShowDialog() == DialogResult.OK)
    12. {
    13. Stop(); //falls läuft erstmal stoppen
    14. _source = CodecFactory.Instance.GetCodec(openFileDialog1.FileName);
    15. if (WasapiOut.IsSupportedOnCurrentPlatform) // > Vista
    16. {
    17. _soundOut = new WasapiOut(false, CSCore.CoreAudioAPI.AudioClientShareMode.Shared, 100);
    18. }
    19. else // < Vista
    20. {
    21. _soundOut = new DirectSoundOut() { Latency = 100 };
    22. }
    23. _soundOut.Initialize(_source);
    24. }
    25. }
    26. private void button1_Click(object sender, EventArgs e)
    27. {
    28. if(_soundOut != null && _soundOut.PlaybackState != PlaybackState.Playing)
    29. {
    30. _soundOut.Play();
    31. }
    32. }
    33. private void Stop()
    34. {
    35. if(_soundOut != null)
    36. {
    37. _soundOut.Dispose();
    38. _soundOut = null;
    39. }
    40. if(_source != null)
    41. {
    42. _source.Dispose();
    43. _source = null;
    44. }
    45. }
    46. }


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

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