Subskrybowanie na stałe z ffmpeg?

6

Czy możliwe jest kodowanie subwooferów za pomocą ffmpeg? Przez hardcode rozumiem nakładanie napisów jako zdjęć na wideo i byłoby niemożliwe do usunięcia, ponieważ byłyby częścią filmu. Próbowałem przekonwertować napisy na .ass, a następnie próbowałem go zakodować, ale ffmpeg nic nie robi i zwraca ten sam plik. Użyłem VLC, aby je zakodować, ale po prostu osadza je w samym pliku wideo i nie uwzględnia ich jako obraz bezpośrednio nałożony na wideo. Mój wynik końcowy powinien wyglądać mniej więcej tak:

wprowadź opis zdjęcia tutaj

Utworzono fonts.conf, a następnie ponowiono:

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!

Wymieniłem "subtitle=sub.srt"z subtitle="sub.srt"a subtitle=sub.srti dostał ten sam rezultat.

Konwertowałem podtytuł na .ass: ffmpeg -i sub.srt sub.ass

Potem użyłem -vf ass=sub.assi zakodowałem wideo, ale bez napisów.

Wkleiłem dokładnie ten sam kod podany w fonts.conf.

Jak mogę wybrać czcionki? Czy powinienem używać tekstu rysunkowego?

1234asdf12399
źródło
2
Pokaż polecenia, które wypróbowałeś, oraz pełne dane wyjściowe wiersza poleceń.
slhck
„ale po prostu osadza je w samym pliku wideo i nie dołącza ich jako obrazu bezpośrednio nałożonego na wideo”. Co masz na myśli?
Rajib
@slhck użyłem następujących poleceń:ffmpeg -i subtitle.srt subtitle.ass ffmpeg -i input.mp4 -vf ass=subtitle.ass output.mp4
1234asdf12399 25.01.15
@rajib Mam na myśli, że napisy są po prostu osadzone w pliku wideo i można je włączyć lub wyłączyć. Szukam sposobu, aby na stałe dołączyć je do filmu.
1234asdf12399
Tak jak powiedziałem, proszę również pokazać wyjście tych poleceń z wiersza poleceń (drugie byłoby bardziej interesujące). Możesz edytować swoje pytanie, aby dodać pełny dziennik (zaczynając od „wersji ffmpeg…” aż do ostatniego wiersza, który pojawi się po zakończeniu kodowania).
slhck

Odpowiedzi:

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

Filtr jest wywoływany za pomocą . Ponadto twoja wersja ffmpeg nie jest kompilowana , więc nie będzie można na stałe zapisywać sub.subtitless--enable-libass

Gdy masz już wersję z włączoną biblioteką libass (np. Kompilując się ), spróbuj tego:

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

Ale zauważ, że zamieniłem wyjście WMV / WMA na H.264 i AAC. ffmpeg nie ma kodera dla najnowszych wersji WMV, więc twoje wyjście wyglądałoby całkiem źle. A ponieważ kodujesz napisy na stałe, i tak musisz ponownie zakodować wideo.

slhck
źródło
Jaka byłaby różnica w kodzie, gdybym użył .ass subwooferów? Czy zmiana czcionki i jej rozmiaru jest możliwa?
1234asdf12399
Tak przypuszczam. Niewiele ekspertów od napisów, ale użycie odpowiedniego edytora napisów prawdopodobnie pozwoliłoby ci zmienić napisy ASS według własnych upodobań.
slhck
1
TAK! To zadziałało! Aby zmienić rozmiar, kolor itp. Napisów, po prostu otwórz plik .ass w edytorze tekstu i zmień wartości ręcznie. ffmpeg automatycznie używa domyślnej czcionki dla pliku .ass.
1234asdf12399
To było dla mnie bardzo przydatne. Musiałem dodać komunikat nakładki na wideo z zrzutem ekranu. Korzystanie z edytora wideo i łączenie dwóch strumieni wideo wydawało się trudnym zadaniem. Potem pomyślałem o użyciu napisów, a ty pokazałeś prosty sposób na zrobienie tego. Miałem już plik .mp4 i chciałem mieć plik wyjściowy .mp4, więc to też się sprawdziło
Nędzna zmienna
5

Pomyślnie przetestowałem to polecenie:

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

Uwaga: Jeśli dane wyjściowe mówią coś o tym No usable fontconfig configuration file found, using fallback, musisz utworzyć wewnątrz folderu bin ffmpeg nowy folder o nazwie fontsz plikiem inside ( fonts.conf), który określa, gdzie ffmpeg ma szukać czcionek.

Użyłem tego pliku, aby działał (testowany w systemie 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>
NuTTyX
źródło
Jak wybrać konkretną czcionkę? Czy możliwa jest zmiana koloru i rozmiaru? Czy powinienem użyć tego:drawtext=fontfile=arial.ttf
1234asdf12399
@slhck zwrócił uwagę, że polecenie powinno być następujące:ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output.mp4
1234asdf12399
Zwróć uwagę, że nazwa filtra to „napisy”, a nie „napisy”
slhck
Nie dostałem błędu czcionki, polecenie działało ładnie, pamiętaj tylko, że musisz być w folderze, w którym znajduje się plik srt, "subtitles=C:\Users\user\Videos\sub.srt"nie będzie działać.
Shayan