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

news2024/11/15 18:15:19

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: an7

2
00:00:05,000 --> 00:00:08,000
{\an8}Top-center: an8

3
00:00:09,000 --> 00:00:12,000
{\an9}Top-right: an9

4
00:00:13,000 --> 00:00:16,000
{\an4}Middle-left: an4

5
00:00:17,000 --> 00:00:20,000
{\an5}Middle-center: an5

6
00:00:21,000 --> 00:00:24,000
{\an6}Middle-right: an6

7
00:00:25,000 --> 00:00:28,000
{\an1}Bottom-left: an1

8
00:00:29,000 --> 00:00:32,000
{\an2}Bottom-Center an2

9
00:00:33,000 --> 00:00:36,000
{\an3}Bottom-right: an3

11
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 hms

sub_content = []
fps=25 #每秒25帧
for i in range(60*10):#只生成了10分钟的时间字幕
    for s in range(fps):
        sec1=s/fps
        sec2=(s+1)/fps
        #字幕位置可以参考 https://zhuanlan.zhihu.com/p/256421100
        tmp={"from": i+sec1, "to": i+sec2, "content": r"{\an7}<font color=red size=28>当前时间</font>:"+s2hms(i+sec2)}#{\an9}表示Top-right
        sub_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 零距离震撼体验陆战之王99A主战坦克.flv -vf subtitles=字幕.srt output.flv
合并过程如下:
在这里插入图片描述

2.3 合并效果

原始的视频如下,其右上方是没有时间轴的 零距离震撼体验陆战之王99A主战坦克.flv在这里插入图片描述
添加字幕后的视频如下,其右上方多出了一个时间 output.flv
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【配置vscode编写python代码并输出到外部控制台】

配置vscode编写python代码并输出到外部控制台 1、扩展中添加python插件 2、打开一个文件夹&#xff0c;在里面新建一个.py文件&#xff0c;粘贴print(‘你好啊&#xff01;’)并运行 运行结果如下: 3、点击调试点击如下图 生成launch.json&#xff0c;将console后面改成exte…

如何搭建接口自动化测试框架

接口自动化测试框架搭建 一、原理及特点 参数放在XML文件中进行管理 用httpClient简单封装一个httpUtils工具类 测试用例管理使用了testNg管理&#xff0c;使用了TestNG参数化测试&#xff0c;通过xml文件来执行case。 测试报告这里用到第三方的包ReportNG 项目组织用Maven 二、…

在MySQL中使用!=还能走索引吗?

在MySQL中使用!还能走索引吗&#xff1f; 一般情况下&#xff0c;我们会在一个索引上较多的使用等值查询或者范围查询&#xff0c;此时索引大多可以帮助我们极快的查询出我们需要的数据。 那当我们在where条件中对索引列使用!查询&#xff0c;索引还能发挥他的作用吗&#xf…

基于SSM的网上宠物店商城交易系统

基于SSM的网上宠物店商城交易系统~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台界面 详情界面 登录界面 管理员界面 摘要 基于SSM框架的网上宠物店商城交易系统…

Vue-1.8生命周期

Vue生命周期 一个Vue实例从创建到销毁的整个过程。 生命周期&#xff1a; 1&#xff09;创建&#xff1a;响应式数据 ->发送初始化渲染请求 2&#xff09;挂载&#xff1a;渲染数据->操作dom 3&#xff09;更新&#xff1a;数据修改&#xff0c;更新视图 4&#xf…

M4Singer CUDA error: no kernel image is available for execution on the device

操作系统Ubuntu 22.04 2060 上整合好的M4Singer&#xff0c;拷贝到Ubuntu 22.04 4060ti16G上运行报错 Traceback (most recent call last): File "data_gen/tts/bin/binarize.py", line 20, in <module> binarize() File "data_gen/tts/bin/bi…

UDP协议(UDP协议特点 UDP的报文格式 UDP的服务端和客户端代码(简单的步骤))

目录 端口号 UDP协议 UDP协议特点 UDP 无连接 UDP 面向数据报 UDP 全双工 UDP 的报文格式 什么是校验和&#xff1f; 如何基于校验和来完成数据校验呢&#xff1f; CRC算法&#xff08;循环冗余算法&#xff09; MD5算法/SHA算法&#xff08;这里只介绍MD5算…

