誰が仕事をしているのか:ffmpegまたはシェル?


8

私の質問の最初の部分:

私はffmpegのドキュメントsection 3.2 How do I encode single pictures into movies?)を次のように読みました:

1つの画像をムービーにエンコードするには、次のコマンドを実行します。

  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ですか?

後編:

画像のシーケンスをビデオにエンコードするようにffmpegに依頼したいと思います。ただし、多くの場合、シーケンスは1とは異なるインデックスで始まり(たとえば、それを呼び出すことができますstart_index)、呼び出すことができるインデックスで終わりますend_index。さらに、シーケンスはvalueの増分を使用しますincrement。例:

img_0025.png, img_0030.png, img_0035.png, ... img_0100.png

ここstart_indexで、end_index25、100、およびincrement5でした。

最初にシーケンスの名前を変更する必要なく、上記のような画像シーケンスをffmpegにフィードしたいと思います。ドキュメントでは、シンボリックリンクを使用してこれを行う方法を説明していますが、それらを完全に回避する方法、おそらくzshで高度なグロビングを使用する方法があるかどうか疑問に思っていました。

回答:


8

パート1: %は特殊文字ではないため、img%d.jpg引数はそのままffmpeg「仕事をする」自体に渡されます。

パート2:ffmpegドキュメントを見ると、入力ファイルを提供する別の方法はないと思うので、シンボリックリンクを使用するか、「修正」を待つ必要があるかもしれません。

パターンに「%d」または「%0Nd」が含まれている場合、パターンで指定されたファイルリストの最初のファイル名には、0から4までの数値が含まれている必要があります。この制限はうまくいけば修正されるかもしれません。


5

つまり、パイプのみを使用して行うことができます。名前の変更やシンボリックリンクなし。

これが私がまとめたスクリプト、コメントなどです。
毎秒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
}

@feredに感謝します。これはとても役に立ちます。あなたのスクリプトは、私が望んでいた以上のことをしてくれます。スクリプトを自分のニーズに合わせようとしています。whileループを単純なループに置き換えると、事前スケーリングも背景色の追加も行われません。while IFS= read -d $'\0' -r file ;do pnmcomp -align=center -valign=middle <(anytopnm "$file" 2>/devnull) doneスクリプトが機能しなくなります(つまり、pipe: could not find codec parameters)。なぜなのかご存知ですか?必ず画像が必要ですpnmscaleppmmake、それともフィードffmpegする必要がありpnmますか?
Amelio Vazquez-Reina

1
@intrpc。異なるサイズの写真のフレーミングは、この問題に対する私の個人的な思いでした。私が使用する能力を失って以来、私は今までにやりたいと思ってきたavisynth(強力なビデオスクリプト環境を- AviSynthのは、Windowsのみ:(主な理由は、私が使用されているnetpbmフォーマットは、私はパイプにJPEGファイルを供給問題についての投稿を見て保管ということです、だから、抵抗の少ないパスを選択しただけです。ビデオエ​​ンコーディングは品質低下の原因となるステップですが、フレームサイズを大きくすると役立ちます...ビデオを使用する特定の理由があると思いますが、簡単なスライドショーあなたのために働くことがあります。
Peter.O

3

最初の部分のみ:仕事をしているのはffmpegです。シェルは、%d文字列をファイル名の特別なパターンとして認識しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.