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

本文最后更新于: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> 

参考

时间: 2024-10-06 08:13:51

使用FFmpeg将字幕文件集成到视频文件的相关文章

用Python和FFmpeg查找大码率的视频文件

用Python和FFmpeg查找大码率的视频文件 本文使用Python2.7, 这个工作分两步 遍历文件夹下的视频文件 用ffprobe获取是视频文件的码率信息 用ffprobe 获取json格式的视频信息 用ffprobe.exe是FFmpeg自带的查看视频信息的工具,其获取json格式的信息命令如下 ffprobe -v quiet -print_format json -show_format -show_streams -i filename 这个命令会输出 带有 streams和for

【FFMpeg视频开发与应用基础】五、调用FFMpeg SDK封装音频和视频为视频文件

<FFMpeg视频开发与应用基础--使用FFMpeg工具与SDK>视频教程已经在"CSDN学院"上线,视频中包含了从0开始逐行代码实现FFMpeg视频开发的过程,欢迎观看!链接地址:FFMpeg视频开发与应用基础--使用FFMpeg工具与SDK 工程代码地址:FFmpeg_Tutorial 音频和视频的封装过程为解封装的逆过程,即将独立的音频数据和视频数据按照容器文件所规定的格式封装为一个完整的视频文件的过程.对于大多数消费者来说,视频封装的容器是大家最为熟悉的,因为它直接

FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑

FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没有一个人对FFmpeg这个名称感到陌生.FFmpeg是一套非常知名的音视频处理的开源工具,它包含了开发完成的工具软件.封装好的函数库以及源代码供我们按需使用.FFmpeg提供了非常强大的功能,可以完成音视频的编码.解码.转码.视频采集.后处理(抓图.水印.封装/解封装.格式转换等),还有流媒体服务等

(转载)[FFmpeg]使用ffmpeg从各种视频文件中直接截取视频图片

你曾想过从一个视频文件中提取图片吗?在Linux下就可以,在这个教程中我将使用ffmpeg来从视频中获取图片. 什么是ffmpeg?What is ffmpeg? ffmpeg是一个非常有用的命令行程序,它可以用来转码媒体文件.它是领先的多媒体框架FFmpeg的一部分,其有很多功能,比如解码.编码.转码.混流.分离.转化为流.过滤以及播放几乎所有的由人和机器创建的媒体文件. 在这个框架中包含有各种工具,每一个用于完成特定的功能.例如,ffserver能够将多媒体文件转化为用于实时广播的流,ffp

使用ffmpeg合并视频文件的三种方法

ffmpeg合并视频的方法有三种.国内大多数仅介绍了其中之一.于是觉得有必要翻译一下.其实在ffmpeg的 FAQ文档中有比较详细的说明. 使用concat协议进行视频文件的合并 这种方式的适用场景是:视频容器是MPEG-1, MPEG-2 PS或DV等可以直接进行合并的.换句话说,其实可以直接用cat或者copy之类的命令来对视频直接进行合并.很多文章介绍了这种方法,但适用性却没有提及.这并不是一个通用的方法.典型的命令示例如下: ffmpeg -i concat:"intermediate1

【学习ffmpeg】打开视频文件,帧分析,并bmp保存关键帧

http://www.tuicool.com/articles/jiUzua http://blog.csdn.net/code_future/article/details/8646717 主题 FFmpeg 任务:需要把一个视频文件的每一帧提取出来,每帧存储成单独的文件. 以前用Matlab处理过这个问题,可是感觉比较慢,而且最近正在逐步转向使用开源的东西.因此搜到ffmpeg这个好东西. ffmpeg可用来处理视频文件的提取和各种转换,跨平台,官网上有Linux,WINDOWS和MAC版本

使用ffmpeg进行视频文件转换成FLV整理 &lt;第六篇&gt;

1.首先下载ffmpeg 2.将解压得到的ffmpeg.exe和pthreadGC2.dll文件解压到任何目录(当然也可以是WebRoot中的目录) 3.创建bat文件convertVideo.bat并添加以下内容:(参数说明见附录一) [TXT] view plaincopy %1/ffmpeg -i %2 -y -ab 56 -ar 22050 -b 500 -r 15 -s 320*240 %3 exit ****************** %1为ffmpeg存放目录 %2为需要转换的文

C#实现通过ffmpeg从flv视频文件中截图的方法

本文实例讲述了C#实现通过ffmpeg从flv视频文件中截图的方法.分享给大家供大家参考.具体分析如下: 需要先下载ffmpeg,这是开源的,代码如下所示: 代码如下: using System; using System.Configuration; public class PublicMethod:System.Web.UI.Page { public PublicMethod() { } //文件路径 public static string ffmpegtool = "ffmpeg/f

Java使用FFmpeg处理视频文件指南

Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取.码率压缩.分辨率转换等功能: 之前在网上浏览了一大圈Java使用FFmpeg处理音视频的文章,大多都讲的比较简单,楼主在实操过程中踩了很多坑也填了很多坑,希望这份详细的踩坑&填坑指南能帮助到大家: 1. 什么是FFmpeg 点我了解 2. 开发前准备 在使用Java调用FFmpeg处理音视频之前,需要先安装FFmpeg,安装方法分为两种: 引入封装了FFmpeg的开源框架 在系统中手