Вроде как обходится через разницу между тегами: v -все все видео, V - видео уже без вложений. Очередность имеет значение, а потому копируется всё и только видео, как указанное исключение, кодируется:
& (Join-Path $FFPath ffmpeg.exe) -report -hide_banner -extra_hw_frames 5 -hwaccel_output_format cuda -i $_.Fullname -c:v copy -c:V:$idx hevc_nvenc -rc:V vbr -cq:V $cq -preset p7 -tune hq -b:V ${target_bitrate}k -maxrate:V ${max_bitrate}k -bf:V 2 -rc-lookahead 32 -b_ref_mode:V middle $discardUnknData $vf $deinterlace $degrain -c:a $aCodec -c:s copy -c:d copy -c:t copy -map 0 $output_file -y
Где взять индекс $idx? Посмотреть что не является картинкой и выбрать, если там более 1 потока. Очень древние видосы этим грешат. Иначе - выбирать наивысшее разрешение или забить и обработать руками.
$allStreams=& (Join-Path $FFPath ffprobe.exe) -hide_banner -loglevel error -select_streams V -show_streams -print_format json $_.Fullname | ConvertFrom-Json
Вот только вылез косяк:
{
"index": 6,
"codec_name": "mjpeg",
"codec_long_name": "Motion JPEG",
"profile": "Baseline",
"codec_type": "video",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"width": 504,
"height": 701,
"coded_width": 504,
"coded_height": 701,
"closed_captions": 0,
"film_grain": 0,
"has_b_frames": 0,
"sample_aspect_ratio": "1:1",
"display_aspect_ratio": "504:701",
"pix_fmt": "yuvj420p",
"level": -99,
"color_range": "pc",
"color_space": "bt470bg",
"chroma_location": "center",
"refs": 1,
"r_frame_rate": "1000/1",
"avg_frame_rate": "0/0",
"time_base": "1/1000",
"start_pts": 0,
"start_time": "0.000000",
"bits_per_raw_sample": "8",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0,
"captions": 0,
"descriptions": 0,
"metadata": 0,
"dependent": 0,
"still_image": 0
},
"tags": {
"FILENAME": "poster.jpg",
"MIMETYPE": "image/jpeg",
"DURATION": "00:00:00.000000000"
}
"attached_pic": 0 - просто портится метадата выходного файла при копировании потока. Причем mkvToolNix его прекрасно читает и проблем нет. И сам ffmpeg опирается на этот флаг. И сам же его портит. Т.е. повторно загнать файл в ту же обработку не выйдет. И винда в проводнике превью тоже теряет. Бред какой-то.
Как обходной маневр рекомендуют следующее:
ffmpeg -i video.mkv -map 0:v -map -0:V -c copy cover.png
ffmpeg -i video.mkv -map 0:V -map 0:a -c copy -attach cover.png -metadata:s:t mimetype=image/png newvideo.mkv
Пока забил болт.