2016-05-15 56 views
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時,文件中的代碼行就像在命令行中打印一樣執行。因此,我已經刪除了你的腳本的這一部分。其次,正如其他人所指出的那樣,您沒有定義或更新$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. 建議使用-rread禁用反斜線的解釋逃走了續行中數據讀取。如果您的輸入有可能會出現bash字符,這可以讓您免受問題的困擾。

  2. 我將|| [[ -n "${name}" ]]添加到while條件中,以允許輸入文件中的最後一行沒有換行符作爲最後一個字符。否則,最後一行將被標準讀取過程忽略,因爲它需要每行末尾有一個換行符。

  3. 我添加了一個bash內建變量$?的檢查。前一個命令的返回值存儲在$?中。 0表示成功,其他表示錯誤。


編輯

如果你想幫助解決什麼的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. 簡化腳本以使用text.txt中的幀編號作爲jpeg文件名。
  2. 啓用bash調試加入set -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