Ffmpegとlibx265を使用して、一部のビデオをHEVCエンコーディングに変換することをテストしていますが、再エンコードを正常に行うには、入力幅を8で割り切れる必要があることがわかりました。エンコードを試みてから出力を調べることなく、再エンコードが成功するかどうかを判断したいと思います。理想的には、bashスクリプトでこれを実行したいと思います。この点で私のスキルはやや制限されており、これまでに思いついたものの多くはエレガントではありません。
たとえば、次のようにbcを使用して計算できることを知っています。
echo 'scale=2;576/8' | bc
72.00
私は幅を取得することができます
width=$(mediainfo $filename | grep "Width" | sed 's/[^0-9]*//g')
しかし、前者は8で割り切れる幅であるという質問に正確に答えていません。後者はく、研究が効率的ではないことを示すあまりにも多くのパイプを使用します。
再エンコード用のffmpegコマンドラインが、満足のいくようにソートされています。
ffmpeg -i "$f" -c:a copy -c:v libx265 -preset "$preset" -crf 25 "$target"
そして、ビデオがまだ8で割り切れる幅にスケーリングするつもりであるが、スケーリングが必要かどうか、および割り切れる最も近い幅を決定する方法を決定するために、これまでに思いついたよりも良い解決策を探しています8でスケーリングします。
以下は、widthを8で割り切れる数に修正してから、rescaleheight正しいアスペクト比を維持しながら8で割り切れる数に:
ffmpeg -i <input> \
-c:a copy \
-c:v libx265 -preset medium -x265-params crf=28 \
-vf scale="trunc(iw/8)*8:-8" \
<output>
おまけとして、幅が既に8で割り切れる場合、出力幅に変化はなく、FFmpegからのエラーもありません。
スケール構文の説明。構文が-vf scale=width:height
:
1。出力幅の計算:
iw/8
:入力ビデオストリームの幅は8で除算されます。したがって、元の幅が690の場合、数値は86.25になります。trunc
:数値86.25は86に「切り捨てられます」*8
:86に8を掛けて、688の最終幅が得られます。これはもちろん8で割り切れます。2。出力高さの計算:
-8
:FFmpegは、8で割り切れる高さを計算しますが、元のファイルの正しいアスペクト比も維持します完全な世界では、hevcエンコーディングは8x8、16x16、32x32などのエンコーディングユニットで実行され、この構文はこれを保証します。この詳細 here ...
参照:
幅の取得は、mediainfo
を使用すると比較的簡単です。お持ちでない場合は、_Sudo apt-get install mediainfo
_でインストールできます
width=$(mediainfo '--Inform=Video;%Width%' $filename)
8による可分性の判定は、
_if [ $(( $width % 8 )) -eq 0 ] ; then
echo "Your number is divisible by 8 – you may convert it”
else
echo "Video width is not divisible by 8 – it needs scaling to re-encode it."
fi
_
@ andrew.46ともう少しの研究とテストに触発されたはるかに単純で高速なアプローチは、ffmpegにを使用させることです
_ffmpeg -i $inputfilename -c:a copy -c:v libx265 -preset veryfast -x265-params crf=25 -vf scale=-8:ih $outputfilename
_
_-vf scale=-8:ih
_設定は、幅が8(-8)で割り切れることを保証し、それに応じて入力高さ(ih)を使用してアスペクト比を維持します。
ソース:_man mediainfo
_
https://stackoverflow.com/questions/7376477/geting-video-information-from-mediainfo