FFmpeg: Eliminar secuencias de subtítulos no compatibles (MKV)


1

Estoy haciendo un script que recorre una lista de archivos multimedia y luego los vuelve a codificar usando FFmpeg. Mi problema es que necesito eliminar los subtítulos que el contenedor MKV no admite. Esto debería ser simple usando mapeo negativo, sin embargo, el número de secuencia será diferente para cada archivo. Aquí está mi comando actual:

ffmpeg -y -i "path/to/file.ext" -map 0 -c:v libx264 -crf 20 -level 4.1 -profile:v high -c:a copy -q:a 100 -preset faster -strict -2 -movflags faststart -threads 2 -nostdin -stats "file.mkv"

Respuestas:


2

No creo que FFmpeg admita esto de forma nativa. Me las arreglé para escribir una secuencia de comandos que permite ocurrencias únicas o múltiples:

stream_count=$(/usr/bin/ffprobe -select_streams s -show_entries stream=index,codec_name -of csv=p=0 "path/to/file.ext" |& grep -cE 'Subtitle: dvd_subtitle|Subtitle: hdmv_pgs' || :)
if [ "$stream_count" -gt 0 ]
then
    stream_id=$(/usr/bin/ffprobe -select_streams s -show_entries stream=index,codec_name -of csv=p=0 "path/to/file.ext" |& grep -E 'Subtitle: dvd_subtitle|Subtitle: hdmv_pgs' || :)
    if [ "$stream_count" = 1 ]
    then
      exclude_stream=$(echo "$stream_id" | grep -oP '0:[0-9]{1,3}')
      exclude_stream="-map -$exclude_stream"
    else
      counter=0
      until [ "$counter" = "$stream_count" ]
      do
        counter=$((counter+1))
        excluded_stream="$(echo "$stream_id" |& grep -oP '0:[0-9]{1,3}' |& sed -n "${counter}"p)"
        if [ ! -z "$excluded_stream" ]
        then
          if [ "$exclude_stream" = "*$excluded_stream*" ] #If ffprobe returns encode errors within the streams, double results may be returned for the problematic stream which this circumvents
          then
            counter="$stream_count"
          else
            exclude_stream="$exclude_stream -map -$excluded_stream"
          fi
        fi
        excluded_stream=""
      done
    fi
fi
ffmpeg -y -i "path/to/file.ext" -map 0 $exclude -c:v libx264 -crf 20 -level 4.1 -profile:v high -c:a copy -q:a 100 -preset faster -strict -2 -movflags faststart -threads 2 -nostdin -stats "file.mkv" #exclude isn't wrapped as it invalidates the opening hyphen

Si alguien tiene alguna sugerencia para mejorar aún más este script, me encantaría escucharlo.

Gracias @LordNeckbeard por las modificaciones sugeridas al comando ffprobe.


2
Me resulta más fácil y más consistente analizar la salida legible por máquina que la salida legible por humanos:ffprobe -loglevel error -select_streams s -show_entries stream=index,codec_name -of csv=p=0 input.ext
llogan

@ LordNeckbeard Gracias por la sugerencia. Tuve que quitar el indicador de nivel de registro debido a la posibilidad de errores de codificación en las secuencias encontradas
Wolveix

1
Puede omitir -profile:vy -leveldejar que el codificador elija, a menos que necesite lidiar con un dispositivo de reproducción limitado. -threadses otro con el que puede lidiar automáticamente el codificador. -strict -2no es necesario a menos que su ffmpeg sea antiguo y use el codificador AAC incorporado previamente experimental. FFmpeg WIki: AAC dice que "el rango efectivo -q:aes de alrededor de 0.1-2. Este VBR es experimental y es probable que obtenga resultados aún peores que el CBR ( -b:a)". Nunca examiné eso, así que no puedo comentar sobre esa declaración.
llogan el

-level, -profile:vy -threadsestán allí intencionalmente debido al uso previsto del script. Omitir -strict -2ha causado problemas en el pasado, pero es cierto que no lo he probado recientemente. Interesante -q:a, lo agregué por recomendación. ¡Gracias por la información!
Wolveix

He eliminado -strict -2 y no se han producido problemas. Gracias por la visión de usted.
Wolveix
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.