Хорошо, поэтому я сделал видеоплеер ASCII, который работает в командной строке Windows, однако у меня возникают проблемы с тем, чтобы распечатать кадры на той же скорости (FPS), что и оригинальное видео. Сначала я думал, что мои методы преобразования видео кадров в ASCII Art в режиме реального времени были слишком неэффективными, поэтому я работал над оптимизацией этих методов и даже думал, что я стал быстрее, что видео ASCII все еще кажется слишком медленным. Вот как я добавляю задержку: < /p>
Thread.Sleep((int)frameDelay);
< /code>
Где "Framedelay": < /p>
double fps = (int)capture.Get(Emgu.CV.CvEnum.CapProp.Fps);
double frameDelay = 1000 / fps;
< /code>
С этой задержкой я вижу, что видео ASCII немного медленнее, чем оригинальное видео, что означает, что если я хочу добавить аудио, оно не будет работать, поскольку оба не будут синхронизировать. Поэтому, чтобы по -настоящему понять, является ли это моей программой, которая слишком медленная, я решил сохранить все кадры ASCII в текстовый файл, а затем снова запустить видеоплеер, но на этот раз не обрабатывая каждый кадр и преобразовав их в искусство ASCII в режиме реального времени , но скорее просто извлечение их из указанного файла. Я достиг этого с этим подходом: < /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>
Цель этого состояла в том, чтобы увидеть, что произойдет с массовым повышением производительности. Как и ожидалось без задержки, все видео ASCII закончится через несколько секунд (образец видео составляет 1 минуту и 10 секунд), однако, когда я добавил ту же задержку обратно, кадры все еще напечатаны слишком медленно в командной строке. Теперь я просто не знаю, что думать. Это проблема с Thread.sleep? Рендеринг в командной строке слишком медленной? Я не вычисляю задержку правильно? Мне нужна какая -то помощь, ребята, любые предложения оценены.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>
(я также попробовал console.clear (), однако, казалось, было странное мерцание на экране, когда я использовал ее, поэтому я просто решил очистить линию кадров по линии). /p>
Quick Side Примечание: < /p>
Я видел, как YouTuber сделал эту точную программу, но в C ++ и его расчет задержки был таким же, как и у меня, и его сбежали точно Та же скорость, что и оригинал видео Не говоря уже о том, что он напечатал кадры ASCII с более высоким разрешением (я печатаю на моем 60x40). Если кто -то заинтересован, это видео:
Подробнее здесь: https://stackoverflow.com/questions/794 ... rompt-to-m
Как я могу правильно отложить печать строк в командной строке Windows, чтобы соответствовать FPS видео? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение