August 6, 2019

474 words 3 mins read

joelibaceta/video-to-ascii

joelibaceta/video-to-ascii

It is a simple python package to play videos in the terminal using characters as pixels

repo name joelibaceta/video-to-ascii
repo link https://github.com/joelibaceta/video-to-ascii
homepage
language Python
size (curr.) 151663 kB
stars (curr.) 801
created 2018-11-25
license MIT License

header

It’s a simple python package to play videos in a terminal using ASCII characters.

Financial Contributors on Open Collective PyPI version Maintainability contributions welcome HitCount

frames

Requirements

  • Python3
  • PortAudio (Only required for installation with audio support)
  • FFmpeg (Only required for installation with audio support)

Installation

Standard installation

pip3 install video-to-ascii

With audio support installtion

pip3 install video-to-ascii --install-option="--with-audio"

How to use

Just run video-to-ascii in your terminal

$ video-to-ascii -f myvideo.mp4

Options

–strategy Allow to choose an strategy to render the output

strategies

-o –output Export the rendering output to a bash file to share with someone

strategies

-a –with-audio If an installation with audio support was made, you can use this option to play the audio track while rendering the video ascii characters.

How it works

Every video is composed by a set of frames that are played at a certain frame rate.

frames

Since a terminal has a specific number of rows and columns, we have to resize our video to adjust to the terminal size limitations.

frames

To reach a correct visualization of an entire frame we need to adjust the frame height to match the terminal rows, avoiding using more characters than the number of terminal columns.

frames

When picking a character to represent a pixel we need to measure the relevance of that pixel’s color in the frame, based on that we can then select the most appropriate character based on the relative luminance in colorimetric spaces, using a simplify version of the luminosity function.

LuminosityFunction

Green light contributes the most to the intensity perceived by humans, and blue light the least.

This function returns an integer in the range from 0 to 255, we assign a character according to density to show more colored surface for areas with more intense color (highest values).

CHARS_LIGHT 	= [' ', ' ', '.', ':', '!', '+', '*', 'e', '$', '@', '8']
CHARS_COLOR 	= ['.', '*', 'e', 's', '@']
CHARS_FILLED    = ['░', '▒', '▓', '█']

The reduced range of colors supported by the terminal is a problem we need to account for. Modern terminals support up to 256 colors, so we need to find the closest 8 bit color that matches the original pixel in 16 or 24 bit color, we call this set of 256 colors ANSI colors.

frames

colors

Finally, when putting it all together, we will have an appropriate character for each pixel and a new color.

frames

Contributors

Code Contributors

This project exists thanks to all the people who contribute. [Contribute].

Financial Contributors

Become a financial contributor and help us sustain our community. [Contribute]

Or maybe just buy me a coffe

Individuals

Organizations

Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]

comments powered by Disqus