智能AI创作系统ChatGPT详细搭建教程/AI绘画系统/支持GPT联网提问/支持Prompt应用/支持国内AI模型

一、智能AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作…

JavaScript Web APIs第五天笔记

Web APIs - 第5天笔记 目标&#xff1a; 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&…

ElementUI--数据表格增删改查与表单验证

一、CRUD实现 1.1 后台CRUD编写 package com.zking.ssm.controller;import com.zking.ssm.model.Book; import com.zking.ssm.service.IBookService; import com.zking.ssm.util.JsonResponseBody; import com.zking.ssm.util.PageBean; import com.zking.ssm.vo.BookFileVo;…

arm 点灯实验代码以及现象(c语言版本)

.led.h #ifndef __LED_H__ #define __LED_H__ //构建寄存器组织结构体 typedef struct {unsigned int moder; unsigned int otyper; unsigned int ospeedr;unsigned int pupdr;unsigned int idr;unsigned int odr; }gpio_t;#define GPIOE (*(gpio_t*)0x50006000) #define G…

全图化在线系统设计

Pillars是什么 Pillars是一个Serverless全图化业务托管平台。Pillars应用全图化开发模型,提供丰富的运行时组件,支持CI/CD全生命周期项目管理,具备主动式资源优化能力。 Pillars解决什么问题 当前广告系统架构采用分布式微服务的设计理念,通过服务分治实现各组织间开发、…

java基础 API Calendar类

Calendar日历类 &#xff1a; package daysreplace;import com.sun.jdi.IntegerValue;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Date;public class Test {public static v…

关于AAPT2 error: check logs for details 的问题分析定位与排查解决方法

关于AAPT2 error: check logs for details 的问题分析定位与排查解决方法 现象描述1、排查2、定位3、解决 现象描述 在android studio的项目开发过程中&#xff0c;经常会遇到关于AAPT2 error: check logs for details 这种类似的问题。一般都是jar包冲突导致的&#xff0c;尤其…

无声的世界,精神科用药并结合临床的一些分析及笔记(四)

目录 关于镇静催眠药 第二代与第三代药物的主要区别 第二代镇静催眠药物 如何简单的识别 适用性 第三代镇静催眠药物 如何简单的识别 适用性 关于成瘾性 为什么会变胖&#xff1f; “开源” “节流” 哪种催眠药“劲儿”大? 第二代 BZDs 第三代 non-BZDs 用药…

【数据结构】算法效率的度量方法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f38f;事后统计方法 &#x1f38f;事前分析估算方法 &#x1f38f;函数的渐进式增长 结语 在上篇文章中我们提到了算法的设计要求中我们要尽量满足时间效率高…

Zabbix第二部分:基于Proxy分布式部署实现Web监控和Zabbix HA集群的搭建

代理和高可用 一、基于zabbix-proxy的分布式监控1.1 分布式监控的作用1.2 数据流向1.3 构成组件 二、部署zabbix代理服务器Step1 前置准备Step2 设置 zabbix 的下载源&#xff0c;安装 zabbix-proxyStep3 部署数据库并将zabbix相关文件导入Step4 修改zabbix-proxy的配置文件&am…

【NLTK系列01】:nltk库介绍

一、说明 NLTK是个啥&#xff1f;它是个复杂的应用库&#xff0c;可以实现基本预料库操作&#xff0c;比如&#xff0c;、将文章分词成独立token&#xff0c;等操作。从词统计、标记化、词干提取、词性标记&#xff0c;停用词收集&#xff0c;包括语义索引和依赖关系解析等。 …

ntlm哈希传递

哈希传递就是ntlm哈希 概念 早期SMB协议铭⽂在⽹络上传输数据&#xff0c;后来诞⽣了LM验证机制&#xff0c;LM机制由于过于简 单&#xff0c;微软提出了WindowsNT挑战/响应机制&#xff0c;这就是NTLM LM NTLM 哈希传递攻击是针对相同密码的用户认证直接发起攻击&#xff0c…

Flex 布局中避免子元素高度被撑高

Flex 布局中避免子元素高度被撑高 Flex 布局中子元素高度容易被最高元素撑高&#xff0c;使用 align-self 可避免。 之前&#xff1a; 之后&#xff1a; /* 此处是居中对齐&#xff0c;也可使用 flex-start 顶部对齐 */ align-self: center;