Soft and Hard Movie Subtitles and How to Detect them

Movies around the globe are enjoyed by a diverse audience, thanks in large part to subtitles that bridge language barriers. However, not all subtitles are created equal, and they generally fall into two categories: soft subtitles and hard subtitles. Each type presents unique challenges when it comes to detection. In this blog post, we’ll delve deep into what these subtitles are, how to detect soft subtitles, and simplified methods for identifying hard subtitles using Optical Character Recognition (OCR) technology.

Understanding Subtitles: Soft vs. Hard

Soft Subtitles

Soft subtitles are akin to a separate layer over the video content, which can be toggled on or off according to the viewer’s preference. They are not burned onto the video itself but are usually included as a separate file or embedded within the video file in tracks. This makes them incredibly flexible as they can be turned on for accessibility reasons or language preferences and turned off for an uninterrupted cinematic experience.

Detecting Soft Subtitles

Detecting soft subtitles is relatively straightforward, thanks to the structured formats they are often stored in, such as SRT (SubRip Text), ASS (Advanced SubStation Alpha), or SSA (SubStation Alpha). Here are some simple steps to detect them:

  1. File Examination: The first step is checking the video file container for separate subtitle tracks. Tools like FFmpeg or media players like VLC can easily list these tracks.

  2. Metadata Inspection: Often, video files contain metadata that can be inspected to check for the presence of subtitle tracks. Software developers can use libraries in various programming languages to extract and analyze this metadata.

Hard Subtitles

On the other hand, hard subtitles are part of the video frame itself, essentially embedded into the video image. They cannot be turned off and require more sophisticated methods for detection, as they are visually indistinguishable from the other elements in the frame.

Detecting Hard Subtitles

Detecting hard subtitles is where Optical Character Recognition (OCR) technology comes into play. Here’s a simplified method for detecting hard subtitles:

  1. Frame Extraction: Extract frames from the video at regular intervals using tools like FFmpeg. This step is crucial as it prepares the data for analysis.

  2. Pre-Processing: Before running OCR, it may be necessary to preprocess the images to improve OCR accuracy. This could involve adjusting brightness and contrast or applying filters to isolate text.

  3. OCR Processing: Apply an OCR engine like Tesseract to the preprocessed images. Tesseract is an open-source OCR engine that can recognize text within images, making it suitable for detecting hard subtitles.

  4. Text Analysis: Once the OCR process extracts text from the frames, analyzing the content can help determine if they are indeed subtitles. This analysis could look for patterns typical in subtitles, such as short, concise sentences, presence of timing information, or even language-specific characteristics.

Detecting Soft Subtitles in Action

For detecting soft subtitles, we can use the ffmpeg-python library to probe the video file for subtitle streams.

First, ensure you have ffmpeg installed on your system and accessible via command line. Then, install ffmpeg-python using pip:

pip install ffmpeg-python

Here’s how you might write a Python script to check for soft subtitle streams in a video file:

import ffmpeg

def detect_soft_subtitles(video_path):
# Probe the video file for streams information
probe = ffmpeg.probe(video_path)
# Filter streams to find subtitle streams
subtitle_streams = [stream for stream in probe['streams'] if stream['codec_type'] == 'subtitle']
if subtitle_streams:
print("Soft subtitle tracks detected.")
for stream in subtitle_streams:
print(f"Subtitle track: {stream['index']} - Language: {stream.get('tags', {}).get('language', 'unknown')}")
print("No soft subtitle tracks detected.")
except ffmpeg.Error as e:
print(f"An error occurred: {e.stderr}")

# Example usage:
video_path = 'path/to/your/video/file.mkv'

This script uses ffmpeg to probe for streams in a video file and filters out subtitle streams if any are present. Adjust the video_path variable to point to your video file.

Detecting Hard Subtitles with OCR in Action

For hard subtitles, the Tesseract OCR engine can be utilized alongside pytesseract - a Python wrapper. You’ll need to have Tesseract installed on your system for this to work.

Installation instructions and downloads for Tesseract can be found at

Then, install pytesseract and Pillow for image processing:

pip install pytesseract Pillow

Here’s a basic approach to detect text in video frames:

import cv2
import pytesseract
from PIL import Image
import numpy as np

def detect_hard_subtitles(video_path):
# Load the video
cap = cv2.VideoCapture(video_path)
while cap.isOpened():
ret, frame =
if not ret:

# Convert the frame to gray scale and then to PIL format
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
pil_img = Image.fromarray(gray_frame)

# Use pytesseract to extract text
text = pytesseract.image_to_string(pil_img, lang='eng')

if text.strip(): # Check if the OCR found any readable text
print("Detected text in frame:", text)
# For demonstration, let's just break after first detection


# Example usage:
video_path = 'path/to/your/video/file_with_hardsub.mp4'

This script attempts to extract text from the frames of a given video file. Due to its simplicity, the script checks each frame for text, which might not be very efficient for long videos. Consider implementing a more sophisticated approach, such as selecting specific intervals or regions of the frame more likely to contain subtitles, to optimize the detection process.

Remember, OCR’s accuracy can significantly vary based on the video quality, subtitle font, and background contrast. Preprocessing steps like binarization or contrast adjustment may help improve results.

Author: robot learner
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source robot learner !