文档章节

使用FFmpeg将字幕文件集成到视频文件

j
 james_laughing
发布于 2015/10/14 17:02
字数 1703
阅读 826
收藏 3

本文最后更新于:2015-05-25 13:12:00
原文:http://www.yaosansi.com/post/ffmpeg-burn-subtitles-into-video

向视频文件里添加字幕是件很常见的事,本文使用FFmpeg将字幕文件集成到视频文件里。

在CentOS上编译安装FFmpeg

字幕文件转换

字幕文件有很多种,常见的有 .srt , .ass 文件等,下面使用FFmpeg进行相互转换。

将.srt文件转换成.ass文件

1
ffmpeg -i subtitle.srt subtitle.ass

将.ass文件转换成.srt文件

1
ffmpeg -i subtitle.ass subtitle.srt

集成字幕,选择播放

这种字幕集成比较简单,播放时需要在播放器中选择相应的字幕文件。

1
ffmpeg -i input.mp4 -i subtitles.srt -c:s mov_text -c:v copy -c:a copy output.mp4

嵌入SRT字幕到视频文件

单独SRT字幕

字幕文件为subtitle.srt

1
ffmpeg -i video.avi -vf subtitles=subtitle.srt out.avi

嵌入在MKV等容器的字幕

将video.mkv中的字幕(默认)嵌入到out.avi文件

1
ffmpeg -i video.mkv -vf subtitles=video.mkv out.avi

将video.mkv中的字幕(第二个)嵌入到out.avi文件

1
ffmpeg -i video.mkv -vf subtitles=video.mkv:si=1 out.avi

嵌入ASS字幕到视频文件

1
ffmpeg -i video.avi -vf "ass=subtitle.ass" out.avi

不能加载fontconfig文件

1 2 3 4
Fontconfig error: Cannot load default config file [Parsed_ass_0 @ 0000000002bfa3e0] No usable fontconfig configuration file found,  using fallback. Fontconfig error: Cannot load default config file

出现类似错误的原因是无法加载字体配置文件。

环境变量

FFmpeg使用的默认字体文件是使用系统环境变量中对应的文件位置。

默认文件名:fonts.conf

环境变量 FONTCONFIG_FILE 可以覆盖默认配置文件
环境变量 FONTCONFIG_PATH 可以覆盖默认配置文件目录

Linux 默认配置文件:fonts.conf

使用步骤:

  1. 以root权限登录
  2. 建立/etc/fonts目录
  3. 下载fonts.conf文件到/etc/fonts目录
  4. 设置fonts.conf文件权限为可读

Linux/Mac 系统

在~/.bashrc 最后添加:

1
export FONTCONFIG_PATH=/opt/X11/lib/X11/fontconfig

使之有效:

1
source ~/.bashrc

编辑 /opt/X11/lib/X11/fontconfig/fonts.conf 在字体目录添加 /Library/Fonts

1 2 3 4 5 6
<!-- Font directory list -->   <dir>/opt/X11/share/fonts</dir>  <dir>/usr/X11R6/lib/X11/fonts</dir>  <dir>~/.fonts</dir>  <dir>/Library/Fonts</dir>

Windows系统

在系统环境变量中添加:

name: FONTCONFIG_PATH
value: J:/ffmpeg (我本机ffmpeg目录,与fonts.conf同目录即可)

将fonts.conf文件放至上述指定目录。

