0

ループを使用して mplayer でビデオのサムネイルを取得する必要がありますが、mplayer でエラーが発生します。ただし、同じコマンドはループ外でも正常に機能します

コマンドがループの影響を受けないようにするにはどうすればよいですか?

サブシェルまたはリダイレクトされた stdin / stdout にカプセル化しようとしましたが、失敗しました

これがコードです

while read video; do
   ....

    mplayer -ss 60 -nosound -vo jpeg -frames 1 "$video"


done < video_list.txt

出力 mplayer

......
No bind found for key '~'.
No bind found for key 'l'.
No bind found for key 'b'.
No bind found for key 'H'.
No bind found for key 'R'.
No bind found for key 'Y'.
No bind found for key 'B'.
No bind found for key '"'.
No bind found for key 'l'.
No bind found for key '='.
No bind found for key '"'.
No bind found for key '"'.
Dead key input on file descriptor 0

  =====  PAUSE  =====

Exiting... (Quit)
4

1 に答える 1

0

問題: mplayer は stdin を読み取り続け、失敗するまで実行に影響を与えます。

ソリューション オプション:

A) JNevill が適切に示しているように、stdin を読み取らないように mplayer に指示します。

mplayer -noconsolecontrols -ss 60 -nosound -vo jpeg -frames 1 "$video"

B) 空の stdin 入力を提供する (with </dev/null)

mplayer -ss 60 -nosound -vo jpeg -frames 1 "$video"  </dev/null

B) をhttps://bugs.launchpad.net/ubuntu/+source/mplayer/+bug/697655から取得しました(以下の抜粋)

ファイルをバッチ変換するためだけに呼び出された場合でも、mplayer は標準入力を消費するため、ループで mplayer を実行することはできません。

次のようなスクリプトを考えてみましょう:

find . -type f |
while read file; do
 echo "# $file"
  mplayer -vc null -vo null -ao pcm:file="$file.wav" "$file"
done

これは、「キー 'O' のバインドが見つかりません」という警告などで不思議なことに失敗します。これは、ユーザーがインタラクティブに使用し、キーを押してディスプレイのサイズを変更したかのように、明らかに mplayer が find コマンドからの出力の一部を食べ​​ているためです。症状として、echo からの出力のファイル名が不思議なことに切り刻まれます。

回避策として、リダイレクトを追加することで上記の小さなサンプル スクリプトを修正できます。

Google にはこれに関するスレッドがいくつかありますが、実際にこの問題を正しく診断して修正したスレッドは見つかりませんでした。"

于 2015-11-16T13:20:25.380 に答える