vp9で動画変換時、シーンチェンジ時にキーフレーム(Iフレーム)を設定しようとしてみました。
以下のシェルでやってみたら、動画のレートが目標レートに達せず
1000フレーム毎も同様で、300フレーム毎ならうまくいきました。
バージョン情報
FFMPEG
ffmpeg version 2.8.7 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.9.3 (Gentoo 4.9.3 p1.5, pie-0.6.4)
libvpx
Included encoders:
vp8 - WebM Project VP8 Encoder v1.6.0
vp9 - WebM Project VP9 Encoder v1.6.0 (default)
変換用シェル(シーンチェンジ時にキーフレーム設定)
# init
FTMP=`date "+%Y%m%d%H%M%S"`
# tmp create
ffmpeg -i "$1" -ss $2 -vframes $3 \
-c:v copy -c:a copy \
"${FTMP}.$1"
ffprobe -show_frames -pretty \
-f lavfi "movie='${FTMP}.$1',select=gt(scene\,0.4)" \
| grep -w pkt_pts_time | cut -d= -f2 > ${FTMP}.key
KEY=`awk '{s=s "," $0}END{print "0:00:00.000000" s}' ${FTMP}.key`
# OPT="${OPT} -loglevel debug "
OPT="${OPT} -vcodec libvpx-vp9 "
OPT="${OPT} -passlogfile ${FTMP}"
OPT="${OPT} -b:v 250K"
# libvpx
OPT="${OPT} -bufsize 100k "
# vp9
OPT="${OPT} -auto-alt-ref 1 "
OPT="${OPT} -lag-in-frames 25 "
# OPT="${OPT} -quality best "
OPT="${OPT} -quality good "
OPT="${OPT} -minrate 10K "
OPT="${OPT} -maxrate 1M "
# 指定フレーム間隔でキーフレーム設定
# OPT="${OPT} -g 1000 " # NG
# OPT="${OPT} -g 300 " # OK
# 任意の場所にキーフレーム設定
OPT="${OPT} -force_key_frames ${KEY} "
OPT="${OPT} -qmin 0 "
OPT="${OPT} -qmax 60 "
OPT="${OPT} -arnr-maxframes 15 -arnr-strength 6 -arnr-type 3"
# OPT="${OPT} -arnr-maxframes 7 -arnr-strength 5 -arnr-type 3"
OPT="${OPT} -max-intra-rate 0 "
# OPT="${OPT} -s 704x396 -aspect 16:9 "
OPT="${OPT} -threads 0 -tile-columns 0 -frame-parallel 0 "
OPT="${OPT} -aq-mode cyclic "
OPT="${OPT} -rc_lookahead 25 "
AUDIO=" -acodec libfdk_aac -profile:a aac_he_v2 "
AUDIO="${AUDIO} -ab 16k -ar 24000 -ac 2 -afterburner 1 "
ffmpeg -y -i "${FTMP}.$1" -pass 1 \
-speed 4 \
${OPT} \
-an \
-f matroska /dev/null && \
ffmpeg -y -i "${FTMP}.$1" -pass 2 \
-speed 0 \
${OPT} \
${AUDIO} \
"$1".vp9.mkv