ffmpeg - Only keep English

ffmpeg -i "input.mkv" -c copy -map 0:v -map 0:a:m:language:eng? -map 0:s:m:language:eng? -map 0:d? -map 0:t? "output.mkv"
ffmpeg -i "input.mkv" -map 0:v -map 0:a:m:language:eng? -c copy -c:s copy -map 0:s:m:language:eng? -map 0:d? -map 0:t? "output.mkv"
 
or
 
ffmpeg -i "input.mkv" -map 0:0 -map 0:a:m:language:eng? -c copy -c:s copy -map 0:s:m:language:eng? -map 0:d? -map 0:t? "output.mkv"
ffmpeg -i "input.mkv" -c copy -map 0:v -map 0:a:m:language:eng? -c:s copy -map 0:s:m:language:eng? -map 0:d? -map 0:t? "output.mkv"

NOTE:

  • -c:s copy: Using stream copy to remux (no encoding).
  • -map 0:v: Keep the existing Video.
    • -map 0:0: Keep the existing map 0:0. (Assume this is the Video).
  • -map 0:a:m:language:eng?: Keep only English Audio. (Optional only if Audio exists).
  • -map 0:s:m:language:eng?: Keep only English Subtitles. (Optional only if Subtitles exist).
  • -map 0:d?: Keep Data. (Optional only if Data exists).
  • -map 0:t?: Keep Attachments. (Optional only if Attachments exists).

# QUICK.
ffmpeg -i "input.mkv" -c copy -map 0:v -map 0:a:m:language:eng? -c:s copy -map 0:s:m:language:eng? -map 0:d? -map 0:t? "out1.mkv"
 
# SLOW, BUT SLIGHTLY SMALLER.
ffmpeg -i "input.mkv" -c:v copy -map 0:v -map 0:a:m:language:eng? -c:s copy -map 0:s:m:language:eng? -map 0:d? -map 0:t? "output.mkv"
 
# VERY SLOW, BUT SMALLER.
ffmpeg -i "input.mkv" -map 0:v -c:a copy -map 0:a:m:language:eng? -c:s copy -map 0:s:m:language:eng? -map 0:d? -map 0:t? "output.mkv"
 
# EXTREMELY SLOW, BUT SMALLEST.
ffmpeg -i "input.mkv" -map 0:v -map 0:a:m:language:eng? -c:s copy -map 0:s:m:language:eng? -map 0:d? -map 0:t? "output.mkv"
ffmpeg -i "input.mkv" -map 0:v -map 0:a:m:language:eng? -map 0:s:m:language:eng? -map 0:d? -map 0:t? "output.mkv"

References

https://trac.ffmpeg.org/wiki/Map