Questão Subs codificação com ffmpeg?


É possível codificar subs com ffmpeg? Por código rígido, quero dizer sobrepor as legendas como imagens no topo do vídeo, e seria não removível, porque elas seriam parte do vídeo. Eu tentei converter o subtítulo para .ass e tentei codificá-lo, mas o ffmpeg não faz nada e retorna o mesmo arquivo. Eu usei o VLC para codificá-los, mas ele os incorpora no próprio arquivo de vídeo e não os inclui como exibidos diretamente sobre o vídeo. Meu resultado final deve ser algo assim:

enter image description here

Criado fonts.conf, então tente novamente:

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!

Eu troquei "subtitle=sub.srt" com subtitle="sub.srt" e subtitle=sub.srt e obteve o mesmo resultado.

Eu converti o subtítulo para .ass: ffmpeg -i sub.srt sub.ass

Então eu usei -vf ass=sub.ass e o vídeo codificado, mas sem legendas.

Eu colei exatamente o mesmo código dado em fonts.conf.

Além disso, como posso escolher fontes? Devo usar drawtext?


3


origem


Por favor, mostre os comandos que você tentou e a saída completa da linha de comando. - slhck
"mas apenas os incorpora no próprio arquivo de vídeo e não os inclui como exibidos diretamente sobre o vídeo". O que você quer dizer? - Rajib
@slhck os comandos que usei foram: ffmpeg -i subtitle.srt subtitle.ass  ffmpeg -i input.mp4 -vf ass=subtitle.ass output.mp4 - 1234asdf12399
@rajib Quero dizer que as legendas são apenas incorporadas dentro do arquivo de vídeo e podem ser ativadas ou desativadas. Eu estou procurando uma maneira de incluí-los no vídeo permanentemente. - 1234asdf12399
Como eu disse, por favor, mostre a saída da linha de comando desses comandos também (o segundo seria mais interessante). Você pode editar sua pergunta para adicionar o log completo (começando com "ffmpeg version ..." até a última linha que você recebe quando a codificação é concluída). - slhck


Respostas:


[AVFilterGraph @ 0000000002c5b4a0] No such filter: 'subtitle'
Error opening filters!

O filtro é chamado subtitles com um s. Além disso, sua versão do ffmpeg não é compilada com --enable-libass, por isso não será possível codificar os subs.

Depois de ter uma versão com libass habilitada (por exemplo, Compilando-se), tente isto:

ffmpeg -i input.wmv -vf "subtitles=sub.srt" \
  -c:v libx264 -crf 20 \
  -c:a aac -strict experimental -b:a 192k
  output.mp4

Mas note que substituí a saída WMV / WMA por H.264 e AAC. O ffmpeg não possui um codificador para versões recentes do WMV, então sua saída teria parecido muito ruim. E como você codifica as legendas, você precisa recodificar o vídeo mesmo assim.


6



Qual seria a diferença no código se eu usasse .ass subs? Está mudando a fonte e seu tamanho é possível? - 1234asdf12399
Eu suponho que sim. Não muito de um especialista em legendas, mas usar um editor de legendas apropriado provavelmente permitiria que você alterasse as legendas do ASS de acordo com o seu gosto. - slhck
SIM! Isso funcionou! Para alterar o tamanho da legenda, cor, etc. basta abrir o arquivo .ass em um editor de texto e alterar os valores manualmente. O ffmpeg usa automaticamente o padrão da fonte para o arquivo .ass. - 1234asdf12399


Eu testei com sucesso este comando:

ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output.mp4

Nota: Se a saída diz algo sobre No usable fontconfig configuration file found, using fallback, você deve criar dentro da pasta bin do ffmpeg uma nova pasta chamada fonts com um arquivo dentro (fonts.conf) que especifica onde o ffmpeg deve procurar por fontes.

Eu usei este arquivo para funcionar (testado no 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>

2



Como faço para selecionar uma fonte específica? Está mudando a cor e tamanho possível? Devo usar isso:drawtext=fontfile=arial.ttf - 1234asdf12399
@slhck apontou que o comando deveria ser: ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output.mp4 - 1234asdf12399
Observe o nome do filtro sendo "legendas" e não "legendas" - slhck