基于ffmpeg给视频添加时间字幕

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,我们可以基于ffmpeg对视频进行各种操作。本文主要介绍基于ffmpeg给视频添加字幕,字幕的内容为视频所播放的时间(故需要安装ffmpeg,具体可以参考链接中的1.1进行安装配置)。所涉及到的知识主要为字幕文件格式。

1、字幕格式说明

1.1 字幕文件格式

SRT (SubRip Subtitle): 是最常见的一种字幕文件格式,它用文本文件存储字幕信息,以时间轴方式显示字幕的开始和结束时间。

VTT (WebVTT Subtitle): 一种用在网络视频里的字幕文件格式,它支持多种样式和布局,而且可以包含元数据和注释,复杂一点。

SSA/ASS (SubStation Alpha/Advanced SubStation Alpha): 高级的字幕文件格式,支持很多的样式和效果,比如字体、颜色、描边、阴影等等,这种字幕会好看一点,电影应该都是用这种。

SUB/IDX (DVD Subtitle): 是 DVD 视频使用的字幕文件格式,通常是一个二进制文件和一个索引文件组成,这种不放在视频里看到看不懂。

LRC (Lyric): 歌词文件的格式,以时间轴方式显示歌词的开始和结束时间,并提供歌词文本,和SRT类似。

SMI (SAMI): 由Microsoft提出的一种字幕文件格式,支持多种语言和样式,并可以包含元数据和注释,比较复杂高级。

STL (Spruce Subtitle File): 专门用于电视广播的字幕文件格式,它用二进制或文本文件存储字幕信息,以时间轴方式显示字幕的开始和结束时间,可以看到集成好几种字幕格式的特点。
作者:本校区划水的玉桂 链接:https://www.zhihu.com/question/380038769/answer/3129090293 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
本博文主要使用srt格式的字幕

1.2 srt字幕基本样式

每个srt字幕段有四部分构成:
字幕序号字幕显示的起始时间字幕内容(可多行)空白行(表示本字幕段的结束)
其中:
字幕序号一般是顺序增加的,表示字幕是一系列连续的序列。
字幕显示起始时间的格式如下:
hour:minute:second.millisecond --> hour:minute:second.millisecond 或
hour:minute:second,millisecond --> hour:minute:second,millisecond
后面还可以附加用于指定字幕显示位置的信息,以像素为单位,格式如下: X1:number Y1:number X2:number Y2:number。
例如:
3
00:00:29,740 --> 00:00:31,280
福姬套餐~

4
00:00:31,400 --> 00:00:32,240
炒炸酱面

5
00:00:32,360 --> 00:00:33,300
炒拉面

6
00:00:33,460 --> 00:00:34,360
芝士炒面

srt的字幕序号没有实际意义,但必须有。没有序号的srt文件,在有些字幕编辑软件里面会出现问题。

1.3 srt字幕格式说明

字体设置

多数SRT支持一些特定格式化,比如斜体、粗体、下划线以及字体颜色。使用时需要基于HTML的标签,具体用法如下:

<font color=red>颜色</font><i>字体斜体</i><u>字体下加划线</u><br>换行<b>字体加粗</b>

对应效果如下:

颜色字体斜体字体下加划线
换行字体加粗

字幕位置设置

字幕位置标准主要参考:https://zhuanlan.zhihu.com/p/256421100
许多播放器在.srt文件中支持ASS标签。下面是一个使用ASS定位标签的示例,该标签在Linux中的VLC和SMplayer中以及在许多其他播放器和其他OS中都可以使用。
请注意,可接受的答案建议使用SSA格式的旧版本,{\aX}而不是使用{\anX}。旧格式中使用的数字也有所不同,并且该格式被认为已弃用。较新的格式将数字使用小键盘布局。当SMplayer正确显示两种格式时,VLC仅接受当前{\anX}格式。

1
00:00:01,000 --> 00:00:04,000
{\an7} Top-left: an72
00:00:05,000 --> 00:00:08,000
{\an8}Top-center: an83
00:00:09,000 --> 00:00:12,000
{\an9}Top-right: an94
00:00:13,000 --> 00:00:16,000
{\an4}Middle-left: an45
00:00:17,000 --> 00:00:20,000
{\an5}Middle-center: an56
00:00:21,000 --> 00:00:24,000
{\an6}Middle-right: an67
00:00:25,000 --> 00:00:28,000
{\an1}Bottom-left: an18
00:00:29,000 --> 00:00:32,000
{\an2}Bottom-Center an29
00:00:33,000 --> 00:00:36,000
{\an3}Bottom-right: an311
00:00:37,000 --> 00:00:45,000
Back to default
{\pos(200,230)} # 和改变字体颜色等命令一样, 在爱奇艺万能播放器可用, 但ffmpeg合并时不支持该命令.

2、为视频添加字幕

2.1 生成字幕文件

字幕的时间可以与视频的时间长度不一致

def s2hms(x):  # 把秒转为时分秒m, s = divmod(x, 60)h, m = divmod(m, 60)hms = "%02d:%02d:%s" % (h, m, str('%.3f' % s).zfill(6))hms = hms.replace('.', ',')  # 把小数点改为逗号return hmssub_content = []
fps=25 #每秒25帧
for i in range(60*10):#只生成了10分钟的时间字幕for s in range(fps):sec1=s/fpssec2=(s+1)/fps#字幕位置可以参考 https://zhuanlan.zhihu.com/p/256421100tmp={"from": i+sec1, "to": i+sec2, "content": r"{\an7}<font color=red size=28>当前时间</font>:"+s2hms(i+sec2)}#{\an9}表示Top-rightsub_content.append(tmp)with open(r'字幕.srt', 'w',encoding='utf-8') as f:write_content = []for n, i in enumerate(sub_content):  # 序号+开始-->结束+内容write_content.append(str(n + 1) + '\n' + s2hms(i['from']) + ' --> ' + s2hms(i['to'])+'\n'  + i['content'] + '\n\n')f.writelines(write_content)

2.2 基于ffmpeg合并字幕

合并命令格式如下:
ffmpeg -i video_name -vf subtitles=字幕_name output_name
使用示意如下:
ffmpeg -i 风景视频素材分享.flv -vf subtitles=字幕.srt output.flv
合并过程如下:
在这里插入图片描述

2.3 合并效果

原始的视频如下,其右上方是没有时间轴的 风景视频素材分享.flv
在这里插入图片描述

添加字幕后的视频如下,其右上方多出了一个时间 output.flv
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/130294.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多项目并行管理:优化协调策略提高效率

多项目同时进行已然是大部分项目管理者面临的现状了。相比于单项目管理&#xff0c;多项目管理可能会出现项目资源分配不均&#xff0c;项目进度监控难以及沟通协作复杂等问题。 可以通过一款灵活高效得项目管理工具&#xff0c;来帮助您进行多项目管理&#xff0c;比如 Zoho …

C#(Csharp)我的基础教程(二)(我的菜鸟教程笔记)-属性和字段的探究与学习

目录 1、字段字段特点&#xff1a;2、属性属性的特点 1、字段 字段是定义在方法外面的变量&#xff0c;是成员变量&#xff0c;主要是为了类的内部数据交换使用&#xff0c;字段一般是用private修饰&#xff0c;也可以用readonly修饰&#xff0c;表示只读字段&#xff0c;其它…

Bytebase 2.9.0 - 支持在工单创建前执行 SQL 审核

&#x1f680; 新功能 在工单创建前即可执行 SQL 审核。支持预定义表模板&#xff0c;可在变更或设计 Schema 时应用这些模板。 &#x1f384; 改进 增强工单搜索功能&#xff0c;支持通过「实例/数据库/工单类型/创建日期/创建人/发布人/订阅人」搜索。改进了分支功能的交…

flutter开发实战-video_player插件播放抖音直播实现(仅限Android端)

flutter开发实战-video_player插件播放抖音直播实现&#xff08;仅限Android端&#xff09; 在之前的开发过程中&#xff0c;遇到video_player播放视频&#xff0c;通过查看video_player插件描述&#xff0c;可以看到video_player在Android端使用exoplayer&#xff0c;在iOS端…

防止SQL注入攻击的综合解决方案

文章目录 摘要背景和危害性防御措施示例代码&#xff08;Java&#xff09;示例代码&#xff08;PHP&#xff09;示例MySQL命令示例代码&#xff08;Python&#xff09;示例代码&#xff08;C#&#xff0c;使用Entity Framework&#xff09; 进一步防御SQL注入攻击的措施使用ORM…

链表(2)——带头双向循环链表

&#x1f341;一、链表的分类 &#x1f315;1.单向或者双向 &#x1f315;2.带头或者不带头&#xff08;有无哨兵&#xff09; &#x1f315;3.循环或者不循环 &#x1f315;4.无头单向非循环链表&#xff08;常用&#xff09; &#x1f315;5.带头双向循环链表&#xff08;常用…

粘性文本整页滚动效果

效果展示 CSS 知识点 background 相关属性综合运用position 属性的 sticky 值运用scroll-behavior 属性运用scroll-snap-type 属性运用scroll-snap-align 属性运用 整体页面效果实现 <div class"container"><!-- 第一屏 --><div class"sec&qu…

Flink之Watermark源码解析

1. WaterMark源码分析 在Flink官网中介绍watermark和数据是异步处理的,通过分析源码得知这个说法不够准确或者说不够详细,这个异步处理要分为两种情况: watermark源头watermark下游 这两种情况的处理方式并不相同,在watermark的源头确实是异步处理的,但是在下游只是做的判断,这…

TypeScript 笔记:基础类型

1 any类型&#xff08;任意值类型&#xff09; 声明为 any 的变量可以赋予任意类型的值。 any类型是Typescript 针对编程时类型不明确的变量使用的一种数据类型&#xff0c;常用于: 变量的值会动态改变 ——>任意值类型可以让这些变量跳过编译阶段的类型检查 let x: any …

12.2 实现键盘模拟按键

本节将向读者介绍如何使用键盘鼠标操控模拟技术&#xff0c;键盘鼠标操控模拟技术是一种非常实用的技术&#xff0c;可以自动化执行一些重复性的任务&#xff0c;提高工作效率&#xff0c;在Windows系统下&#xff0c;通过使用各种键盘鼠标控制函数实现动态捕捉和模拟特定功能的…

爬取微博热榜并将其存储为csv文件

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言1.…

景联文科技:AI大模型强势赋能,助力自动驾驶迭代升级

我国一直以来都将自动驾驶作为新兴产业发展的重点领域之一&#xff0c;工信部等相关部委出台了一系列自动驾驶发展战略、规划和标准&#xff0c;一些地方政府也在积极开展关于自动驾驶的地方立法&#xff0c;为自动驾驶技术的研发和应用提供更加具体的法律保障。例如&#xff0…