web-dev-qa-db-ja.com

FFmpeg:サポートされていない字幕ストリーム(MKV)を削除

メディアファイルのリストをループし、FFmpegを使用してそれらを再エンコードするスクリプトを作成しています。私の問題は、MKVコンテナがサポートしていない字幕を削除する必要があることです。これはネガティブマッピングを使用して簡単にする必要がありますが、ストリーム番号はファイルごとに異なります。これが私の現在のコマンドです:

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"
1
Wolveix

FFmpegがネイティブにこれをサポートしているとは思いません。私は、単一または複数の発生を可能にするスクリプトをなんとか書き出すことができました。

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

このスクリプトをさらに改善するための提案があれば、ぜひ聞いてみてください。

Ffprobeコマンドの変更案を提案してくれた@LordNeckbeardに感謝します。

2
Wolveix