我正试图创建一个处理视频的脚本,但希望能从输入文件中获取bit_rate、width和height信息以更好地调整输出。当我逐个处理文件时,脚本可以正常工作,但当我放到循环中时,突然间就获取不到任何信息了。
所以这个可以正常工作:
所以这个可以正常工作:
#!/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
的数学运算时出现了错误,但即使我将其注释掉,仍然没有结果。由于一个接一个地工作,我认为问题与ffmpeg / ffprobe无关,而是与bash脚本有关。
话虽如此,我可以这样做:
echo $i,$width,$height,$bitrate;
并返回
./file1.mkv,,,
./file2.mkv,,,
./file3.mkv,,,
./file4.mkv,,,
所以它确实会返回一些信息,但却失去了eval语句中的信息。
eval
这种方式。你基本上是在你的shell中运行成千上万个命令,这些命令是由ffprobe
的输出结果产生的。我认为一个快速的Python脚本或者也许是sed
和awk
更适合这个任务。 - eddiemeval
命令周围参数的单引号,它是否有效? - eddiem"$i"
来处理带有空格的文件。 - Alan