I am trying to re-encode the audio on some video files. I want to copy the video and subtitles without touching them, however, ffmpeg doesn't detect the format of the subtitle (which is webvtt) and refuses to do anything.
fmpeg -copy_unknown -analyzeduration 2000M -probesize 2000M -i input.mkv -map_metadata 0 -map 0 -c copy -c:a:0 aac -b:a 384k output.mkv
[matroska,webm @ 0x5597558e4040] Unknown/unsupported AVCodecID S_TEXT/WEBVTT.
[matroska,webm @ 0x5597558e4040] Could not find codec parameters for stream 2 (Subtitle: none): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Guessed Channel Layout for Input Stream #0.1 : 5.1
Input #0, matroska,webm, from 'input.mkv':
Metadata:
encoder : libebml v1.3.9 + libmatroska v1.5.2
creation_time : 2020-03-05T09:03:02.000000Z
Duration: 00:56:33.26, start: 0.000000, bitrate: 3597 kb/s
Stream #0:0: Video: h264 (High), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Metadata:
BPS-eng : 3340067
DURATION-eng : 00:56:33.140000000
NUMBER_OF_FRAMES-eng: 81354
NUMBER_OF_BYTES-eng: 1416664616
_STATISTICS_WRITING_APP-eng: mkvmerge v38.0.0 ('The Silent Type') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2020-03-05 09:03:02
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:1: Audio: eac3, 48000 Hz, 5.1, fltp (default)
Metadata:
BPS-eng : 256000
DURATION-eng : 00:56:33.248000000
NUMBER_OF_FRAMES-eng: 106039
NUMBER_OF_BYTES-eng: 108583936
_STATISTICS_WRITING_APP-eng: mkvmerge v38.0.0 ('The Silent Type') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2020-03-05 09:03:02
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:2(eng): Subtitle: none (default)
Metadata:
BPS-eng : 38
DURATION-eng : 00:54:47.388000000
NUMBER_OF_FRAMES-eng: 514
NUMBER_OF_BYTES-eng: 15766
_STATISTICS_WRITING_APP-eng: mkvmerge v38.0.0 ('The Silent Type') 64-bit
_STATISTICS_WRITING_DATE_UTC-eng: 2020-03-05 09:03:02
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (eac3 (native) -> aac (native))
Stream #0:2 -> #0:2 (copy)
[aac @ 0x5597b06ae000] Using a PCE to encode channel layout "5.1(side)"
[matroska @ 0x5597b06ab540] Subtitle codec 0 is not supported.
Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented
Error initializing output stream 0:1 --
[aac @ 0x5597b06ae000] Qavg: -nan
Conversion failed!
VLC shows it as WebVTT and displays the subtitles correctly:
MediaInfo also detects properly as webvtt:
Text
ID : 3
Format : S_TEXT/WEBVTT
Codec ID : S_TEXT/WEBVTT
Duration : 54 min 47 s
Bit rate : 38 b/s
Count of elements : 514
Stream size : 15.4 KiB (0%)
Language : English
Default : Yes
Forced : No
My ffmpeg was built with webvtt:
$ ffmpeg -codecs | grep VTT
ffmpeg version n4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9.3.0 (Arch Linux 9.3.0-1)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
DES... webvtt WebVTT subtitle
How can I tell ffmpeg "this is webvtt, just copy it please!"?
EDIT: RESOLVED (thanks @Gyan)
To force the decoder, -c:s webvtt
must be set before the input:
fmpeg -analyzeduration 50M -probesize 50M -c:s webvtt -i input.mkv ...
To force the decoder, -c:s webvtt
must be set before the input: ffmpeg -analyzeduration 50M -probesize 50M -c:s webvtt -i input.mkv ...