首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【FFmpeg 教程】给视频加字幕

  • 25-02-18 11:21
  • 3099
  • 10052
blog.csdn.net

视频文件中除了音频、视频有时还会有字幕,本章讲解 ffmpeg 添加字幕。

在视频播放器上添加字幕,有两种常见的做法:
一种是在视频中硬编码(即直接将字幕嵌入视频画面中),
另一种是软编码(即将字幕作为独立文件加载到播放器中)。
  • 1
  • 2
  • 3

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
  • 1

参数解释:

  • -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
  • 1

参数解释:

  • -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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在播放器中显示字幕(软字幕)
如果你不想将字幕硬编码到视频中,而是希望视频播放器在播放时动态加载字幕(软字幕),可以将字幕文件和视频文件放在同一目录下,确保播放器支持字幕文件加载。

使用 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
  • 1

解释:

  • -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
  • 1
  • 2
  • 3

这表示视频文件中包含了 mov_text 编码的字幕流。
如果没有字幕流,命令没有输出或仅显示 No Such stream 错误。

2. 使用 ffmpeg 查看字幕流

可以使用ffmpeg来查看视频文件的详细信息。ffmpeg本身也可以列出视频中的所有流,包括字幕流。

在命令行中使用 ffmpeg:

ffmpeg -i input_video.mp4
  • 1

这个命令会输出视频的所有流信息,包括视频流、音频流和字幕流(如果有)。字幕流通常会显示类似于以下内容:

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)
  • 1
  • 2
  • 3

在这个例子中,第 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

解释

  1. ffmpeg.probe(input_video):获取视频的详细信息,返回一个字典,包含所有流的信息。
  2. stream['codec_type'] == 'subtitle':检查流的类型是否为字幕流。
  3. 输出:如果视频包含字幕流,会输出字幕流的索引和编解码器信息。
注:本文转载自blog.csdn.net的飞飞-躺着更舒服的文章"https://blog.csdn.net/u013090854/article/details/144558947"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

114
音视频
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top