print background colour black, edited readme slightly

pull/5/head
TheRealOrange 2022-02-22 16:13:17 +08:00
rodzic 88682cecca
commit ebbeb97bed
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: E155025E350A1A4B
3 zmienionych plików z 7 dodań i 6 usunięć

Wyświetl plik

@ -10,19 +10,19 @@ Mileage may vary depending on how fast your terminal is. In my testing, I've fou
.\tvp filename [threshold]
```
The threshold has to be an integer from 0 to 255, and defaults to 10. The threshold affects how much the colour of a certain pixel has to change before it will be redrawn. A lower threshold results in more redraws in most cases, and leads to choppy video.
The threshold has to be an integer from 0 to 255, and defaults to 10. The threshold affects how much the colour of a certain pixel has to change before it will be redrawn. A lower threshold results in more redraws in most cases, and leads to choppy video. Unfortunately I can't be bothered to rewrite this to decode video using FFmpeg so you'll have to build it with OpenCV.
Built on Manjaro with this command:
```sh
g++ src/main.cpp -O3 -o ./bin/tvp `pkg-config --cflags --libs opencv4`
g++ src/main.cpp -O3 -o tvp `pkg-config --cflags --libs opencv4`
```
Below is a preview of how it looks:
![video playing in terminal](./imgs/video.gif)
## how it works
## How it works
This is not a new concept. But most terminal video players I have seen use two pixels per character. The unicode character ▄ (U+2584 lower half block) as the bottom half of the pixel, which can be coloured using the ANSI code for font colour, and the background colour, as the other pixel.
@ -47,3 +47,4 @@ Other optimisations include
- only changing pixels whose colour have changed a certain value
- only inputting the ANSI code for cursor move when the next pixel isnt contiguous
- only inputting the ANSI code for background colour change when the background colour differs significantly (set as a compile option)

Wyświetl plik

@ -168,8 +168,8 @@ int main(int argc, char *argv[]) {
start = std::chrono::high_resolution_clock::now();
videostart = std::chrono::high_resolution_clock::now();
}
printf("\u001b[0;0H");
for (int i = 0; i < w * (msg_y + 1); i++) printf(" ");
printf("\u001b[0;0H\u001b[48;2;0;0;0m");
for (int i = 0; i < curr_w * curr_h; i++) printf(" ");
}
stop = std::chrono::high_resolution_clock::now();
@ -197,7 +197,7 @@ int main(int argc, char *argv[]) {
std::this_thread::sleep_until(std::chrono::microseconds(curr_frame * period - frame10_time/frametimes.size()) + videostart);
}
printf("\u001b[0m\u001b[%d;%dH fps: %5.2f | avg_fps: %5.2f | print: %6.2fms | dropped: %5d | curr_frame: %5d ",
printf("\u001b[%d;%dH\u001b[48;2;0;0;0;38;2;255;255;255m fps: %5.2f | avg_fps: %5.2f | print: %6.2fms | dropped: %5d | curr_frame: %5d ",
msg_y, 0, (double) frametimes.size() * 1000000.0 / frame10_time, avg_fps,
(double) printing_time / 1000.0, dropped, curr_frame);
prevpixelbg[0] = 1000;

BIN
tvp

Plik binarny nie jest wyświetlany.