私の質問の最初の部分:
私は読んだffmpeg ドキュメント(section 3.2 How do I encode single pictures into movies?
)次のように:
単一のイメージをムービーにエンコードするには、次のコマンドを実行します。
ffmpeg -f image2 -i img%d.jpg movie.mpg
"%d"は画像番号に置き換えられます。 img%03d.jpg は img001.jpg、img002.jpg などのシーケンスを意味します。
img%03d.jpg
私の質問は:誰との間の翻訳をしていますかimg001.jpg, img002.jpg, etc
?シェルですか、それともffmpegですか?
2番目の部分:
ffmpegに一連の画像をビデオにエンコードするように依頼したいと思います。しかし、私のシーケンスは通常、1以外のインデックスから始まり(呼び出すことができますstart_index
)、呼び出すことができるインデックスで終わりますend_index
。また、シーケンスは value の増分を使用しますincrement
。たとえば、次のようになります。
img_0025.png, img_0030.png, img_0035.png, ... img_0100.png
そのうちstart_index
25、100、5 end_index
。increment
まず、シーケンス名を変更せずに上記のような画像シーケンスをffmpegに供給したいと思います。この資料ではシンボリックリンクを使用してこれを行う方法について説明しますが、zshで高度なワイルドカードを使用してシンボリックリンクを完全に回避する方法があるかどうか疑問に思います。
答え1
パート1: %
特殊文字ではないので、引数はimg%d.jpg
そのままffmpeg
「get-job」自体に渡されます。
パート2:ドキュメントを見ると、ffmpeg
入力ファイルを提供する他の方法がないと思われるので、シンボリックリンクを使用するか、「修正」を待つ必要があるかもしれません。
パターンに「%d」または「%0Nd」が含まれている場合、パターンで指定されたファイルリストの最初のファイル名には0から4の間の数字を含める必要があり、その後のすべての数字は連続する必要があります。この制限は解決されると予想されます。
答え2
つまり、パイプのみを使用して実行できます。名前を変更する必要もなく、シンボリックリンクも必要ありません。
ここに私がまとめた台本、解説、すべてがあります。
毎秒1フレームで再生するように設定しました。
画像処理使用パッケージnetpbm
たとえば、images-to-vid '$HOME/images" '\./img_[0-9]{4}[^/0-9]*' 1024 768
# Make a video from images whose sizes and aspect-ratios may vary.
#
# Each image is resized to fit maximized within the video frame.
# The images are positioned centrally and padded (when required)
#
# Images are sourced using 'find'.
# They are selected according to a regular expression.
# Symbolic links are ignored.
#
# Output from 'find' is sorted by path, ie. not by name alone,
# but with a -maxlevel 1, this is typically the same...
# You will need to customize the sort if this is not suitable.
#
# Note about 'find':
# This script uses 'find -regex' instead of 'find -name'.
# The pattern must match the whole returned path,
# from ^ to $ inclusive
# The -regextype option is: posix-extended
#
srceD="${1}" # Source Directory
srceR="${2}" # Source imaage extended Regex pattern
targW="${3:-800}" # Target pixel Width
targH="${4:-600}" # Target pixel Height
targB="${5:-black}" # Target Background colour (X11 colours)
targM="${6:-4}" # Target screen geometry Modulo (as required by Target codec)
TARGw=$((targW-(targW%targM))); ((TARGw==targW)) || { echo "Target Width must be divisible by $targM. Rounding down to $TARGw" 1>&2 ; targW=$TARGw; }
TARGh=$((targH-(targH%targM))); ((TARGh==targH)) || { echo "Target Height must be divisible by $targM. Rounding down to $TARGh" 1>&2 ; targH=$TARGh; }
# TODO: test for W/H == 0
cd "$srceD" || exit 2
find . -maxdepth 1 \
\( -type f \) -and -not \
\( -type l \) \
-regextype posix-extended \
-regex "$srceR" \
-print0 |
sort -z |
{
while IFS= read -d $'\0' -r file ;do
# make Composite image on coloured Background
pnmcomp -align=center -valign=middle \
<(anytopnm "$file" 2>/dev/null |
pnmscale -xysize $targW $targH) \
<(ppmmake "$targB" $targW $targH)
done |
ffmpeg -r 1 \
-f image2pipe \
-vcodec ppm \
-i - \
-y -s ${targW}x${targH} \
-vcodec mjpeg \
images.avi
}
答え3
最初の部分では、ffmpegはこれを行います。シェルは%d
この文字列をファイル名の特殊パターンとして認識しません。