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

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

Post by Guest »

Okay, also habe ich einen ASCII -Video -Player erstellt, der in der Windows -Eingabeaufforderung ausgeführt wird. Ich habe jedoch Probleme in Bezug auf die Drucken der Frames mit der gleichen Geschwindigkeit (FPS) wie das Originalvideo. Zuerst dachte ich, dass meine Methoden, Videorahmen in Echtzeit in Echtzeit in Echtzeit umzuwandeln, zu ineffizient waren, also arbeitete ich daran, diese Methoden zu optimieren, und dachte sogar, ich hätte sie dazu gebracht, schneller zu sein, dass das ASCII -Video immer noch zu langsam zu sein scheint. 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. Um wirklich zu verstehen, ob es mein Programm ist, das zu langsam ist, habe ich beschlossen, alle ASCII -Frames in eine Textdatei zu speichern und dann den Videoplayer erneut auszuführen, diesmal jedoch nicht, indem ich jeden Frame verarbeitet und in Echtzeit in ASCII -Kunst konvertierte , sondern einfach durch Extrahieren aus dieser Datei. Ich habe dies mit diesem Ansatz erreicht: < /p>
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. 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 richtig? Ich brauche einige Hilfsmitglieder, alle Vorschläge werden geschätzt.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: < /p>
Ich habe gesehen die gleiche Geschwindigkeit wie das Original Video. Ganz zu schweigen davon, dass er die ASCII -Frames mit einer höheren Auflösung gedruckt hat (ich drucke meine bei 60x40). Wenn jemand interessiert ist, ist dies das fragliche Video:

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post