我需要使用循环获取mplayer的视频缩略图, 但是mplayer给了我错误。 但是,相同的命令可以在循环中正常工作
如何阻止我的命令受循环影响?
我试图封装在子shell或重定向的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)
答案 0 :(得分:0)
问题:mplayer继续读取stdin并影响其执行,直到失败。
解决方案选项:
A)告诉mplayer不要读取stdin,因为JNevill表明了
mplayer -noconsolecontrols -ss 60 -nosound -vo jpeg -frames 1 "$video"
B)提供空的标准输入(带</dev/null
)
mplayer -ss 60 -nosound -vo jpeg -frames 1 "$video" </dev/null
我从https://bugs.launchpad.net/ubuntu/+source/mplayer/+bug/697655获得B)(摘录如下)
” 在循环中运行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命令中输入一些输出,就好像用户以交互方式使用它并按键来调整显示器的大小等。作为一个额外的症状,回声的输出将神秘地具有切碎的文件名。
作为一种解决方法,可以通过添加重定向来修复上面的小样本脚本
Google中有几个关于此问题的帖子,但我发现没有一个确实正确诊断并纠正了这个问题。 “