Wie kann ich den Druck von Zeichenfolgen in der Windows -Eingabeaufforderung, die FPS eines Videos zu entsprechen, richtC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie kann ich den Druck von Zeichenfolgen in der Windows -Eingabeaufforderung, die FPS eines Videos zu entsprechen, richt

Post by Anonymous »

Ich habe einen ASCII -Videoplayer erstellt, der in der Windows -Eingabeaufforderung ausgeführt wird. Ich habe jedoch Probleme damit, dass die Frames mit der gleichen Geschwindigkeit (FPS) wie das Originalvideo drucken. In Echtzeit war zu ineffizient, also arbeitete ich daran, diese Methoden zu optimieren, und dachte sogar, ich habe sie dazu gebracht, das ASCII -Video schneller zu sein, scheint immer noch zu langsam zu sein. So füge ich eine Verzögerung hinzu: < /p>
Thread.Sleep((int)frameDelay);
< /code>
wobei "FramedElay": < /p>
lautetdouble fps = (int)capture.Get(Emgu.CV.CvEnum.CapProp.Fps);
double frameDelay = 1000 / fps;
< /code>
Mit dieser Verzögerung kann ich sehen, dass das ASCII -Video etwas langsamer ist als das Originalvideo, was bedeutet, dass es nicht funktioniert, wenn ich Audio hinzufügen wollte, da die beiden nicht synchronisiert werden. /p>
, um wirklich zu verstehen, ob es mein Programm ist, das zu langsam ist. Ich habe beschlossen, alle ASCII -Frames in eine Textdatei zu speichern und dann den Video -Player erneut auszuführen, diesmal jedoch nicht, indem ich jede verarbeitet habe Rahmen und konvertieren sie in ASCII -Kunst in Echtzeit, aber einfach durch Extrahieren aus dieser Datei.int bytesPerLine = 61; // 60 characters (1 byte under UTF-8) + 1 \n character
StringBuilder buffer = new StringBuilder();

using (FileStream ASCIIStream = new FileStream(@"TEXT FILE PATH", FileMode.Open, FileAccess.Read))
{
for (int currLine = 0; currLine < 90630; currLine += 45)
{
if (currLine != 0)
{
updateFrame(frameSize.Height); // frameSize = (60, 45), see updateFrame definition below
buffer.Clear();
}

long byteOffset = bytesPerLine * currLine;

ASCIIStream.Seek(byteOffset, SeekOrigin.Begin);

using (StreamReader reader = new StreamReader(ASCIIStream, Encoding.UTF8, leaveOpen: true))
{
for (int i = 0; i < 45; i++)
{
string line = reader.ReadLine();
buffer.AppendLine(line);
}

Console.WriteLine(buffer.ToString());
Thread.Sleep((int)frameDelay); // I am losing my will to live
}
}
}
< /code>
Der Zweck davon war zu sehen, was mit der massiven Leistungssteigerung passieren würde. Wie erwartet würde das gesamte ASCII -Video ohne Verzögerung in wenigen Sekunden abgeschlossen (das Beispielvideo ist 1 Minute und 10 Sekunden lang). Als ich jedoch die gleiche Verzögerung wieder eintrat, werden die Rahmen in der Eingabeaufforderung immer noch zu langsam gedruckt. < /p>
Jetzt weiß ich einfach nicht, was ich denken soll. Ist es ein Problem mit Thread.sleep? Ist das Rendering in der Eingabeaufforderung zu langsam? Berechne ich die Verzögerung nicht korrekt?private void updateFrame(int y)
{
for (int i = 0; i < y; i++)
{
// Move cursor up by 'y' lines
Console.Write("\u001b[" + y + "A");

// Clear the line
Console.Write("\u001b[K");

}

//Return cursor to the start of the line
Console.Write("\r");
}
< /code>
(Ich habe auch mit console () () ausprobiert. /p>
Schnelle Randnotiz < /H2>
Ich habe gesehen gleiche Geschwindigkeit wie die Originalvideo. Ganz zu schweigen davon, dass er die ASCII -Frames mit einer höheren Auflösung gedruckt hat (ich drucke meine bei 60x40). Dies ist das fragliche Video:

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post