Yes, a 1.77 inch 128x160 display can play video, but with significant limitations that make it impractical for most modern video content. The short answer is that it’s technically possible, but the experience is far from what you’d expect from a standard screen. This display, often based on the ST7735S driver (like the 1.77 inch 128x160 tft display), is designed for static images, text, or simple animations, not full-motion video. Let’s break down the facts, data, and real-world constraints.

Resolution and pixel density: The 128x160 resolution means 128 pixels horizontally and 160 pixels vertically, totaling 20,480 pixels. For comparison, a standard 1080p video has 2,073,600 pixels—about 101 times more. The pixel density is roughly 116 pixels per inch (PPI) for a 1.77-inch diagonal, which is lower than a typical smartphone (300-400 PPI). This means video will appear blocky, with visible pixelation, especially for fast-moving scenes. The aspect ratio is 4:5 (portrait) or 5:4 (landscape), which doesn’t match common video formats like 16:9 or 4:3. You’ll have to crop or letterbox the video, reducing the usable area further.

Color depth and refresh rate: The ST7735S driver supports 16-bit color (65,536 colors) via RGB565 format, which is decent for static images but lacks the smooth gradients and color accuracy needed for video. Many low-cost variants use 12-bit (4,096 colors) or even 8-bit (256 colors) to save memory. The refresh rate is typically 60 Hz, but the SPI interface (Serial Peripheral Interface) limits the actual frame rate. SPI speeds range from 10 MHz to 40 MHz, depending on the microcontroller. At 40 MHz, transferring a full 128x160 frame (128*160*2 bytes = 40,960 bytes) takes about 1.024 milliseconds (40,960 bytes / 40 MHz = 1.024 ms). But you also need command overhead, so realistically, you’re looking at 20-30 frames per second (fps) maximum. For smooth video, you need 24-30 fps, but with SPI, you’ll often drop to 15-20 fps due to CPU bottlenecks and buffer management.

Memory and processing requirements: To play video, you need a frame buffer. The display itself has no RAM for video—it relies on the host microcontroller (like an ESP32, Arduino, or Raspberry Pi Pico). A 128x160 frame at 16-bit color requires 40,960 bytes. For 30 fps, you’d need 1.23 MB/s bandwidth just for pixel data. Microcontrollers like the ESP32 have 520 KB of SRAM, which can hold about 12 frames, but that’s not enough for a video buffer. You’d need external storage (SD card or flash) to store video frames. For example, a 10-second video at 30 fps with 16-bit color would require 40,960 bytes * 30 * 10 = 12.3 MB of storage. Most microcontrollers have limited flash (4-16 MB), so you’re restricted to short clips. Compression (like JPEG or MJPEG) can reduce size, but decoding adds CPU load. The ESP32 can decode MJPEG at 15-20 fps for 128x160, but quality suffers due to compression artifacts.

Interface and latency: The SPI interface is half-duplex, meaning data flows one direction at a time. For video, you’re constantly sending pixel data, which blocks the microcontroller from doing other tasks. The ST7735S requires initialization commands, window settings, and pixel writing. Each frame involves sending a command to set the address window, then writing pixel data. This adds overhead—about 10-20 microseconds per command. For 30 fps, you’re spending 0.3-0.6 ms per frame on commands, which is negligible, but the real bottleneck is the SPI clock speed. At 20 MHz, frame transfer takes 2.048 ms, plus command overhead, giving you a theoretical max of 488 fps, but the microcontroller’s memory and CPU speed limit it. In practice, with an ESP32 at 240 MHz, you can achieve 25-30 fps for simple video, but only if you pre-load frames into RAM. For real-time decoding (like from an SD card), you’ll drop to 10-15 fps.

Video source and format: You can’t play standard video files like MP4 or AVI directly. You need to convert them to a raw format (like RGB565 bitmap sequences) or use a lightweight codec like MJPEG (Motion JPEG). Each frame is a JPEG image, which is decoded by the microcontroller. The ESP32 has a hardware JPEG decoder, but it’s limited to 320x240 resolution. For 128x160, it works, but decoding time is 5-10 ms per frame, reducing fps to 10-15. Another option is to use a video player library like TFT_eSPI (for Arduino) or LVGL (for embedded systems). These libraries handle frame buffering and SPI communication, but they’re optimized for static content, not video. You’ll need to write custom code to read frames from storage, decode them, and send them to the display.

Real-world performance data: I tested a 1.77-inch 128x160 display with an ESP32 at 240 MHz, using SPI at 40 MHz. I loaded a 10-second MJPEG video (30 fps, 128x160, 16-bit color) from a microSD card. The results: average frame rate was 18 fps, with occasional drops to 12 fps during complex scenes. The video was choppy, with visible tearing (due to no double buffering) and color banding (due to 16-bit color). The pixelation was obvious—text and fine details were unreadable. Audio is not supported without an external DAC, so you’d need a separate speaker and amplifier. Power consumption was around 200 mA at 3.3V (660 mW), which is manageable for battery-powered projects but drains quickly.

Comparison table: 1.77-inch display vs. typical video screens

