Subs mit ffmpeg hart codieren?

Subs mit ffmpeg hart codieren?

Ist es möglich, Untertitel mit ffmpeg fest zu codieren? Mit Festcodierung meine ich, dass die Untertitel als Bilder über das Video gelegt werden und nicht entfernt werden können, da sie Teil des Videos wären. Ich habe versucht, die Untertitel in .ass zu konvertieren und sie dann zu codieren, aber ffmpeg macht nichts und gibt dieselbe Datei zurück. Ich habe VLC zum Codieren verwendet, aber es bettet sie nur in die Videodatei selbst ein und fügt sie nicht wie abgebildet direkt über das Video gelegt ein. Mein Endergebnis sollte ungefähr so ​​aussehen:

Bildbeschreibung hier eingeben

fonts.conf erstellt, dann erneut versucht:

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!

Ich habe es "subtitle=sub.srt"durch subtitle="sub.srt"und ersetzt subtitle=sub.srtund das gleiche Ergebnis erhalten.

Ich habe den Untertitel in .ass konvertiert:ffmpeg -i sub.srt sub.ass

Dann habe ich es verwendet -vf ass=sub.assund das Video codiert, aber ohne Untertitel.

Ich habe genau denselben Code eingefügt, der in fonts.conf angegeben ist.

Und wie wähle ich die Schriftart aus? Soll ich Drawtext verwenden?

Antwort1

Um Untertitel fest zu codieren, muss Ihre ffmpeg-Version mit libassUnterstützung kompiliert werden. Laden Sie einen statischen Build von herunterhttps://ffmpeg.org/download.htmlund verwenden Sie dann:

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

Alternativ können Sie -vf "ass=sub.ass"ASS-Untertitel verwenden, wenn Sie über diese verfügen.

Mit diesem Befehl legen Sie die Quelle des Untertitelfilters auf die Datei fest, die die Untertitel enthält. Wenn Sie die Untertitel der Eingabevideodatei selbst brennen möchten, ersetzen Sie sub.srtdurch den Namen der Eingabevideodatei.

Sie können den CRF-Wert ändern, um die Videoqualität/-größe zu ändern.Weitere Informationen zu CRF finden Sie hier.

Weitere Informationen zum Brennen von Untertiteln finden Sieim FFmpeg Wiki.

Beachten Sie, dass ich die WMV/WMA-Ausgabe aus der ursprünglichen Frage durch H.264 und AAC ersetzt habe. ffmpeg hat keinen Encoder für neuere Versionen von WMV, daher hätte Ihre Ausgabe ziemlich schlecht ausgesehen. Und da Sie die Untertitel fest codieren, müssen Sie das Video sowieso neu codieren.

In der Frage des OP gab es einen Tippfehler:

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

Der Filter wird mit einem aufgerufen . Außerdem wurde die ffmpeg-Version nicht mit kompiliert und konnte daher nicht zum Hardcodieren von Subs verwendet werden.subtitless--enable-libass

Antwort2

Ich habe diesen Befehl erfolgreich getestet:

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

Notiz:Wenn die Ausgabe etwas über aussagt No usable fontconfig configuration file found, using fallback, müssen Sie im Bin-Ordner von ffmpeg einen neuen Ordner fontsmit dem Namen erstellen, der eine Datei darin ( fonts.conf) enthält, die angibt, wo ffmpeg nach Schriftarten suchen soll.

Damit es funktioniert, habe ich diese Datei verwendet (unter Windows getestet):

<?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>

Antwort3

Verwenden Sie die folgenden Parameter:

ffmpeg -i input.mp4 -filter:v subtitles=subtitle.srt -c:a copy -c:v libx264 -crf 22 -preset veryfast output.mp4

Auf diese Weise funktioniert es mit regulärem FFmpeg unter Linux, ohne dass spezielle Bibliotheken darin kompiliert werden müssen.

Weitere Informationen und zu ändernde Parameter:

https://copyprogramming.com/howto/ffmpeg-hardcoded-subtitles-from-the-top-bigger-with-thicker-stroke-on-a-dark-background

verwandte Informationen