使用FFmpeg將字幕文件集成到視頻文件

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

向視頻文件裏添加字幕是件很常見的事,本文使用FFmpeg將字幕文件集成到視頻文件裏。 web

在CentOS上編譯安裝FFmpeg centos

字幕文件轉換

字幕文件有不少種,常見的有 .srt , .ass 文件等,下面使用FFmpeg進行相互轉換。 bash

將.srt文件轉換成.ass文件 app

1
ffmpeg -i subtitle.srt subtitle.ass

將.ass文件轉換成.srt文件 ide

1
ffmpeg -i subtitle.ass subtitle.srt

集成字幕,選擇播放

這種字幕集成比較簡單,播放時須要在播放器中選擇相應的字幕文件。 post

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文件 this

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

將video.mkv中的字幕(第二個)嵌入到out.avi文件 spa

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>  

參考

相關文章
相關標籤/搜索