【发布时间】:2017-03-26 02:15:56
【问题描述】:
我正在尝试创建一个脚本来处理视频,但我希望从传入的文件中获取 bit_rate、宽度和高度信息,以便更好地调整输出。当我一次处理一个文件时,该脚本有效,但是当我突然将其放入循环时,我没有得到任何信息。
所以这行得通:
#!/bin/bash
eval $(ffprobe -v quiet -show_format -of flat=s=_ -show_entries stream=height,width,nb_frames,duration,codec_name input.mp4);
width=${streams_stream_0_width};
height=${streams_stream_0_height};
bitrate=$((${format_bit_rate}/1000));
echo $width,$height,$bitrate;
从find ./ -type f -regex ".*\.\(mkv\|mp4\|wmv\|flv\|webm\|mov\|avi\)" -print0 | xargs -0 /root/newbatch.sh 执行时不会这样做
for i; do
eval '$(ffprobe -v quiet -show_format -of flat=s=_ -show_entries stream=height,width,nb_frames,duration,codec_name $i)';
width=${streams_stream_0_width};
height=${streams_stream_0_height};
bitrate=${format_bit_rate};
kbitrate=$((bitrate/1000));
echo $i,$width,$height,$kbitrate;
done
循环中bitrate 的数学运算也出现错误,但即使我将其注释掉,我仍然没有得到任何结果。由于它一次工作一个,我假设问题是 bash 脚本,与 ffmpeg / ffprobe 无关。
话虽如此,我可以这样做:
echo $i,$width,$height,$bitrate;
然后回来
./file1.mkv,,,
./file2.mkv,,,
./file3.mkv,,,
./file4.mkv,,,
所以它确实得到了一些信息,但它丢失了 eval 语句中的信息。
【问题讨论】:
-
为什么需要知道输入的比特率?使用shellcheck.net 检查您的脚本。如果您仍然有问题,请显示您清理过的脚本。
-
我正在对几千个视频进行编码,其中一些视频的分辨率和比特率比其他视频低得多,但是因为我想使用 nvenc_hvec,它的算法选择合适的比特率比libx265,我必须为每个文件指定它。我正在考虑使用一些
if, else逻辑来为输出选择合适的速率,这样我就不会意外地将传入的 400kbps 文件编码为 1,200kbps。 -
我使用了 shellcheck.net,虽然我很欣赏这个推荐,但没有发现任何值得注意的地方,这个网站对我来说是新的。
-
一般来说,我会很犹豫以这种方式使用
eval。你基本上在你的 shell 中运行了数千个命令,这些命令是ffprobe的输出结果。我认为一个快速的 Python 脚本或者sed和awk会更适合这项任务。 -
忽略我之前的评论,如果您删除
eval命令的参数周围的单引号是否有效?