当前位置: 首页 > 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;在接口这…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...