You can overlay Hindi text on an MP4 video by using the FFmpeg
drawtext filter with a font that supports Devanagari script. The command requires specifying the text string, the path to a TrueType font file (.ttf), and appropriate scaling to ensure readability. This approach allows for precise control over position, color, and timing without re-encoding the entire video stream if only audio is needed.
Prerequisites and Font Selection
The most critical component of adding Hindi text is having a suitable font file. Standard system fonts often lack support for Devanagari characters, resulting in boxes or missing glyphs instead of readable text. You must download a TrueType font (TTF) that includes Hindi characters. Popular choices include Noto Sans Devanagari, Lohit Devanagari, or any other open-source font from repositories like Google Fonts or local Linux package managers.
Once you have the font file, note its absolute path on your system. For example, if you save the font as
NotoSansDevanagari.ttf in your home directory, the path might be
/home/user/NotoSansDevanagari.ttf. On Windows, this could be something like
C:/Fonts/NotoSansDevanagari.ttf. Ensure the file exists and is readable by the user running the FFmpeg command. If you are working on a headless server, you may need to install the font package via your package manager first.
Constructing the Command
The core of the operation relies on the
-filter_complex argument, which allows you to chain multiple filters together. The specific filter we use is
drawtext. This filter draws text on top of the video frames. The basic structure involves mapping the input video, applying the filter, and setting the output format.
Here is the fundamental command structure:
ffmpeg -i input_video.mp4 -filter_complex "[0:v]drawtext=text='नमस्कार':fontfile=/path/to/font.ttf:fontsize=50:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2" -c:a copy output_video.mp4
In this command,
-i input_video.mp4 specifies the source file. The
-filter_complex section applies the visual modification. Inside the quotes,
text='नमस्कार' defines the Hindi string. It is crucial to wrap the text in single quotes within the command line to prevent shell interpretation issues. The
fontfile parameter points to your downloaded TTF file.
Positioning and Styling
By default,
drawtext places text at the top-left corner of the frame. To center it, we calculate the coordinates based on the video width (
w) and height (
h). The expression
x=(w-text_w)/2 centers the text horizontally, while
y=(h-text_h)/2 centers it vertically.
text_w and
text_h represent the calculated width and height of the rendered text itself.
You can also adjust the appearance. Use
fontsize to set the pixel size of the text. Larger values improve readability but may obscure important parts of the video. Use
fontcolor to change the text color. Common options include
white,
black, or hex codes like
#FF0000 for red. Adding a shadow or border can enhance contrast against complex backgrounds. For a black outline, you might add
borderw=2:bordercolor=black.
Handling Special Characters and Encoding
Hindi text contains complex conjuncts and diacritics that require proper Unicode handling. Ensure your terminal or command prompt is set to UTF-8 encoding. If you see garbled characters in the output, check your locale settings. On Linux, run
export LANG=en_US.UTF-8 before executing the command. On Windows, ensure your console supports UTF-8 or use a tool like PowerShell with appropriate encoding settings.
If the text appears pixelated or blurry, it is likely due to the
fontsize being too small relative to the video resolution. A 1080p video typically requires a fontsize of at least 40-60 pixels for clear reading. If you are working with 4K video, increase the fontsize proportionally. Additionally, verify that the font file actually supports the specific characters you are typing. Some fonts may support common Hindi letters but miss rare ones or specific punctuation marks.
Performance Considerations
Using
-c:a copy tells FFmpeg to copy the audio stream directly without re-encoding. This significantly speeds up the process and preserves audio quality. However, since the video stream is being filtered, it must be re-encoded. Choose a codec like
libx264 for high-quality compression or
vpx for web-friendly formats. You can specify the preset with
-preset fast to reduce processing time, though this increases file size slightly.
For long videos, rendering can take considerable time. Monitor the CPU usage during execution. If the process seems stuck, check if the font file path is correct. An invalid path will cause FFmpeg to fail immediately. You can test the font availability by running a simple command with just one frame to verify syntax before processing the entire file.
Related Resources
If you need to change the container format after adding the text, refer to our guide on
Convert MP4 to AVI using FFmpeg on macOS. For issues where the text appears cut off or distorted due to aspect ratio problems, check our article on
Fixing Video Width and Height with ffmpeg: A Tech Support Guide.
Frequently Asked Questions
Why does my Hindi text appear as squares or boxes?
This usually happens because the specified font file does not contain the glyphs for the Devanagari script. You must download and link a font that explicitly supports Hindi characters, such as Noto Sans Devanagari. Ensure the
fontfile path points to this correct file.
How can I make the Hindi text blink or fade in?
The
drawtext filter supports expressions for dynamic properties. You can use the
enable option to control visibility based on time, such as
enable='between(t,1,5)' to show text between seconds 1 and 5. For fading effects, you may need to combine it with alpha channel manipulation or use separate video segments.
Can I add subtitles instead of hardcoding text?
Hardcoding text embeds it into the video pixels, making it permanent. If you want selectable subtitles, consider generating an SRT or ASS file and muxing it into the MP4 container using
-c:s mov_text or similar subtitle codecs. This keeps the video clean and allows users to toggle subtitles on or off.
What should I do if the text is too large for the screen?
Reduce the
fontsize value in the command. Alternatively, you can scale the video down before drawing text, but this affects overall quality. Adjusting the
fontsize dynamically based on video resolution is the best practice. Test different sizes on a short clip to find the optimal balance between readability and coverage.
Does this method work for live streaming?
While FFmpeg can handle live streams,
drawtext adds processing overhead. For low-latency streaming, monitor CPU usage closely. If performance drops, consider simplifying the font or reducing the resolution. Pre-rendered overlays or external graphics sources might be more efficient for real-time broadcast scenarios compared to on-the-fly text rendering.