所以我写了一个 bash 脚本来获取新写入的视频文件并将它们转码以在我的服务器中播放和流式传输这里是脚本
while true; do
printf -v filename '%q' "$(inotifywait --format "%w""%f" -r -e close_write /var/$
echo $filename
if [[ $filename == *".mp4"* ]]; then
echo "1"
avconv -i "$filename" "`echo ${filename%.mp4}.webm`"
fi
if [[ $filename == *".mkv"* ]]; then
echo "2"
avconv -i "$filename" "`echo ${filename%.mkv}.mp4`"
avconv -i "$filename" "`echo ${filename%.mkv}.webm`"
fi
if [[ "$filename" == *".avi"* ]]
then echo "3"
avconv -i "$filename" "`echo ${filename%.avi}.mp4`" &
avconv -i "$filename" "`echo ${filename%.avi}.webm`"&
fi
done
脚本运行良好,但是如果 $filename 包含空格,avconv 中断并且脚本返回:
Watches established.
/var/www/media2net/tv/The\ Daily.mkv
2
avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav s
built on Nov 6 2012 16:51:33 with gcc 4.6.3
/var/www/media2net/tv/The\: No such file or directory
avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav
built on Nov 6 2012 16:51:33 with gcc 4.6.3
/var/www/media2net/tv/The\ Daily.mkv: No such file or directory
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
但是这是不正确的,因为我可以在其各自的目录中查看所述文件,我还在 shell 中使用以下内容测试了 avconv,一切正常并且 avconv 对视频进行了转码
avconv -i /var/www/media2net/The\ Daily.mkv /var/www/media2net/tv/The\ Daily.webm
基本上我想知道我在我的脚本中做错了什么,或者是否有其他人在使用 avconv 或 ffmpeg 时遇到过类似的问题(因为这两个非常相似并且 avconv 是该项目的 ubuntu 分支)任何帮助将不胜感激! 提前致谢 -布伦丹
最佳答案
您对转义反斜杠和引号的使用似乎有些不一致。事实上,你只需要两者之一,更容易使用的当然是引号。
因此,首先要删除文件名中的反斜杠。
此外,
"$(inotifywait --format "%w""%f"...
应该在 :
中更正"$(inotifywait --format '%w%f'...
此外,包含以下内容的行:
"`echo ${filename%.mkv}.mp4`"
有点模棱两可,因为事实上,您在回显 - 如果 $filename
中有空格 - 两条字符链 -。它应该在 :
"${filename/%.mkv/.mp4}"
关于bash - 使用 inotifywait 和 avconv 解释 bash 脚本中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627095/