FFmpeg添加字幕的详细操作

FFmpeg添加字幕的详细操作

在视频中添加字幕可以使视频更具可读性,并为观众提供更好的观看体验,这在多语种内容中尤为重要。FFmpeg是一个流行的开源视频处理工具,它可以被用来给视频添加字幕。本文将介绍FFmpeg集成libass的编译流程,介绍SRT和ASS字幕格式及其参数,如何使用FFmpeg向视频添加硬字幕和软字幕,并通过示例演示如何生成单一字幕和多项字幕。

而本文最后实现的效果为:默认中英文字幕,可选英文字幕的软字幕的实现:
中英多通道字幕

1. 硬字幕和软字幕的简介

1.1. 硬字幕

将字幕渲染到视频的纹理上,然后将其编码成独立于视频格式的一个完整的视频。硬字幕不能更改或删除,因为它们与视频(通道)是一个整体。

1.2. 软字幕

在播放视频时实时渲染和读取。软字幕可以在播放过程中随时添加或删除。软字幕比硬字幕更加灵活,因为它们可以随时进行修改,但它们也需要高性能的播放器支持。

软字幕单独生成一个字幕通道,与视频
、音频一样,如以下Stream #0:2

  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 852x480, 397 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:2[0x3](eng): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
    Metadata:
      handler_name    : SubtitleHandler

2. SRT和ASS字幕格式的简介

2.1. SRT(SubRip Subtitle)

是一种简单的字幕格式,主要由时间戳和文本组成。它通常用于简单的字幕文件,如电影聚会之类。SRT字幕格式的参数如下:

  • 标题的计数器/索引
  • START和END:字幕开始和字幕结束的时间戳,格式为 “小时:分钟:毫秒”。
  • TEXT:在此时间戳范围内显示的字幕文本
  • 一行空白表示一个结束
1
00:00:0,000 --> 00:00:2,000
这是0到2秒显示的字幕

2
00:00:2,000 --> 00:00:4,000 
这是2到4秒显示的字幕

3
00:00:4,000 --> 00:00:7,000
这是4到7秒显示的字幕

2.2. ASS(Advanced SubStation Alpha)

是一个高级的字幕格式,它可以支持更多的样式和控制,比如,更改颜色、字体和大小,还可以通过几何变换来控制字幕的位置。ASS字幕格式包含以下参数:

2.2.1. 样式:

Style: 序号, 字体名称, 字号, 颜色, 阴影, 边框, 描边, 阴影, 抗锯齿, 倾斜度, weight, underline
例子:Style: Top, Microsoft YaHei,40,&H00F5FF&,-1,2,0,0,1,0,0

2.2.2. 对齐:

Dialogue: 0,0:00:03.42,0:00:04.91,Top,,0,0,0,,{\an6}本字幕居右上

其中\an6表示右上角对齐,默认是左下角对齐。

2.2.3. 触发器:

Dialogue: 0,0:00:03.42,0:00:04.91,Top,,0,0,0,,{\t(0,300,\fade(400,400))}三秒内渐入渐出

其中\fade(400,400)表示透明度从0渐变到400再从400渐变到0。

2.2.4. 动画:

Dialogue: 0,0:00:03.42,0:00:04.91,Top,,0,0,0,,{\move(0,0,100,100)}右下角移动

其中\move(0,0,100,100)表示从(0,0)移动到(100,100)。

2.2.5. 特殊效果:

Dialogue: 0,0:00:03.42,0:00:05.62,Top,,0,0,0,,{\fad(500,500)\blur3}左右淡入淡出,模糊度3

其中\blur3表示模糊度为3。

2.2.6. 合的ASS字幕案例:

[Script Info]
; Script generated by FFmpeg/Lavc59.18.100
Title: 某电影
Original Script: 某人
ScriptType: v4.00+
WrapStyle: 0
Collisions: Normal
PlayResX: 1920
PlayResY: 1080
Timer: 100.0000

