我正在尝试创建一个脚本来处理视频,但我希望从传入文件中获取比特率、宽度和高度信息,以便我可以更好地调整输出。当我一次处理一个文件时,该脚本可以工作,但是当我突然将其放入循环中时,我没有得到任何信息。
所以这有效:
#!/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;
Run Code Online (Sandbox Code Playgroud)
这在执行时不会出现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
Run Code Online (Sandbox Code Playgroud)
我在循环中的数学运算中也遇到了错误bitrate,但即使我将其注释掉,我仍然没有得到任何结果。由于它一次只能运行一个,我假设问题是 bash 脚本,与 ffmpeg / ffprobe 无关。
话虽这么说,我可以这样做:
echo $i,$width,$height,$bitrate;
Run Code Online (Sandbox Code Playgroud)
然后回来
./file1.mkv,,,
./file2.mkv,,,
./file3.mkv,,,
./file4.mkv,,,
Run Code Online (Sandbox Code Playgroud)
所以它确实得到了一些信息,但它丢失了 eval 语句中的信息。
我希望将视频编解码器作为变量存储在批处理文件中以自动进行一些视频转换,但不想转换已经是正确编解码器的内容。
这将成功生成编解码器(hevc)
C:\ffmpeg\bin\ffprobe.exe -v error -select_streams v:0 -show_entries` stream=codec_name -of default=noprint_wrappers=1:nokey=1 video.mkv
pause
Run Code Online (Sandbox Code Playgroud)
但是我一直无法将该结果存储在变量中,我已经遵循了许多建议这种布局的示例。
for /F "delims=" %%I in ('C:\ffmpeg\bin\ffprobe.exe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 video.mkv') do set "codec=%%I"
echo %codec%
Run Code Online (Sandbox Code Playgroud)
但是这会导致此错误:“参数 'noprint_wrappers' 作为输入文件名提供,但 'codec_name' 已指定。”
我真的不知道该去哪里,因为我所有的阅读都表明这是存储变量的正确方法。