以下为yaosansi使用的fonts.conf文件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <!-- /etc/fonts/fonts.conf file to configure system font access --> <fontconfig>  <!--  DO NOT EDIT THIS FILE.  IT WILL BE REPLACED WHEN FONTCONFIG IS UPDATED.  LOCAL CHANGES BELONG IN 'local.conf'.   The intent of this standard configuration file is to be adequate for  most environments. If you have a reasonably normal environment and  have found problems with this configuration, they are probably  things that others will also want fixed. Please submit any  problems to the fontconfig bugzilla system located at fontconfig.org   Note that the normal 'make install' procedure for fontconfig is to  replace any existing fonts.conf file with the new version. Place  any local customizations in local.conf which this file references.   Keith Packard -->  <!-- Font directory list -->   <dir>C:/Windows/Fonts</dir> <!--  Accept deprecated 'mono' alias, replacing it with 'monospace' -->  <match target="pattern">  <test qual="any" name="family">  <string>mono</string>  </test>  <edit name="family" mode="assign">  <string>monospace</string>  </edit>  </match>  <!--  Accept alternate 'sans serif' spelling, replacing it with 'sans-serif' -->  <match target="pattern">  <test qual="any" name="family">  <string>sans serif</string>  </test>  <edit name="family" mode="assign">  <string>sans-serif</string>  </edit>  </match>  <!--  Accept deprecated 'sans' alias, replacing it with 'sans-serif' -->  <match target="pattern">  <test qual="any" name="family">  <string>sans</string>  </test>  <edit name="family" mode="assign">  <string>sans-serif</string>  </edit>  </match>  <!--  Mark common families with their generics so we'll get  something reasonable -->  <!--  Serif faces  -->  <alias>  <family>Times New Roman</family>  <default><family>serif</family></default>  </alias>  <!--  If the font still has no generic name, add sans-serif  -->  <match target="pattern">  <test qual="all" name="family" compare="not_eq">  <string>sans-serif</string>  </test>  <test qual="all" name="family" compare="not_eq">  <string>serif</string>  </test>  <test qual="all" name="family" compare="not_eq">  <string>monospace</string>  </test>  <edit name="family" mode="append_last">  <string>sans-serif</string>  </edit>  </match>  <!--  AMT provides metric and shape compatible fonts for these three web font  families.  -->  <alias>  <family>Times New Roman</family>  <accept><family>Thorndale AMT</family></accept>  </alias>  <alias>  <family>Arial</family>  <accept><family>Albany AMT</family></accept>  </alias>  <alias>  <family>Courier New</family>  <accept><family>Cumberland AMT</family></accept>  </alias>   <!--  Some Asian fonts misadvertise themselves as monospaced when  in fact they are dual-spaced (half and full). This makes  FreeType very confused as it forces all widths to match.  Undo this magic by disabling the width forcing code -->  <match target="font">  <test name="family"><string>GulimChe</string></test>  <edit name="globaladvance"><bool>false</bool></edit>  </match>   <match target="font">  <test name="family"><string>DotumChe</string></test>  <edit name="globaladvance"><bool>false</bool></edit>  </match>   <match target="font">  <test name="family"><string>BatangChe</string></test>  <edit name="globaladvance"><bool>false</bool></edit>  </match>   <match target="font">  <test name="family"><string>GungsuhChe</string></test>  <edit name="globaladvance"><bool>false</bool></edit>  </match>      <config> <!--  These are the default Unicode chars that are expected to be blank  in fonts. All other blank chars are assumed to be broken and  won't appear in the resulting charsets  -->  <blank>  <int>0x0020</int> <!-- SPACE -->  <int>0x00A0</int> <!-- NO-BREAK SPACE -->  <int>0x00AD</int> <!-- SOFT HYPHEN -->  <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER -->  <int>0x0600</int> <!-- ARABIC NUMBER SIGN -->  <int>0x0601</int> <!-- ARABIC SIGN SANAH -->  <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER -->  <int>0x0603</int> <!-- ARABIC SIGN SAFHA -->  <int>0x06DD</int> <!-- ARABIC END OF AYAH -->  <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK -->  <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER -->  <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER -->  <int>0x1680</int> <!-- OGHAM SPACE MARK -->  <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ -->  <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA -->  <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR -->  <int>0x2000</int> <!-- EN QUAD -->  <int>0x2001</int> <!-- EM QUAD -->  <int>0x2002</int> <!-- EN SPACE -->  <int>0x2003</int> <!-- EM SPACE -->  <int>0x2004</int> <!-- THREE-PER-EM SPACE -->  <int>0x2005</int> <!-- FOUR-PER-EM SPACE -->  <int>0x2006</int> <!-- SIX-PER-EM SPACE -->  <int>0x2007</int> <!-- FIGURE SPACE -->  <int>0x2008</int> <!-- PUNCTUATION SPACE -->  <int>0x2009</int> <!-- THIN SPACE -->  <int>0x200A</int> <!-- HAIR SPACE -->  <int>0x200B</int> <!-- ZERO WIDTH SPACE -->  <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER -->  <int>0x200D</int> <!-- ZERO WIDTH JOINER -->  <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK -->  <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK -->  <int>0x2028</int> <!-- LINE SEPARATOR -->  <int>0x2029</int> <!-- PARAGRAPH SEPARATOR -->  <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING -->  <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING -->  <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING -->  <int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE -->  <int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE -->  <int>0x202F</int> <!-- NARROW NO-BREAK SPACE -->  <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE -->  <int>0x2060</int> <!-- WORD JOINER -->  <int>0x2061</int> <!-- FUNCTION APPLICATION -->  <int>0x2062</int> <!-- INVISIBLE TIMES -->  <int>0x2063</int> <!-- INVISIBLE SEPARATOR -->  <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING -->  <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING -->  <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING -->  <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING -->  <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES -->  <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES -->  <int>0x3000</int> <!-- IDEOGRAPHIC SPACE -->  <int>0x3164</int> <!-- HANGUL FILLER -->  <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE -->  <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER -->  <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR -->  <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR -->  <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR -->  </blank> <!--  Rescan configuration every 30 seconds when FcFontSetList is called  -->  <rescan>  <int>30</int>  </rescan>  </config>  </fontconfig>  

