Хорошо, поэтому я сделал видеоплеер 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#
Место общения программистов C#
1740027269
Anonymous
Хорошо, поэтому я сделал видеоплеер 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). Если кто -то заинтересован, это видео: [youtube]xp6j7m7rqbc[/youtube]
Подробнее здесь: [url]https://stackoverflow.com/questions/79453372/how-can-i-correctly-delay-the-printing-of-strings-in-windows-command-prompt-to-m[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия