我稍微更新了一下,但仍然没有得到我应该得到的结果:
#!/bin/bash
find "$1" -type f | while read filename
do
videoCodec=$(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$filename")
audioCodec=$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$filename")
audioChannels=$(ffprobe -v error -select_streams a:0 -show_entries stream=channels -of default=noprint_wrappers=1:nokey=1 "$filename")
echo $videoCodec $audioCodec $audioChannels $filename
if [ $videoCodec = "h264" ] && [ $audioCodec = "aac" ] && [ audioChannels = "2" ] ; then
echo "Direct play capable"
fi
done
我在包含满足所有 if 条件(“h264 aac 2 ./Black.Mass.(2015)/Black.Mass.(2015).mp4”)的文件的文件夹上运行此命令,但没有得到“可直接播放”的回声。
答案1
你没说,但应该不是运行 DTS 音频?无论如何,此行不会正常工作:
if [[ $video_good="true" && $audio_good="true" ]] ; then
由于等号周围没有空格,因此它们被解析为字符串的一部分,而不是比较运算符。请改用此方法:
if [[ $video_good = "true" && $audio_good = "true" ]] ; then
(像您在之前的比较中使用的双等号也可以起作用。但同样,它们周围需要有空格。)
顺便说一句,我强烈建议使用双引号括住变量引用(即"$f"
而不仅仅是$f
)。但是,如果使用双引号,则使用$cli_video
和的方式$cli_audio
将不起作用,因此不要对它们这样做。存储此类参数的真正正确方法是使用数组而不是普通变量,如下所示:
cli_video=(-c:v copy)
...
cli_audio=(-c:a copy)
...
ffmpeg -i "$f" "${cli_video[@]}" "${cli_audio[@]}" "$(basename "$f")"