参考

本文转载自:http://www.yaosansi.com/post/ffmpeg-burn-subtitles-into-video/

共有 人打赏支持
j
粉丝 27
博文 455
码字总数 22188
作品 0
广州
私信 提问
FFmpeg详解及常用命令使用

FFMPEG简介 FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式、多媒体传输协议以及音视频编解码器,提供了录制、转换以及流化音视频的完整解决方案。...

qq_1196581964
2018/11/25
0
0
学习FFmpeg API – 解码视频

ffmpeg是编解码的利器,用了很久,以前看过dranger 的教程,非常精彩,受益颇多,是学习ffmpeg api很好的材料。可惜的是其针对的ffmpeg版本已经比较老了,而ffmpeg的更新又很快,有些API已经...

霄霄月月
2012/05/08
0
32
Android使用FFmpeg(二)--Android Studio配置ffmpeg

关于 Android使用FFmpeg(一)--编译ffmpeg Android使用FFmpeg(二)--Android Studio配置ffmpeg Android使用FFmpeg(三)--ffmpeg实现视频播放 Android使用FFmpeg(四)--ffmpeg实现音频播放(使用A...

天王盖地虎626
01/14
0
0
iOS音视频—FFmepg:iOS平台下集成和应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wtdask/article/details/83901924 1.在iOS平台下集成和应用FFmpeg Mac配置FFmpeg环境 1、安装homebrew 2、安装...

十二指环
2018/11/12
0
0
FFmpeg 3.4 发布,多媒体处理工具合集

FFmpeg 3.4 已发布。FFmpeg 是用于处理音频、视频、字幕和相关元数据的多媒体内容的库和工具的合集。 库: libavutil 55. 78.100, libavcodec 57.107.100, libavformat 57. 83.100, libavde...

周其
2018/01/01
3.4K
5

没有更多内容

加载失败,请刷新页面

加载更多

取变量的地址赋值给另一个变量,C通过,C++编译出错

取变量的地址赋值给另一个变量,C通过。正常运行,C++编译出错。 代码如下: #include <stdio.h>int main(int argc, char *argv[]){int x = 3;int *p = &x;int y = p;/*c ...

SamXIAO
43分钟前
1
0
利用隐写术实施攻击

尽管隐写术是一种低频攻击途径,但网络犯罪分子已经开始利用它结合社交媒体的普遍性和快速传播性来传递恶意有效负载。 低调但有效的隐写技术虽然是旧把戏,但将代码隐藏在看似正常的图像中,...

Linux就该这么学
43分钟前
2
0
YII2的乐观锁和悲观锁

乐观锁与悲观锁¶ Web应用往往面临多用户环境,这种情况下的并发写入控制, 几乎成为每个开发人员都必须掌握的一项技能。 在并发环境下,有可能会出现脏读(Dirty Read)、不可重复读(Unrep...

echojson
49分钟前
2
0
UCOS线程切换原理

黑客画家
55分钟前
2
0
最牛Java架构师进阶路线(年薪80W)

1、源码分析专题 详细介绍源码中所用到的经典设计思想,看看大牛是如何写代码的,提升技术审美、提高核心竞争力。 帮助大家寻找分析源码的切入点,在思想上来一次巨大的升华。知其然,并知其...

别打我会飞
55分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部