Soft Subtitles vs. Hard Subtitles: A Complete Guide Through Two FFmpeg Commands!
When using video translation software like pyVideoTrans, you face the choice between "embedding soft subtitles" or "embedding hard subtitles." What's the difference? What are their pros and cons? How are they implemented using FFmpeg?

Don't worry—this guide will explain everything clearly and simply!
Two Ways to Embed Subtitles: Soft vs. Hard
Think of subtitles as a "text layer" over your video. This layer can be added in two ways:
- Soft Subtitles: Like a jacket you can put on or take off. The subtitle data is stored separately from the video frames but packaged in the same file (e.g., MP4 or MKV). Viewers can choose to show or hide the subtitles and even switch between different languages if available.
- Hard Subtitles: Also known as "burned-in subtitles." This is like printing text directly onto the video frames, making it part of the image. Once created, the subtitles are permanently visible and cannot be turned off or changed.
FFmpeg Commands in Action: Let's Do It!
FFmpeg is a powerful open-source multimedia tool that can add both types of subtitles. Let's look at two example commands, assuming we have a video file 1.mp4 and a subtitle file (in SRT or ASS format).
Scenario 1: Embed Soft Subtitles (Viewer-Controllable, Recommended with .srt Subtitles)
If you want viewers to control subtitle visibility or offer multiple language options, soft subtitles are the way to go.
FFmpeg Command:
ffmpeg -i 1.mp4 -i 1.srt -c:v copy -c:s mov_text -metadata:s:s:0 language=chn -movflags +faststart out_soft_subs.mp4Command Breakdown, Step by Step:
ffmpeg: The main command to start FFmpeg.-i 1.mp4: The first input file, your original video.-i 1.srt: The second input file, your SRT subtitle file. (SRT is a common plain-text subtitle format.)-c:v copy:-c:vstands for video codec.copymeans "direct copy"—no re-encoding. This is fast and preserves video quality perfectly!-c:s mov_text:-c:sstands for subtitle codec.mov_textis a text-based subtitle format supported by MP4 files. We convert the SRT subtitles to this format and embed them.-metadata:s:s:0 language=chn: This adds an "ID" to the subtitle track.-metadata: Set metadata.:s:s:0:sstands for stream; the firstsindicates subtitle stream, and0is the first subtitle track (others would be1,2, etc.).language=chn: Tells the player the subtitle is in Chinese ("chn" is the standard code). This helps players display "Chinese" correctly in the subtitle menu.
-movflags +faststart: A small optimization for MP4 files. It moves key metadata to the file's start, enabling faster playback over the internet.out_soft_subs.mp4: The output filename for your video with soft subtitles.
What This Command Does:
It copies the video from 1.mp4 without changes, converts the 1.srt subtitles to mov_text format, and embeds them as a separate subtitle track in out_soft_subs.mp4.
Summary of Soft Subtitles:
- Pros:
- Viewers can toggle subtitles on/off or switch languages.
- Fast processing with no loss in video quality (thanks to
copy). - Convenient file management—video and subtitles in one file.
- Cons:
- Compatibility Issues: While most modern players (VLC, PotPlayer, mobile players) support them, older devices or specific environments (e.g., web browsers using the
<video>tag) might not display subtitles or require manual setup. - Limited Styling: SRT subtitles are simple; final appearance depends on the player's rendering.
- Compatibility Issues: While most modern players (VLC, PotPlayer, mobile players) support them, older devices or specific environments (e.g., web browsers using the
Scenario 2: Embed Hard Subtitles (Subtitles "Burned" into Video, Recommended with .ass Subtitles to Preserve Styles)
If you need subtitles to always show or your subtitle file (e.g., ASS format) includes advanced styles (fonts, colors, positioning, animations) you want to keep, choose hard subtitles.
FFmpeg Command:
ffmpeg -i 1.mp4 -c:v libx264 -vf subtitles=1.ass -movflags +faststart out_hard_subs.mp4Command Breakdown:
ffmpeg -i 1.mp4: Same as before—input video.-c:v libx264:-c:vis the video codec. Here, we uselibx264, a popular, high-quality H.264 encoder. Note: This is notcopy, so the video will be re-encoded!-vf subtitles=1.ass: This is key!-vf: Use a video filter.subtitles=1.ass: Thesubtitlesfilter reads the1.assfile (ASS supports rich styles) and "draws" the subtitles onto each video frame.
-movflags +faststart: Again, for optimized web playback.out_hard_subs.mp4: Output filename for the video with hard subtitles.
What This Command Does:
It reads 1.mp4, applies the subtitles filter to render the 1.ass subtitles (with all styles) onto the video frames, and re-encodes the new video stream using libx264 into out_hard_subs.mp4.
Summary of Hard Subtitles:
- Pros:
- Excellent Compatibility: If the player can play the video, it will show the subtitles. Great for web playback or simple devices.
- Perfect Style Retention: If using ASS, all fonts, colors, positions, and effects are preserved exactly as designed.
- Cons:
- Subtitles Cannot Be Turned Off or Changed: They're part of the image.
- Video Re-encoding Required:
- Slower Processing: Takes more time than
copy. - Potential Quality Loss: Re-encoding can reduce quality unless high bitrates are used (which increases file size).
- Slower Processing: Takes more time than
- Hard to Modify: Once burned in, changing subtitles means redoing the entire process.
Soft Subtitles vs. Hard Subtitles: How to Choose?
Knowing their differences and pros/cons makes the choice clear:
Prioritize flexibility, lossless quality, and your audience uses modern players? -> Choose Soft Subtitles.
- Examples: Educational videos where users toggle between languages; movies shared with friends using VLC.
- In pyvideotrans, selecting "soft subtitles" uses a command similar to the first example.
Need maximum compatibility, guaranteed subtitle display, or complex subtitle styles? -> Choose Hard Subtitles.
- Examples: Promotional videos for various devices (old TVs, projectors); videos with special typography or animations; ensuring everyone sees subtitles without player setup.
- In pyvideotrans, selecting "hard subtitles" uses a command similar to the second example.
A Quick Note: External Subtitles
There's also External Subtitles, where the subtitle file (e.g., movie.srt) is separate from the video file (e.g., movie.mp4), usually in the same folder. Players can auto-load or allow manual loading.
- Pros: Easy to edit (just use a text editor for SRT), good compatibility.
- Cons: Easy to forget when sharing; mismatched filenames can prevent loading; managing multiple files is cumbersome.
Embedded soft subtitles solve the distribution issues of external subtitles by packaging them into the video file.
Summary
This guide should give you a clear understanding of how FFmpeg handles soft and hard subtitles:
| Feature | Embedded Soft Subtitles | Hard Subtitles (Burned-in) |
|---|---|---|
| Key Command | -c:v copy (no re-encode), -c:s mov_text (embed) | -c:v libx264 (re-encode), -vf subtitles (burn) |
| Viewer Control | On/Off, switchable | Fixed, cannot be turned off |
| Video Quality | Lossless (due to copy) | Possible loss (due to re-encoding) |
| Processing Speed | Fast | Slow |
| Style Retention | Player-dependent, simple styles | Perfect (especially with ASS) |
| Compatibility | Good, but may fail in some environments | Excellent, works wherever video plays |
In tools like pyvideotrans, understanding these differences helps you choose the best option for your needs, ensuring your videos are presented perfectly to your audience.
