¿Es posible codificar subtítulos con ffmpeg? Por código rígido, me refiero a superponer los subtítulos como imágenes encima del video, y no se podrían eliminar porque serían parte del video. Intenté convertir el subtítulo a .ass y luego intenté codificarlo, pero ffmpeg no hace nada y devuelve el mismo archivo. Utilicé VLC para codificarlos, pero simplemente los incrusta en el archivo de video y no los incluye como se muestra directamente superpuestos en el video. Mi resultado final debería ser algo como esto:
Creó fonts.conf y luego volvió a intentar:
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!
Reemplacé "subtitle=sub.srt"
con subtitle="sub.srt"
y subtitle=sub.srt
obtuve el mismo resultado.
Convertí el subtítulo a .ass:ffmpeg -i sub.srt sub.ass
Luego usé -vf ass=sub.ass
y codifiqué el video, pero sin subtítulos.
Pegué exactamente el mismo código proporcionado en fonts.conf.
Además, ¿cómo puedo elegir las fuentes? ¿Debería usar texto dibujado?
Respuesta1
Para codificar subtítulos, su versión ffmpeg debe compilarse con libass
soporte. Descargar una compilación estática desdehttps://ffmpeg.org/download.htmly luego use:
ffmpeg -i input.wmv -vf "subtitles=sub.srt" \
-c:v libx264 -crf 20 \
-c:a aac -b:a 192k
output.mp4
Alternativamente, puedes usarlo -vf "ass=sub.ass"
si tienes subtítulos ASS.
Con este comando, configura la fuente del filtro de subtítulos en el archivo que contiene los subtítulos. Si desea grabar los subtítulos del archivo de video de entrada, reemplácelos sub.srt
con el nombre del archivo de video de entrada.
Puede cambiar el valor CRF para cambiar la calidad/tamaño del video.Más información sobre CRF aquí.
Puede encontrar más información sobre la grabación de subtítulos.en el Wiki de FFmpeg.
Tenga en cuenta que reemplacé la salida WMV/WMA de la pregunta original con H.264 y AAC. ffmpeg no tiene un codificador para versiones recientes de WMV, por lo que su resultado se habría visto bastante mal. Y como estás codificando los subtítulos, debes volver a codificar el video de todos modos.
En la pregunta del OP, hubo un error tipográfico:
[AVFilterGraph @ 0000000002c5b4a0] No such filter: 'subtitle'
Error opening filters!
El filtro se llama con un . Además, la versión ffmpeg no se compiló con , por lo que no se pudo usar para codificar subtítulos.subtitles
s
--enable-libass
Respuesta2
He probado con éxito este comando:
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output.mp4
Nota:Si el resultado dice algo sobre No usable fontconfig configuration file found, using fallback
, debe crear dentro de la carpeta bin de ffmpeg una nueva carpeta denominada fonts
con un archivo dentro ( fonts.conf
) que especifique dónde debe buscar fuentes ffmpeg.
He utilizado este archivo para que funcione (probado en 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>
Respuesta3
Utilice los siguientes parámetros:
ffmpeg -i input.mp4 -filter:v subtitles=subtitle.srt -c:a copy -c:v libx264 -crf 22 -preset veryfast output.mp4
De esta manera funciona con FFmpeg normal en Linux, sin bibliotecas especiales compiladas en él.
Más información y parámetros a cambiar: