这是打印视频帧率的bash脚本,它所包含的参数可能包含空格。此参数也将在脚本内的命令中使用。
struct Pi {
template <class T>
decltype(pi<T>) operator*(T val) { return val * pi<T>; }
template <class T>
friend decltype(pi<T>) operator*(T val, Pi) { return pi<T> * val; }
};
执行时
#!/bin/bash
inputVid="$*"
#checking if $inputVid has full path
echo $inputVid
frames=`ffmpeg -i $inputVid 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p"`
echo $frames
输出是:
$./frameRate.sh ../Downloads/FlareGet/Videos/Why\ .mp4
所以文件名正确传递但是空格没有被转义,因此没有来自ffmpeg的输出
有什么方法可以解决这个问题吗?
答案 0 :(得分:3)
如果您的命令只接受一个参数,请使用$1
。您需要做的就是在脚本中正确引用原始参数和参数$1
。
# Equivalent invocations
$ ./frameRate.sh ../Downloads/FlareGet/Videos/Why\ .mp4
$ ./frameRate.sh ../Downloads/FlareGet/Videos/"Why .mp4"
$ ./frameRate.sh "../Downloads/FlareGet/Videos/Why .mp4"
脚本将是
inputVid="$1"
ffmpeg -i "$inputVid" 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p"
或只是
ffmpeg -i "$1" 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p"
如果这不起作用,那么你的Python脚本没有正确传递参数,并且你无法做任何事情来适应它。
答案 1 :(得分:3)
除了在输入变量周围使用双引号外,您还应使用ffprobe
代替ffmpeg
来获取媒体文件信息。 ffmpeg
的输出仅供参考,不能由脚本解析:它被认为是“脆弱的”,并不保证提供标准,一致的格式。使用ffprobe
还可以删除sed
。
#!/bin/bash
# Output file path and name
echo "$1"
# Output average frame rate
ffprobe -loglevel error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 "$1"