视频文件中除了音频、视频有时还会有字幕,本章讲解 ffmpeg 添加字幕。
在视频播放器上添加字幕,有两种常见的做法:
一种是在视频中硬编码(即直接将字幕嵌入视频画面中),
另一种是软编码(即将字幕作为独立文件加载到播放器中)。
1. 硬编码字幕到视频中
硬编码字幕是将字幕直接嵌入到视频帧中,视频播放时字幕将无法关闭。使用 ffmpeg
可以很容易地做到这一点。
使用 ffmpeg
在视频上硬编码字幕
首先,确保你有一个字幕文件,常见的字幕文件格式是 .srt
(SubRip Subtitle)格式。以下是一个 ffmpeg
命令的示例,演示如何将 .srt
字幕文件硬编码到视频中。
命令行:
ffmpeg -i input_video.mp4 -i subtitle.srt -c:v libx264 -c:a mov_text -preset fast output_video.mp4
参数解释:
-i input_video.mp4
:输入的视频文件。-i subtitle.srt
:输入的字幕文件。-c:v libx264
:使用libx264
编码器对视频进行解码。-c:a copy
:将音频流直接复制,不进行编码。-c:s mov_text
:使用mov_text
编解码器将字幕格式设置为支持视频容器的字幕格式(适用于.mp4
格式)。-preset fast
:设置编码的速度与压缩的平衡,fast
是一种比较快速的选择。output_video.mp4
:输出的视频文件,字幕已嵌入。
2. 软编码字幕(字幕与视频文件分开)
软编码字幕意味着字幕和视频是分开存储的,播放时可以选择显示或隐藏字幕。你可以将字幕和视频封装到一个容器中(如.mp4
),这使得字幕在视频播放时动态加载。
使用 ffmpeg
将字幕作为软字幕封装到视频中
ffmpeg -i input_video.mp4 -i subtitle.srt -c:v copy -c:s mov_text output_video_with_subtitles.mp4
参数解释:
-i input_video.mp4
:输入的视频文件。-i subtitle.srt
:输入的字幕文件。-c:v copy
:直接复制视频流,不进行编码。-c:a copy
:直接复制音频流,不进行编码。-c:s mov_text
:将字幕文件格式转换为适用于.mp4
的字幕格式。output_video_with_subtitles.mp4
:输出的视频文件,包含软字幕。
3. 使用 Python 进行字幕添加
如果你希望通过 Python 编程来添加字幕,可以使用 ffmpeg-python
库来实现。下面是如何在 Python 中硬编码字幕到视频的代码示例。
使用 ffmpeg-python
将字幕硬编码到视频
import ffmpeg
def add_subtitles_to_video(input_video, subtitle_file, output_video):
try:
ffmpeg.input(input_video, i=subtitle_file).output(output_video, vcodec='libx264', acodec='copy' scodec='mov_text').run()
print(f"字幕已成功添加到视频:{output_video}")
except ffmpeg.Error as e:
print(f"错误:{e.stderr.decode()}")
# 使用
input_video = "input_video.mp4"
subtitle_file = "subtitle.srt"
output_video = "output_video_with_subtitles.mp4"
add_subtitles_to_video(input_video, subtitle_file, output_video)
在播放器中显示字幕(软字幕)
如果你不想将字幕硬编码到视频中,而是希望视频播放器在播放时动态加载字幕(软字幕),可以将字幕文件和视频文件放在同一目录下,确保播放器支持字幕文件加载。
使用 VLC 播放器加载字幕
- **将字幕文件与视频文件放在同一目录下,**并确保字幕文件的名称与视频文件相同。例如:
example.mp4
example.srt
- 在 VLC 播放器中加载字幕:
- 打开 VLC 播放器。
- 播放视频文件时,VLC 会自动检测并加载相同目录中的
.srt
字幕文件。
使用 mpv
播放器加载字幕
同样,mpv
播放器也可以加载 .srt
字幕文件,只需要将视频文件和字幕文件放在同一目录下并确保文件名一致。
以上都是视频文件和字幕文件是分开的,但有些视频文件是包含字幕的。要查看视频文件中是否包含字幕(尤其是软字幕),可以使用 ffmpeg
来检查视频文件的流信息,包括视频、音频和字幕流。ffmpeg
提供了 ffprobe
工具,它可以用来查看视频文件的详细信息,包括是否包含字幕流。
1. 使用 ffprobe
查看视频文件的流信息
ffprobe
是 FFmpeg 套件中的工具,用于互殴去视频和音频文件的详细信息。你可以使用 ffprobe
查看视频文件中是否包含字幕流。
在命令行中使用 ffprobe
:
ffprobe -v error -select_streams s -show_entries stream=index, codec_name, codec_type -of default=noprint_wrappers=1 input_video.mp4
解释:
-v error
:只显示错误信息,忽略其他输出。-select_streams s
:选择字幕流(如果存在)。-show_entries stream=index, codec_name, codec_type
:显示流的索引、编解码器名称和流类型。-of default=noprint_wrappers=1
:以简单的格式输出信息。input_video.mp4
:输入的视频文件路径。
如果视频中包含字幕流,ffprobe
会显示有关字幕流的详细信息。例如:
index = 0
codec_name = mov_text
codec_type = subtitle
这表示视频文件中包含了 mov_text
编码的字幕流。
如果没有字幕流,命令没有输出或仅显示 No Such stream
错误。
2. 使用 ffmpeg
查看字幕流
可以使用ffmpeg
来查看视频文件的详细信息。ffmpeg
本身也可以列出视频中的所有流,包括字幕流。
在命令行中使用 ffmpeg
:
ffmpeg -i input_video.mp4
这个命令会输出视频的所有流信息,包括视频流、音频流和字幕流(如果有)。字幕流通常会显示类似于以下内容:
Stream #0:0(und): Video: h264 (High), yuv420p, 1280*720 [SAR 1:1 DAR 16:9], 1500 kb/s, 30fps, 30 tbr, 90k tbn, 180k tbc
Stream #0:1(eng): Audio: aac, 44100 Hz, stereo, fltp, 192 Kb/s
Stream #0:2(eng): Subtitle: mov_text (text / 0x74786574)
在这个例子中,第 2 个流(Stream #0:2
) 是一个字幕流,编码格式是 mov_text
, 表示这是一个软字幕流。
3. 使用 ffmpeg-python
获取字幕流
如果你希望使用 python 获取视频文件的字幕信息,可以通过 ffmpeg-python
库来实现。以下是如何用 ffmpeg-python
查看视频文件是否包含字幕流的示例。
使用 ffmpeg-python
获取视频流信息
import ffmpeg
def check_subtitles(input_video):
try:
# 获取视频的流信息
probe = ffmpeg.probe(input_video)
# 查找字幕流
subtitle_streams = [stream for stream in probe['streams'] if stream['codec_type'] == 'subtitle']
if subtitle_streams:
print("视频包含字幕流:")
for stream in subtitle_streams:
print(f"字幕流索引: {stream['index']}, 编解码器: {stream['codec_name']}")
else:
print("视频不包含字幕流.")
except ffmpeg.Error as e:
print(f"错误: {e.stderr.decode()}")
# 使用示例
video_file = 'input_video.mp4'
check_subtitles(video_file)
解释
ffmpeg.probe(input_video)
:获取视频的详细信息,返回一个字典,包含所有流的信息。stream['codec_type'] == 'subtitle'
:检查流的类型是否为字幕流。- 输出:如果视频包含字幕流,会输出字幕流的索引和编解码器信息。