Можно ли жестко закодировать субтитры с помощью ffmpeg? Под жестким кодом я подразумеваю наложение субтитров как картинок поверх видео, и их нельзя будет удалить, потому что они станут частью видео. Я попытался преобразовать субтитры в .ass, а затем попытался закодировать их, но ffmpeg ничего не делает и возвращает тот же файл. Я использовал VLC для их кодирования, но он просто встраивает их в сам видеофайл и не включает их как нарисованные, наложенные непосредственно на видео. Мой конечный результат должен быть примерно таким:
Создал fonts.conf, затем повторил попытку:
Z:\New folder>ffmpeg -i input.wmv -vf "subtitle=sub.srt" output.wmv ffmpeg version N-69247-g85d7e02 Copyright (c) 2000-2015 the FFmpeg developers built on Jan 25 2015 02:18:48 with gcc 4.9.2 (GCC) configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r libavutil 54. 17.100 / 54. 17.100 libavcodec 56. 20.100 / 56. 20.100 libavformat 56. 19.100 / 56. 19.100 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 8.101 / 5. 8.101 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 3.100 / 53. 3.100 Guessed Channel Layout for Input Stream #0.1 : stereo Input #0, asf, from 'input.wmv': Metadata: major_brand : isom minor_version : 1 compatible_brands: isomavc1 encoder : Lavf56.15.101 PRIVATE/TotalBitrate: 628000 WM/VideoHeight : 240 WM/VideoWidth : 320 WM/VideoFrameRate: 0 title : input Duration: 01:47:53.77, start: 0.000000, bitrate: 656 kb/s Stream #0:0: Video: wmv2 (WMV2 / 0x32564D57), yuv420p, 320x240, SAR 120:67 DAR 160:67, 25 fps, 25 tbr, 1k tbn, 1k tbc Stream #0:1: Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, 2 channels, fltp, 128 kb/s [AVFilterGraph @ 0000000002c5b4a0] No such filter: 'subtitle' Error opening filters!
Я заменил "subtitle=sub.srt"
на subtitle="sub.srt"
и subtitle=sub.srt
и получил тот же результат.
Я преобразовал субтитры в .ass:ffmpeg -i sub.srt sub.ass
Затем я использовал -vf ass=sub.ass
и видео закодированное, но без субтитров.
Я вставил точно такой же код, как в fonts.conf.
А как мне выбрать шрифты? Стоит ли использовать drawtext?
решение1
Для того, чтобы жестко закодировать субтитры, ваша версия ffmpeg должна быть скомпилирована с libass
поддержкой. Загрузите статическую сборку сhttps://ffmpeg.org/download.html, а затем используйте:
ffmpeg -i input.wmv -vf "subtitles=sub.srt" \
-c:v libx264 -crf 20 \
-c:a aac -b:a 192k
output.mp4
В качестве альтернативы вы можете использовать -vf "ass=sub.ass"
субтитры ASS, если у вас есть.
С помощью этой команды вы устанавливаете источник фильтра субтитров на файл, содержащий субтитры. Если вы хотите записать субтитры самого входного видеофайла, замените sub.srt
на имя входного видеофайла.
Вы можете изменить значение CRF, чтобы изменить качество/размер видео.Более подробная информация о CRF здесь.
Более подробную информацию о записи субтитров можно найтина FFmpeg Wiki.
Обратите внимание, что я заменил выход WMV/WMA из исходного вопроса на H.264 и AAC. У ffmpeg нет кодировщика для последних версий WMV, поэтому ваш выход выглядел бы довольно плохо. И поскольку вы жестко кодируете субтитры, вам в любом случае придется перекодировать видео.
В вопросе автора была опечатка:
[AVFilterGraph @ 0000000002c5b4a0] No such filter: 'subtitle'
Error opening filters!
Фильтр вызывается с помощью . Кроме того, версия ffmpeg не была скомпилирована с помощью , поэтому ее нельзя было использовать для жесткого кодирования субтитров.subtitles
s
--enable-libass
решение2
Я успешно протестировал эту команду:
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output.mp4
Примечание:Если в выводе указано что-то вроде No usable fontconfig configuration file found, using fallback
, необходимо создать внутри папки bin ffmpeg новую папку с именем fonts
и файлом внутри ( fonts.conf
), который указывает, где ffmpeg должен искать шрифты.
Для того, чтобы это заработало, я использовал этот файл (проверено на Windows):
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/fonts.conf file to configure system font access -->
<fontconfig>
<!-- Font directory list -->
<dir>./</dir>
<dir>../fonts</dir>
<dir>./fonts</dir>
<dir>~/.fonts</dir>
<dir>WINDOWSFONTDIR</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>
<!--
Load local system customization file
-->
<include ignore_missing="yes">conf.d</include>
<!-- Font cache directory list -->
<cachedir>WINDOWSTEMPDIR_FONTCONFIG_CACHE</cachedir>
<cachedir>~/.fontconfig</cachedir>
<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>0x2800</int> <!-- BRAILLE PATTERN BLANK -->
<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>
решение3
Используйте следующие параметры:
ffmpeg -i input.mp4 -filter:v subtitles=subtitle.srt -c:a copy -c:v libx264 -crf 22 -preset veryfast output.mp4
Таким образом, он работает с обычным FFmpeg на Linux, без каких-либо специальных библиотек, скомпилированных в него.
Дополнительная информация и параметры для изменения: