4 Stimmen

Lückenlose Audiowiedergabe (Schleifen) mit DirectX in C#

Ich verwende derzeit den folgenden Code (C#):

    private static void PlayLoop(string filename)
    {
        Audio player = new Audio(filename);
        player.Play();
        while (player.Playing)
        {
            if (player.CurrentPosition >= player.Duration)
            {
                player.SeekCurrentPosition(0, SeekPositionFlags.AbsolutePositioning);
            }
            System.Threading.Thread.Sleep(100);
        }
    }

Dieser Code funktioniert, und die Datei, die ich abspiele, läuft in einer Schleife. Aber natürlich gibt es eine kleine Lücke zwischen den einzelnen Wiedergaben.

  • Ich habe versucht, den Thread.Sleep auf 10 oder 5 zu reduzieren, aber die Lücke bleibt.
  • Ich habe auch versucht, es komplett zu entfernen, aber dann steigt die CPU-Auslastung auf 100 % und es bleibt eine kleine Lücke.

Gibt es eine (einfache) Möglichkeit, die Wiedergabe in DirectX lückenlos zu gestalten? Es ist keine große Sache, da es sich nur um ein persönliches Projekt handelt, aber wenn ich etwas Dummes oder etwas völlig Falsches tue, würde ich es gerne wissen.

Vielen Dank im Voraus.

2voto

Paul Ruane Punkte 35712

Das Problem bei Ihrem Ansatz ist, dass Sie einen Thread laufen haben, der die Position des Spielers überprüft. Je länger Sie den Ruhezustand verlängern, desto weniger CPU wird verbraucht, aber desto später wird er das Ende des Clips bemerken. Je kürzer der Schlaf, desto schneller wird es bemerken, aber desto mehr CPU Ihre Checker-Thread verbraucht.

Ich kann in den Unterlagen nichts finden, was den Clip in eine Schleife schickt. Der einzige Vorschlag, den ich habe, ist, das Audio.Ending-Ereignis zu verwenden, um die Wiedergabe des Clips erneut zu starten. Dies wird die Notwendigkeit für Ihre separate Überwachung Thread entfernen, aber ich bin nicht sicher, ob dies schnell genug, um die Lücke zu beseitigen sein wird.

Sie sollten auch darauf achten, dass Ihr Audioclip nicht mit einer Stille beginnt oder endet.

0voto

Da Sie die Dauer des Liedes kennen, verwenden Sie einfach einen Timer, um die Methode "Zurückspulen" regelmäßig aufzurufen, und geben Sie dem Timer ein Intervall, das etwas kürzer ist als die tatsächliche Dauer des Liedes.

private static void PlayLoop(string filename)
{
    Audio player = new Audio(filename);
    player.Play();

    //System.Timers.Timer (i reduce the length by 100 ms to try to avoid blank)
    var timer = new Timer((player.Duration - TimeSpan.FromMilliseconds(100)).TotalMilliseconds());
    timer.Elapsed += (sender, arg) =>
    {
        player.SeekCurrentPosition(0, SeekPositionFlags.AbsolutePositioning);
    };
    timer.Start();
}

Natürlich müssen Sie den Timer anhalten, also machen Sie ihn zu einem Instanzmitglied und nicht zu einer lokalen Variable Ihrer Methode, damit Sie ihn mit einer Stop()-Methode deaktivieren können.

Ich hoffe, das hilft Ihnen weiter. Manitra

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X