[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,30,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,50,0

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:02.00,Default,,0,0,0,,这是0到2秒显示的{\b1}{\i1}字幕{\i0}{\b0}
Dialogue: 0,0:00:02.00,0:00:04.00,Default,,0,0,0,,这是2到4秒显示的字幕
Dialogue: 0,0:00:04.00,0:00:07.00,Default,,0,0,0,,这是4到7秒显示的字幕
Dialogue: 0,0:00:07.00,0:00:10.00,Default,,0,0,0,,这是7到10秒显示的字幕
Dialogue: 0,0:00:10.00,0:00:30.00,Default,,0,0,0,,这是10到30秒显示的字幕{\an5\move(960,700,960,900)\t(\fscx200\fscy200\frx360\fry360\fad(200,200))\fs60\p5\t(\fscx100\fscy100\frx0\fry0\fad(200,200))\c&HFFFFFF&\3c&HA000&}高级操作.

在这个案例中,我们可以看到SCRIPT INFO中定义了脚本的一些基本信息,V4 Styles中定义了字幕样式,Events中定义了具体的字幕内容和效果。

在字幕内容中,使用了\an5表示居中上对齐,\move(960,700,960,900)表示在x=960,y从700移动到900,\t()表示特效,\fscx表示X轴缩放,\fscy表示Y轴缩放,\frx表示X轴旋转,\fry表示Y轴旋转,\fs表示字号大小,\p表示描边的点数,\c表示字体颜色,\3c表示描边的颜色。

此外,在这个案例中还使用了透明度、渐变、模糊等各种效果,可以看出ASS字幕的灵活性和功能性非常强大。

3. 使用FFmpeg添加字幕的流程

3.1. 编译带有libass的FFmpeg

    1. 下载FFmpeg6.0源码
    1. 下载libass,解压到FFmpeg源码目录,并且重命名为libass
    1. 在FFmpeg根目录编写编译脚本,并且执行
    function build() {
        ./configure \
        --prefix=$PREFIX \
        --target-os=$PLATFORM \
        --disable-static \
        --enable-libass \
        --enable-shared || exit 0
        make clean
        make install
    }
    PREFIX=/usr/local/ffmpeg
    #PLATFORM=linux
    PLATFORM=darwin
    
    build
    
    1. 编译完成后,查看版本信息:/usr/local/ffmpeg/bin/ffmpeg -version,可见启用了--enable-libass
    MacBook-Pro:FFmpeg-n6.0 mac$ /usr/local/ffmpeg/bin/ffmpeg -version
    ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers
    built with Apple clang version 14.0.0 (clang-1400.0.29.202)
    configuration: --prefix=/usr/local/ffmpeg --target-os=darwin --disable-static --enable-libass --enable-libass --enable-gpl --extra-cflags=-I/usr/local/ffmpeg/libx264/include --extra-ldflags=-L/usr/local/ffmpeg/libx264/lib --enable-libx264 --enable-shared
    libavutil      58.  2.100 / 58.  2.100
    libavcodec     60.  3.100 / 60.  3.100
    libavformat    60.  3.100 / 60.  3.100
    libavdevice    60.  1.100 / 60.  1.100
    libavfilter     9.  3.100 /  9.  3.100
    libswscale      7.  1.100 /  7.  1.100
    libswresample   4. 10.100 /  4. 10.100
    libpostproc    57.  1.100 / 57.  1.100
    

    可以配置环境变量,方便使用

3.2. 生成字幕命令

3.2.1 SRT硬字幕命令

ffmpeg -i input.mp4 -vf subtitles=subtitle.srt output_srt.mp4

3.2.2 ASS硬字幕命令

ffmpeg -i input.mp4 -vf ass=subtitle.ass output_ass.mp4

3.2.3 SRT和ASS软字幕命令

ffmpeg -i input.mp4 -i subtitle.srt -c copy -c:s mov_text -metadata:s:s:0 language=chi ouptut_chi.mp4
or
ffmpeg -i input.mp4 -i subtitle.ass -c copy -c:s mov_text -metadata:s:s:0 language=chi ouptut_chi.mp4

3.2.4 SRT可以转ASS命令

ffmpeg -i subtitle.srt subtitle.ass

3.2.3 多通道(软)字幕命令

1. 准备字幕文件:假设有中文字幕文件为ch.srt,英文字幕文件为en.srt

  • 中文字幕文件:ch.srt
1
00:00:0,000 --> 00:00:5,000
这里是视频的标题 1

2
00:00:5,000 --> 00:00:10,000 
这里是视频的标题 2
  • 英文字幕文件:en.srt
1
00:00:0,000 --> 00:00:5,000
Here's the video's title 1

2
00:00:5,000 --> 00:00:10,000 
Here's the video's title 2

2. 命令

ffmpeg -i input.mp4 -i ch.srt -i en.srt -map 0 -map 1 -map 2 -c copy -c:s mov_text -metadata:s:s:0 language=chi -metadata:s:s:1 language=eng output_chi_eng.mp4

注意:ass格式同样的操作

ffmpeg -i input.mp4 -i ch.ass -i en.ass -map 0 -map 1 -map 2 -c copy -c:s mov_text -metadata:s:s:0 language=chi -metadata:s:s:1 language=eng output_chi_eng_ass.mp4

3.2.4 多通道(软)字幕,中英字幕实现

1. 准备字幕文件:假设有中英文字幕文件为ch_en.srt,英文字幕文件为en.srt

  • 中文字幕文件:ch_en.srt
1
00:00:0,000 --> 00:00:5,000
这里是视频的标题 1
Here's the video's title 1

2
00:00:5,000 --> 00:00:10,000 
这里是视频的标题 2
Here's the video's title 2
  • 英文字幕文件:en.srt
1
00:00:0,000 --> 00:00:5,000
Here's the video's title 1

2
00:00:5,000 --> 00:00:10,000 
Here's the video's title 2

2. 命令

ffmpeg -i input.mp4 -i ch_en.srt -i en.srt -map 0 -map 1 -map 2 -c copy -c:s mov_text -metadata:s:s:0 language=chi_eng -metadata:s:s:1 language=eng output_chi_eng_eng.mp4

3. 最后使用ffprobe查看一下生成文件的内容

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output_chi_eng_eng.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.3.100
    description     : Bilibili VXCode Swarm Transcoder v0.6.11
  Duration: 00:05:24.20, start: 0.000000, bitrate: 531 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 852x480, 397 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:2[0x3](chi): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
    Metadata:
      handler_name    : SubtitleHandler
  Stream #0:3[0x4](eng): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s
    Metadata:
      handler_name    : SubtitleHandler

来自维护项目,https://github.com/xhunmon/VABlog:
YUV/PCM/H264/H265/AAC/FFmpeg/Opengl. 这有丰富的音视频开发的学习资源、开发工具、优秀书籍、教程、面试题和开源项目,旨在帮助开发者和爱好者更好地学习、实践和工作。

参考:

  • https://www.bannerbear.com/blog/how-to-add-subtitles-to-a-video-file-using-ffmpeg/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【沐风老师】教你在3dMax中使用Greeble插件结合变形修改器建模

3dMax在Greeble中使用变形修改器 Greeble一个有趣的修改器插件,用于快速生成诸如低模城市建筑群、太空船模型、死亡星等的随机细节。。。 我们在之前的教程中介绿过Greeble的安装和基本使用方法,在本教程中,我们将学习如何使用Greeble插件和变形修改器来制作效果。 【开始…

深度学习数据集—水果数据集大合集

近期整理的各类水果(包括干果)数据集,分享给大家。 1、8类水果图片数据集(每类100张图片左右)[橘子,菠萝,苹果,木瓜,火龙果,香蕉,樱桃&#xff0…

聊天Chat

前言 加油 原文 聊天常用会话 ❶ Don’t count on him. 别指望他。 ❷ They underestimated the enemy’s strength. 他们低估了敌人的力量。 ❸ The plan went according to his perspective. 计划是按照他的想法进行的。 ❹ This project involves many difficulties. …

【C++】开散列哈希表封装实现unordered_map和unordered_set

在未达成目的之前,一切具有诱惑力的事物都显得那么不堪一击 文章目录一、unordered系列关联式容器二、哈希函数和哈希冲突三、闭散列(你抢我的位置,我抢他的位置)1.哈希表结构2.Insert()3.Erase()(标记的伪删除法&…

归并排序介绍、详解、案例

排序 计数排序介绍、详解、案例快速排序介绍、详解、案例归并排序介绍、详解、案例 归并排序也是基于分治法的排序算法,为了排序长度为n的数组,需要先排序长度为n/2的字数组,然后合并这两个排序字数组于是整个数组也就排序完毕。 排序过程 以…

浅谈JVM(五):虚拟机栈帧结构

上一篇: 浅谈JVM(一):Class文件解析 浅谈JVM(二):类加载机制 浅谈JVM(三):类加载器和双亲委派 浅谈JVM(四):运行时数据区 5.虚拟机栈帧结构 ​ 方法是程序执行的最小单元,每个方法被执行时都会创建一个栈帧…

驱动开发:内核使用IO/DPC定时器

本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如…

内卷?焦虑?35岁?找不到工作?端正态度激励一下正在挣扎的Android程序员

前言 亲爱的各位Android程序员,您们好: 我理解您们的焦虑和困惑,但我想告诉您的是:作为一名Android程序员,您依然是非常有前途和市场需求的职业人才。 首先,您要知道,移动互联网时代的普及率…

【数据结构】时间复杂度和空间复杂度

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法ing ✈️专栏:【数据结构】 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点…

1662_MIT 6.828 JOS check_page_free_list实现分析以及boot_alloc问题修复

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 继续尝试完善分析JOS的代码中存储管理的部分。 上次看到了这里,本来想先去看看这两个函数实现。但是缺失了调用场景,感觉理解也不一定准确。…

对拍程序 并查集专题 (C++ | 洛谷 | acwing | 蓝桥)

文章目录【蓝桥杯专题】 (C | 洛谷 | acwing | 蓝桥)1249. 亲戚836. 合并集合837. 连通块中点的数量238. 银河英雄传说 【带权并查集】145. 超市 【并查集 贪心】4793. 危险程度 (连通块并查集 )普通oi 读文件对拍程序【蓝桥杯专题】 &#…

树和二叉树相关的练习(选择题)

目录 一、二叉树 二、堆 三、遍历二叉树 一、二叉树 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )。 A. 不存在这样的二叉树 B. 200 C. 198 D. 199 下列数据结构中,不适合…

C++ Primer Plus 学习笔记(八)——输入、输出和文件

1 流和缓冲区 C程序把输入和输出看作字节流。输入时,程序从输入流中抽取字节;输出时,程序将字节插入到输出流中。 缓冲区是用作中介的内存块,它是将信息从设备传输到程序或从程序传输给设备的临时存储工具,通过使用缓…

HTTP协议:当下最主流的应用层协议之一,你确定不了解一下吗?

一.HTTP协议的含义http是什么?超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。‘超’可以理解为除了文本之外的图片,音频和视频,和一些其他…

STM32基于HAL工程FREERTOS读取DS18B20数据+串口输出

STM32基于HAL工程FREERTOS读取DS18B20数据串口输出✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!🍁对于文中所提供的相关资源链接将作不定期更换。…

无需公网IP,远程连接SQL Server数据库【内网穿透】

文章目录1.前言2.本地安装和设置SQL Server2.1 SQL Server下载2.2 SQL Server本地连接测试2.3 Cpolar内网穿透的下载和安装2.3 Cpolar内网穿透的注册3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5.结语1.前言 数据库的重要性相信大家都有所了解&#xf…

现代前端开发者的自我迷失,你还会前端基础知识吗?

通常来说,我认为情况并不算糟糕,熟练的手可以几乎做到一切。然而,最近我注意到一些事情改变了我对这个行业的看法。似乎在这些无尽的趋势、范式和新奇玩意中,我们忘记了前端开发的支柱(意思是忘记了基础知识&#xff0…

【python】GIL全局锁

一、原理: 全局解释器锁(Global Interpreter Lock,GIL)规定全局范围内任意时候一个进程里只能同时执行一个线程。每一个线程在执行时,都会锁住GIL,以阻止别的线程执行;执行一段时间后&#xff…

OBCP第四章 SQL调优-SQL执行性能监控

(g)v$sql_audit 全局 SQL 审计表 基于虚拟表__all_virtual_sql_audit的视图, 该虚拟表对应的数据存放在一个可配置的内存空间中 由于存放这些记录的内存是有限的,因此到达一定内存使用量,会触发淘汰 可以用来查看每次请求客户端来源&…

【操作系统复习】第3章 处理机调度与死锁 3

死锁(Deadlock):指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,这些进程都将永远不能再向前推进。 对资源不加限制地分配可能导致进程间由于竞争资源而相互制约…
最新文章