2016-05-15 18 views
1

フレーム番号を1行ずつ含むテキストファイルがあり、bashスクリプトとffmpegを使って各行を繰り返し、各フレームのサムネイルを印刷しようとしています。私のbashスクリプトがffmpegで停止しているのはなぜですか?

端末でbashスクリプトを実行するたびに、最初のサムネイルを作成したことでエラーが発生して停止します。サムネイルには一意の名前が与えられていないようです。私は間違って何をしていますか?

私のbashスクリプト:

#!/bin/bash 
source text.txt 
while read name 
do 
ffmpeg -i result.mp4 -vf "setpts=N+1,select='eq(n,$name)'" -vframes 1 frames-$i.jpg 
done <text.txt 

エラー:

File 'frames-.jpg' already exists. Overwrite ? [y/N] Not overwriting - exiting 
+0

'$ i'変数は空ですが、決して定義しません。あなたは何をしたいですか? – Jahid

+1

見てください:http://www.shellcheck.net/ – Cyrus

+0

$ 1は1,2,3-などの連続番号でもかまいません.... – JulianJ

答えて

1

まず、私はあなたがファイルのテキストsourceに必要とされていない推測しています.txtをスクリプトに追加します。ファイルのソースがsource filenameまたは. filenameの場合、ファイル内のコード行は、コマンド行で出力されたかのように実行されます。このように、私はあなたのスクリプトのこのセクションを削除しました。

第2に、他の人が述べたように、$i変数を定義したり更新したりしませんでした。以下のような変更があなたのために働くかもしれない:

#!/bin/bash 

i="0" 
while read -r name || [[ -n "${name}" ]]; do # allows for last line with no newline 
    ffmpeg -i result.mp4 -vf "setpts=N+1,select='eq(n,${name})'" -vframes 1 frames-${i}.jpg 
    if [ "$?" -eq "0" ]; then 
     printf -- 'ffmpeg succeeded - creating frames-%s.jpg for %s\n' "${i}" "${name}" 
    else 
     printf -- 'ffmpeg failed - was unable to create frames-%s.jpg for %s\n' "${i}" "${name}" 
    fi 
    let i+="1" 
done <text.txt 

いくつかの追加の注意事項を上記のスクリプトに:

  1. バックスラッシュの解釈はエスケープと行継続で無効にするread-rを使用することをお勧めします読み込まれたデータ。あなたの入力にbashのエスケープ可能な文字がある場合、これは問題の疫病からあなたを守ります。

  2. 入力ファイルの最後の行に最後の文字として改行がないようにするために、while条件に|| [[ -n "${name}" ]]を追加しました。それ以外の場合は、各行の最後に改行文字が必要なため、最後の行は標準の読み込みプロセスで無視されます。

  3. bash組み込み変数$?のチェックを追加しました。前のコマンドの戻り値は$?に格納されます。 0は成功を示し、その他はエラーを示します。


EDIT

あなたがやっているffmpegのトラブルシューティングをしたい場合は、以下の修正スクリプト試すことができます。

#!/bin/bash 

set -x # activate bash debugging output 

while read -r frame_number || [[ -n "${frame_number}" ]]; do # allows for last line with no newline 
    ffmpeg -i result.mp4 -vf "setpts=N+1,select='eq(n,${frame_number})'" -vframes 1 frames-${frame_number}.jpg 
    if [ $? -eq 0 ]; then 
     printf -- 'ffmpeg succeeded - creating frames-%s.jpg\n' "${frame_number}" 
    else 
     printf -- 'ffmpeg failed - was unable to create frames-%s.jpg\n' "${frame_number}" 
    fi 
done <text.txt 

を編集が含まれます:

  1. jpegファイル名のtext.txtからフレーム番号を使用するようにスクリプトを合理化する。
  2. 有効bashset -xを追加してデバッグを有効にします。

上記の変更されたスクリプトを使用すると、実行するたびにすべての出力をffmpegから見ることができます。私の模擬テストは、すべてがあなたの望む成果ごとに正しく機能しているはずであることを示しています。あなたはもう一度テストして結果を報告できますか?

+0

これは大きな感謝と説明のためです。しかし、それはテキストファイルに34があるとき私はわずか22フレームを印刷取得わずかに奇妙ですか? – JulianJ

+0

22個のフレームの名前に連続した番号がありますか?(例:frames-0.jpg、frames-1.jpg、frames-2.jpg、frames-3.jpg、...)または、ギャップ(たとえば、frames-0.jpg、frames-1.jpg、frames-7.jpg、frames-9.jpg ...)がありますか? –

+0

はい、説明したようにフレームは連続していますが、奇妙なことに、私がつかんでいるフレームはテキストファイルのフレームに実際には反応しません。 – JulianJ

1

$iを定義してみてください。

i=0 
while read name 
do 
((i++)) 
ffmpeg -i result.mp4 -vf "setpts=N+1,select='eq(n,$name)'" -vframes 1 frames-$i.jpg 
done <text.txt 
関連する問題