【FFmpeg 教程】给视频加字幕

发布于:2024-12-20 ⋅ 阅读:(12) ⋅ 点赞:(0)

视频文件中除了音频、视频有时还会有字幕,本章讲解 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 播放器加载字幕

  1. **将字幕文件与视频文件放在同一目录下,**并确保字幕文件的名称与视频文件相同。例如:
    • example.mp4
    • example.srt
  2. 在 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)

解释

  1. ffmpeg.probe(input_video):获取视频的详细信息,返回一个字典,包含所有流的信息。
  2. stream['codec_type'] == 'subtitle':检查流的类型是否为字幕流。
  3. 输出:如果视频包含字幕流,会输出字幕流的索引和编解码器信息。