当前位置: 首页 > news >正文

基于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 零距离震撼体验陆战之王99A主战坦克.flv -vf subtitles=字幕.srt output.flv
合并过程如下:
在这里插入图片描述

2.3 合并效果

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

相关文章:

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

FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序&#xff0c;我们可以基于ffmpeg对视频进行各种操作。本文主要介绍基于ffmpeg给视频添加字幕&#xff0c;字幕的内容为视频所播放的时间&#xff08;故需要安装ffmpeg&#xff0c;具…...

爬虫基础知识点快速入门

以下是一个包含注释的Python示例&#xff0c;演示了基本的网页爬取过程&#xff0c;以及一些常见的爬虫知识点&#xff1a; # 导入必要的库 import requests # 用于发送HTTP请求 from bs4 import BeautifulSoup # 用于解析HTML import csv # 用于数据存储# 1. 指定目标网站…...

解释器模式 行为型模式之五

1.定义 给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器。比如加减乘除在代码里是一种表示&#xff0c;我们需要翻译成可以阅读的数学公式&#xff0c;并且可以供用户输入数字得到输出结果。 2.组成结构 抽象表达式&#xff08;Abstract Expres…...

2023年中国汽车座舱行业发展现状及趋势分析:高级人机交互(HMI)系统将逐步提升[图]

2022年有22.3%的汽车用户认为座舱内车载娱乐功能成为影响使用体验的关键因素。当前智能电动汽车的用户画像与娱乐、游戏等应用的用户画像相似&#xff0c;均以年轻人作为目标用户。年轻化的用户将娱乐功能的使用习惯延伸至汽车座舱内&#xff0c;对于座舱功能的需求不再局限于导…...

常见的通用型项目管理软件推荐

常用项目管理软件有很多。按适合的行业来分&#xff0c;有针对各种垂直行业定制的&#xff0c;也有全行业通用的。从厂商来看&#xff0c;有国外研发的&#xff0c;也有国内厂商的&#xff0c;体现在软件的设计思路不同&#xff0c;上手的手感也很不一样。从体量来看&#xff0…...

手机总是提醒系统更新,到底要不要更新呢?

不知道你们会不会和我一样&#xff0c;在收到手机系统更新的通知时&#xff0c;犹豫要不要更新? 更新完了手机会变卡顿吗? 每次都要更新吗?怎样才能关闭它呢&#xff1f; 01 手机系统更新啥内容? 手机系统更新可以分为大版本更新和小版本更新。 (1) 大版本更新 如iOS15升…...

什么是API

API (Application Programming Interface,应用程序编程接口) Java中的API 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层封装起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需要学习这些类如何使用即可&#xff0c;我们可以通过帮助文档…...

RedissonClient 分布式锁 处理并发访问共享资源

1.分布式锁的概念及需求 分布式锁是一种在多个进程或线程之间同步访问共享资源的机制。在分布式系统中&#xff0c;由于各个节点之间的通信延迟以及资源访问的竞争&#xff0c;可能导致数据不一致和并发问题。为了解决这些问题&#xff0c;我们需要一种能够在不同节点上保证同…...

Hadoop-2.5.2平台环境搭建遇到的问题

文章目录 一、集群环境二、MySQL2.1 MySQL初始化失败2.2 MySQL启动报错2.3 启动时报不能打开日志错2.4 mysql启动时pid报错 二、Hive2.1 mr shuffle不存在2.1.2 查看yarn任务&#xff1a;2.1.3 问题描述&#xff1a;2.1.4 参考文档 一、集群环境 java-1.8.0-openjdk-1.8.0.181…...

基于WTMM算法的图像多重分形谱计算matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、WTMM算法概述 4.2、WTMM算法原理 4.2.1 二维小波变换 4.2.2 模极大值检测 4.2.3 多重分形谱计算 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部…...

VR全景展示带来旅游新体验,助力旅游业发展!

引言&#xff1a; VR&#xff08;虚拟现实&#xff09;技术正以惊人的速度改变着各行各业&#xff0c;在旅游业中&#xff0c;VR全景展示也展现了其惊人的影响力&#xff0c;为景区带来了全新的宣传机会和游客体验。 一&#xff0e;什么是VR全景展示&#xff1f; VR全景展示是…...

Xcode 15 编译出错问题解决

正常升级xcode 15以后发现原来没有出现报错的代码&#xff0c;现在出现了编译错误。&#xff08;如果没有出现请忽略&#xff09;下面教你如何解决这个问题。 1、pod update更新cocoapods&#xff0c;因为其根据xcode15做了很多的更新&#xff0c;保证cocoapods是最新的。 千…...

基于指数趋近律的机器人滑模轨迹跟踪控制算法及MATLAB仿真

机械手是工业制造领域中应用最广泛的自动化机械设备&#xff0c;广泛应用于工业制造、医疗、军工、半导体制造、太空探索等领域。它们虽然形式不同&#xff0c;但都有一个共同的特点&#xff0c;即能够接受指令&#xff0c;并能准确定位到三维(或二维)空间的某一点进行工作。由…...

华为云API自然语言处理的魅力—AI情感分析、文本分析

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI自言语言的情感分析、文本分词、文本翻译 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&a…...

微擎小程序获取不到头像和昵称解决方案

这是一个使用微擎小程序的代码示例&#xff0c;其中包含了获取用户头像和昵称的功能。以下是解决方案&#xff1a; 首先&#xff0c;在<button>标签上添加open-type"chooseAvatar"属性&#xff0c;并绑定bindchooseavatar事件&#xff1a; <button class&qu…...

Qt 对界面类重命名的步骤

有些时候因为一些原因&#xff0c;需要修改Qt中创建的界面类&#xff0c;修改的地方比较多&#xff0c;一定要留意有没有修改完全&#xff0c;否则会出现各种奇怪报错。 比如&#xff0c;将MainWindow界面类名修改为lb_logdisplay 修改步骤&#xff1a; 修改文件名&#xff1a;…...

使用docker搭建nacos单机、集群 + mysql

单机搭建 1 拉取mysql镜像 docker pull mysql:5.7.40 2 启动mysql容器 docker run -d --namemysql-server -p 3306:3306 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.7.40 3 执行nacos的数据库脚本 /* * Copyright 1999-2018 Alibaba Group Holding L…...

FreeRTOS自我救赎2之基本工程建立

System Core 1.System Core >SYS 2.System Core >RCC 3.System Core >NVIC Middleware Middleware >FREERTOS Clock configuration Project Manager 在编译生成的代码前需要找一个与芯片对应的启动文件&#xff0c;启动文件添加进来&#xff0c;编译就没问题了...

【C++设计模式之解释器模式:行为型】分析及示例

简介 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种解决问题的方法&#xff0c;通过定义语言的文法规则&#xff0c;解释并执行特定的语言表达式。 解释器模式通过使用表达式和解释器&#xff0c;将文法规则中的句子逐…...

35 WEB漏洞-逻辑越权之找回机制及接口安全

目录 找回重置机制接口调用乱用演示案例绑定手机验证码逻辑-Rep状态值篡改-实例某APP短信轰炸接口乱用-实例接口调用发包 文章分享&#xff1a;https://www.cnblogs.com/zhengna/p/15655691.html 有支付接口、短信发送接口&#xff0c;邮箱的发送接口等等&#xff0c;在接口这…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...