私はこれを自分で見つけようとしましたが、多くのオプションのために混乱しました。
ffmpeg
理想的には、または(mencoder
または他のものを使用していますが、両方を試したことがあります)を使用して、受信ビデオを固定画面サイズに変換したいと思います。
ビデオが広すぎるか短すぎる場合は、ビデオを中央から切り取ります。サイズが正しくない場合は、サイズを上下に調整して、固定画面サイズに正確に収まるようにしてください。
私にとって最終的に必要なのは720x480 XVid AVIとMP3オーディオトラックです。
最大解像度にサイズを変更する方法を示す多くのページが見つかりましたが、ビデオはまさにその解像度でなければなりません(余分な部分を切り取り、黒いバーはありません)。
誰でもそれを実行するためのコマンドラインを教えてもらえますか?それとも、少なくともいくつか/ほとんどの方法を教えてもらえますか?複数のコマンドラインが必要な場合(解像度を得るためにXを実行し、この計算を実行してからその計算の出力としてYを実行)、スクリプトを作成できます。
答え1
ffmpeg -i input.file -vf "scale=(iw*sar)*max(720/(iw*sar)\,480/ih):ih*max(720/(iw*sar)\,480/ih), crop=720:480" -c:v mpeg4 -vtag XVID -q:v 4 -c:a libmp3lame -q:a 4 output.avi
「input.file」を入力ファイル名に変更します。
答え2
私はffmpegの専門家ではありませんが、これは役に立ちます。
まず、次のように入力ビデオのサイズを取得できます。
ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4
かなり新しいffmpegを使用すると、次のオプションを使用してビデオのサイズを変更できます。
ffmpeg -i in.mp4 -vf scale=720:480 out.mp4
幅または高さを設定してビデオのサイズを変更し、アスペクト比を維持-1
できます。ffmpeg
実際に-2
計算された値は均等でなければならないので、これはより良い選択です。したがって、次のように入力できます。
ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4
映像を受け取ったら、高さを計算しているので、720x480
予想よりも大きくなることがあるので、ffmpeg
切り取ってください。これは次のように行うことができます。
ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4
最後に、次のようなスクリプトを書くことができます(簡単に最適化できますが、読みやすくするために単純に保ちました)。
#!/bin/bash
FILE="/tmp/test.mp4"
TMP="/tmp/tmp.mp4"
OUT="/tmp/out.mp4"
OUT_WIDTH=720
OUT_HEIGHT=480
# Get the size of input video:
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${FILE})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}
# Get the difference between actual and desired size
W_DIFF=$[ ${OUT_WIDTH} - ${IN_WIDTH} ]
H_DIFF=$[ ${OUT_HEIGHT} - ${IN_HEIGHT} ]
# Let's take the shorter side, so the video will be at least as big
# as the desired size:
CROP_SIDE="n"
if [ ${W_DIFF} -lt ${H_DIFF} ] ; then
SCALE="-2:${OUT_HEIGHT}"
CROP_SIDE="w"
else
SCALE="${OUT_WIDTH}:-2"
CROP_SIDE="h"
fi
# Then perform a first resizing
ffmpeg -i ${FILE} -vf scale=${SCALE} ${TMP}
# Now get the temporary video size
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${TMP})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}
# Calculate how much we should crop
if [ "z${CROP_SIDE}" = "zh" ] ; then
DIFF=$[ ${IN_HEIGHT} - ${OUT_HEIGHT} ]
CROP="in_w:in_h-${DIFF}"
elif [ "z${CROP_SIDE}" = "zw" ] ; then
DIFF=$[ ${IN_WIDTH} - ${OUT_WIDTH} ]
CROP="in_w-${DIFF}:in_h"
fi
# Then crop...
ffmpeg -i ${TMP} -filter:v "crop=${CROP}" ${OUT}
答え3
一度にトリミングしてサイズを変更するには、次のようにトリミングしてサイズを変更するフィルタチェーンを作成できます。
ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4
上記のコードは最初にビデオを16:9の縦横比に切り、次に高さ400ピクセル×適切な(偶数)幅にサイズ変更します。
答え4
私はffmpegに初めて触れましたが、VB.NETへのSDカードアクセスを可能にする小型デバイスで利用可能なさまざまな出力形式の生のビデオを生成するための素晴らしい小さなコンバーターがありますが、使用されている複雑なビデオをデコードするのに十分な電力がありません。
サイズを変更したりトリミングしたりする方法のため、パラメータを手動でコーディングして作成する必要があります。基本的に、最終的な幅と高さを知る必要があります。
2つのオプションチェックボックスがあります。
縦横比を維持(X)すべてのピクセルを塗りつぶす(X)
入力には、(1)ソースビデオ幅、(2)オリジナルビデオ高さ、(3)デバイス幅、(4)デバイス高さの4つの変数のみが必要です。
VB.NETはあらゆる言語に簡単に適用できます。
Dim crop As String = "" ' will build this in ffmpeg format for -s or scale and crop
If cbAspectRatio.Checked = False Then
m_dest_output_w = sz._w
m_dest_output_h = sz._h
' scale to w * h - simple
crop = " -s " & m_dest_output_w & ":" & m_dest_output_h
Else
Dim ratio As Double = CDbl(m_video_width) / CDbl(m_video_height) ' this is aspect ratio of original unsized video
If cbFillPixels.Checked = False Then ' shrink to fit
If sz._w * ratio <= m_video_height Then
m_dest_output_w = sz._w
m_dest_output_h = sz._w / ratio
Else
m_dest_output_h = sz._h
m_dest_output_w = sz._h / ratio
End If
' no cropping just resizing to a non-filled area that fits
crop = " -s " & m_dest_output_w & ":" & m_dest_output_h ' no cropping needed as letterboxed
Else ' expand / fill --- cropping needed
If sz._w * ratio >= m_video_height Then
m_dest_output_w = sz._w
m_dest_output_h = sz._w * ratio
crop = ",crop=" & sz._w & ":" & sz._h & ":0:" & Math.Abs((m_dest_output_h - sz._h)) \ 2
Else
m_dest_output_h = sz._h
m_dest_output_w = sz._h * ratio
crop = ",crop=" & sz._w & ":" & sz._h & ":" & Math.Abs((m_dest_output_w - sz._w)) \ 2 & ":0"
End If
crop = " -vf scale=" & m_dest_output_w & ":" & m_dest_output_h & crop
m_dest_output_w = sz._w
m_dest_output_h = sz._h
End If
End If