Então isso está me deixando louco.
Eu tenho um arquivo de vídeo, input.mkv
, com vários fluxos de legendas. Eu quero codificar um desses fluxos de legendas em um novo arquivo. Eu costumo fazer assim:
inputfile="input.mkv"
outputfile="out.mp4"
ffmpeg -i "$inputfile" -vf "subtitles=$(printf "%q" "$inputfile")" "$outputfile"
Agora, como input.mkv
tem vários sub streams, preciso especificar qual quero. Digite ffprobe
:
(Vou cortar alguns campos irrelevantes (eu acho) para facilitar a leitura)
$ ffprobe -v quiet -print_format json -show_streams -select_streams s input.mkv | jq -r '.streams | .[]'
{
"index": 2,
...cut...
},
"tags": {
"language": "zh-Hans",
"title": "中文(简体)",
"DURATION": "00:23:40.083000000"
}
}
{
"index": 3,
...cut...
},
"tags": {
"language": "zh-Hant",
"title": "中文(繁體)| 繁化姬",
"DURATION": "00:23:40.083000000"
}
}
{
"index": 4,
...cut...
},
"tags": {
"language": "en",
"title": "English",
"DURATION": "00:23:40.083000000"
}
}
{
"index": 5,
...cut...
},
"tags": {
"language": "th",
"title": "ภาษาไทย",
"DURATION": "00:23:40.079000000"
}
}
{
"index": 6,
...cut...
},
"tags": {
"language": "vi",
"title": "Tiếng Việt",
"DURATION": "00:23:40.039000000"
}
}
{
"index": 7,
...cut...
},
"tags": {
"language": "id",
"title": "Bahasa Indonesia",
"DURATION": "00:23:40.079000000"
}
}
{
"index": 8,
...cut...
},
"tags": {
"language": "ms",
"title": "Bahasa Melayu",
"DURATION": "00:23:40.080000000"
}
}
Agora eu quero o sub stream em inglês, então acho que preciso do sub stream 4:
$ ffmpeg -i "$inputfile" -to 00:00:10 -vf "subtitles=$(printf "%q" "$inputfile"):si=4" out.mp4
No entanto, isso me dá uma sublinguagem que não consigo ler (ou identificar). Depois de tentar diferentes índices, o índice 2 me deu o stream em inglês:
$ ffmpeg -i "$inputfile" -to 00:00:10 -vf "subtitles=$(printf "%q" "$inputfile"):si=2" out.mp4
Eu gostaria de fazer tudo isso em um script e usar o índice do ffprobe para obter o fluxo correto:
$ ffprobe -v quiet -print_format json -show_streams -select_streams s "$inputfile" | jq -r '.streams | .[] | select(.tags.language=="en") | .index'
4
Por que será que eles não combinam? Existe uma maneira melhor de obter o índice correto? É talvez sempre 2 a menos?
Qualquer ajuda seria muito apreciada.
//informações da versão do ffmpeg:
$ ffmpeg -version
ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
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
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Seus fluxos de legendas em inglês são:
Daí a ambiguidade... o
subtitles
filtro requer a posição relativa. Poderia ser mais fácil em duas etapas:O primeiro ffmpeg manterá apenas o fluxo de legendas em inglês e o colocará em
sub.mkv
. Então o segundo não precisa se preocupar com o índice.