向视频文件里添加字幕是件很常见的事,本文使用FFmpeg将字幕文件集成到视频文件里。
字幕文件有很多种,常见的有 .srt , .ass 文件等,下面使用FFmpeg进行相互转换。
将.srt文件转换成.ass文件
- ffmpeg -i subtitle.srt subtitle.ass
-
将.ass文件转换成.srt文件
- ffmpeg -i subtitle.ass subtitle.srt
-
这种字幕集成比较简单,播放时需要在播放器中选择相应的字幕文件。
- ffmpeg -i input.mp4 -i subtitles.srt -c:s mov_text -c:v copy -c:a copy output.mp4
-
字幕文件为subtitle.srt
- ffmpeg -i video.avi -vf subtitles=subtitle.srt out.avi
-
将video.mkv中的字幕(默认)嵌入到out.avi文件
- ffmpeg -i video.mkv -vf subtitles=video.mkv out.avi
-
将video.mkv中的字幕(第二个)嵌入到out.avi文件
- ffmpeg -i video.mkv -vf subtitles=video.mkv:si=1 out.avi
-
- ffmpeg -i video.avi -vf "ass=subtitle.ass" out.avi
-
- 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
使用步骤:
在~/.bashrc 最后添加:
- export FONTCONFIG_PATH=/opt/X11/lib/X11/fontconfig
-
使之有效:
- source ~/.bashrc
-
编辑 /opt/X11/lib/X11/fontconfig/fonts.conf 在字体目录添加 /Library/Fonts
- <!-- Font directory list -->
-
- <dir>/opt/X11/share/fonts</dir>
- <dir>/usr/X11R6/lib/X11/fonts</dir>
- <dir>~/.fonts</dir>
- <dir>/Library/Fonts</dir>
-
在系统环境变量中添加:
name: FONTCONFIG_PATH
value: J:/ffmpeg (我本机ffmpeg目录,与fonts.conf同目录即可)
将fonts.conf文件放至上述指定目录。
以下为使用的fonts.conf文件:
- <?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>