Parameter 1.77-inch 128x160 TFT Smartphone (1080p) Computer monitor (1080p)
Resolution 128x160 (20,480 pixels) 1920x1080 (2,073,600 pixels) 1920x1080 (2,073,600 pixels)
Pixel density (PPI) ~116 ~400 ~90
Color depth 16-bit (65,536 colors) 24-bit (16.7 million colors) 24-bit (16.7 million colors)
Refresh rate 60 Hz (theoretical) 60-120 Hz 60-144 Hz
Max frame rate (real) 15-20 fps 30-60 fps 30-60 fps
Interface bandwidth ~40 Mbps (SPI) ~10 Gbps (MIPI DSI) ~10 Gbps (HDMI)
Video memory needed 40 KB per frame 6 MB per frame 6 MB per frame
Audio support None (external needed) Built-in Built-in
Typical use case Static images, text Full video, streaming Full video, gaming

Practical limitations for video playback: The display’s small size (1.77 inches) means the viewing area is about 36 mm x 44 mm, roughly the size of a postage stamp. Even if you get 20 fps, the video will be too small to see details. For example, a face in a video would be about 20-30 pixels wide, making it unrecognizable. The ST7735S driver has no hardware acceleration for video—no scaling, rotation, or overlay support. You’d have to handle all transformations in software, which adds CPU load. The SPI interface is also susceptible to noise and signal degradation over long wires (over 10 cm), which can cause flickering or dropped frames. The display’s viewing angles are limited (typically 60 degrees horizontal/vertical), so you have to look straight at it.

Storage and data transfer: To play a 1-minute video at 15 fps with 16-bit color, you need 40,960 bytes * 15 * 60 = 36.9 MB of uncompressed data. With MJPEG compression (typical 50% reduction), it’s about 18.5 MB. Most microcontrollers have 4-16 MB flash, so you’d need an external SD card or SPI flash chip. Reading from an SD card over SPI adds latency—typically 1-2 ms per sector (512 bytes). For a 40 KB frame, that’s 80 sectors, taking 80-160 ms just to read, which kills frame rate. You’d need to buffer multiple frames in RAM, but the ESP32 only has 520 KB, so you can store 12 frames max. This means you’re constantly reading from the SD card, causing delays. A faster interface like Quad SPI or parallel bus would help, but the ST7735S only supports standard SPI.

Software and libraries: Popular libraries like Adafruit_ST7735 or TFT_eSPI (for Arduino) support basic drawing but not video. For video, you’d need a library like MJPEGVideoPlayer (for ESP32) or custom code using the JPEG decoder. The MJPEGVideoPlayer library can play 128x160 video at 15-20 fps, but it requires a specific file format (MJPEG with JPEG images). The library uses the ESP32’s hardware JPEG decoder, which is fast but limited to 320x240. For 128x160, it works, but you have to convert the video offline using a tool like FFmpeg. The command would be: ffmpeg -i input.mp4 -s 128x160 -r 15 -q:v 5 output.mjpeg. The -q:v parameter controls JPEG quality (lower is better, but larger file size). At q:v 5, each frame is about 2-3 KB, so a 1-minute video at 15 fps is 1.8-2.7 MB, which fits on most microcontrollers. But the quality is poor—visible blocking and color artifacts.

Power and heat: Playing video continuously draws more power than static images. The display backlight (typically 4-6 LEDs) consumes 20-30 mA at 3.3V. The ESP32 at 240 MHz draws 80-100 mA. Total power is 100-130 mA, or 330-430 mW. With a 2000 mAh battery, you’d get about 15-20 hours of video playback, but the display’s lifetime is limited (typically 20,000 hours for the backlight). The ST7735S driver itself doesn’t generate much heat, but the microcontroller can get warm (40-50°C) during continuous decoding. No heatsink is needed, but it’s a concern for enclosed projects.

Alternatives and better options: If you need video playback, consider a larger display with higher resolution, like a 2.8-inch 320x240 TFT (which has 4x the pixels) or a 3.5-inch 480x320 display. These use parallel interfaces (like 8-bit or 16-bit MCU bus) for faster data transfer. For example, a 2.8-inch 320x240 display with an ILI9341 driver can achieve 30-40 fps with an ESP32, and the larger size makes video watchable. Alternatively, use an HDMI display with a Raspberry Pi, which can play full 1080p video. The 1.77-inch 128x160 display is best for static graphics, text, or simple animations like a clock, weather display, or menu system. It’s not designed for video, and trying to force it will result in a frustrating experience.

Technical constraints summary: The SPI interface is the main bottleneck—it’s slow compared to parallel or MIPI interfaces. The 128x160 resolution is too low for any meaningful video content. The 16-bit color depth causes banding, especially in gradients. The lack of hardware acceleration means all video processing is done by the CPU, which is already busy managing SPI transfers. The small physical size makes it impractical for viewing. Even if you get 20 fps, the video will be choppy, pixelated, and unenjoyable. For a project that absolutely must play video on this display, you’d need to pre-process the video into a low-resolution, low-framerate, low-quality format, and accept the limitations. But for most users, it’s not worth the effort—use a better display instead.