FFMpeg:如何在 bash 中获取实际返回值

FFMpeg:如何在 bash 中获取实际返回值

我一直通过 cmd 脚本使用 ffmpeg,并且我总是可以检查 %ERRORLEVEL%,如果成功则始终为“0”,如果发生错误则为“!0”。

我尝试用 bash 重新编码我的 cmd 脚本(使用适用于 Windows 的 msys2),因为 bash 让我对脚本有了更多的控制权(我的经验是,bash 比 cmd 好 1000 倍)。但是当我做这样的事情时

status=$($ffMpegPath -hide_banner -y "${aInput[@]}" "${aMapping[@]}" -c copy "${aParam[@]}" "$destination")

那么 $status 始终为“0”(成功),即使 ffmpeg 中发生错误。
我遗漏了什么?
我做错了什么吗?

我在 windows11 中为 windows 的 msys2 编写 bash 代码。$ffMpegPath 是一个全局变量,指向我的 ffmpeg 所在的 unix 路径,它被声明为全局变量,如下所示:

declare -r ffMpegPath="/c/Tools/ffmpeg/bin/ffmpeg.exe"

[附录] 为了澄清一些事情,以下是命令(不带'-hide_banner'):

/c/Tools/ffmpeg/bin/ffmpeg.exe -y -i /f/Kigo/Film/raw/input.mp4 -i /f/Kigo/Film/Audio/input.French.mp4 -map 0:V -map 0:a -map 1:a -map_metadata -1 -map_chapters -1 -sn -dn -c copy -metadata:s:v:0 language=und -disposition:v:0 default -metadata:s:v:0 title= -metadata:s:a:0 title= -metadata:s:a:1 title= -metadata:s:v:0 SOURCE_ID-eng= -metadata:s:a:0 SOURCE_ID-eng= -metadata:s:a:1 SOURCE_ID-eng= -metadata:s:v:0 BPS= -metadata:s:a:0 BPS= -metadata:s:a:1 BPS= -metadata:s:v:0 BPS-eng= -metadata:s:a:0 BPS-eng= -metadata:s:a:1 BPS-eng= -metadata:s:v:0 DURATION= -metadata:s:a:0 DURATION= -metadata:s:a:1 DURATION= -metadata:s:v:0 DURATION-eng= -metadata:s:a:0 DURATION-eng= -metadata:s:a:1 DURATION-eng= -metadata:s:v:0 NUMBER_OF_FRAMES= -metadata:s:a:0 NUMBER_OF_FRAMES= -metadata:s:a:1 NUMBER_OF_FRAMES= -metadata:s:v:0 NUMBER_OF_FRAMES-eng= -metadata:s:a:0 NUMBER_OF_FRAMES-eng= -metadata:s:a:1 NUMBER_OF_FRAMES-eng= -metadata:s:v:0 NUMBER_OF_BYTES= -metadata:s:a:0 NUMBER_OF_BYTES= -metadata:s:a:1 NUMBER_OF_BYTES= -metadata:s:v:0 NUMBER_OF_BYTES-eng= -metadata:s:a:0 NUMBER_OF_BYTES-eng= -metadata:s:a:1 NUMBER_OF_BYTES-eng= -metadata:s:v:0 _STATISTICS_WRITING_APP= -metadata:s:a:0 _STATISTICS_WRITING_APP= -metadata:s:a:1 _STATISTICS_WRITING_APP= -metadata:s:v:0 _STATISTICS_WRITING_APP-eng= -metadata:s:a:0 _STATISTICS_WRITING_APP-eng= -metadata:s:a:1 _STATISTICS_WRITING_APP-eng= -metadata:s:v:0 _STATISTICS_WRITING_DATE_UTC= -metadata:s:a:0 _STATISTICS_WRITING_DATE_UTC= -metadata:s:a:1 _STATISTICS_WRITING_DATE_UTC= -metadata:s:v:0 _STATISTICS_WRITING_DATE_UTC-eng= -metadata:s:a:0 _STATISTICS_WRITING_DATE_UTC-eng= -metadata:s:a:1 _STATISTICS_WRITING_DATE_UTC-eng= -metadata:s:v:0 _STATISTICS_TAGS= -metadata:s:a:0 _STATISTICS_TAGS= -metadata:s:a:1 _STATISTICS_TAGS= -metadata:s:v:0 _STATISTICS_TAGS-eng= -metadata:s:a:0 _STATISTICS_TAGS-eng= -metadata:s:a:1 _STATISTICS_TAGS-eng= -metadata:s:v:0 HANDLER_NAME= -metadata:s:a:0 HANDLER_NAME= -metadata:s:a:1 HANDLER_NAME= -metadata:s:v:0 VENDOR_ID= -metadata:s:a:0 VENDOR_ID= -metadata:s:a:1 VENDOR_ID= -metadata:s:a:0 language=eng -metadata:s:a:1 language=fra /e/Video/MP4/output.mp4

以下是其(截断的)输出:

ffmpeg version N-114362-gbc9e6bd678-gac21582e53+3 Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 13.2.0 (Rev5, Built by MSYS2 project)
  configuration:  --pkg-config=pkgconf --cc='ccache gcc' --cxx='ccache g++' --ld='ccache g++' --extra-cxxflags=-fpermissive --extra-cflags=-Wno-int-conversion --disable-autodetect --enable-amf --enable-bzlib --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-iconv --enable-lzma --enable-nvenc --enable-zlib --enable-sdl2 --enable-ffnvcodec --enable-nvdec --enable-cuda-llvm --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libdav1d --enable-libaom --disable-debug --enable-libfdk-aac --enable-fontconfig --enable-libass --enable-libbluray --enable-libfreetype --enable-libmfx --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libwebp --enable-libxml2 --enable-libzimg --enable-libshine --enable-gpl --enable-avisynth --enable-libxvid --enable-libopenmpt --enable-version3 --enable-librav1e --enable-libsrt --enable-libgsm --enable-libvmaf --enable-libsvtav1 --enable-chromaprint --enable-decklink --enable-frei0r --enable-libaribb24 --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfribidi --enable-libgme --enable-libilbc --enable-libsvthevc --enable-libsvtvp9 --enable-libkvazaar --enable-libmodplug --enable-librist --enable-librtmp --enable-librubberband --enable-libtesseract --enable-libxavs --enable-libzmq --enable-libzvbi --enable-openal --enable-libcodec2 --enable-ladspa --enable-libglslang --enable-vulkan --enable-libdavs2 --enable-libxavs2 --enable-libuavs3d --enable-libplacebo --enable-libjxl --enable-opencl --enable-opengl --enable-libopenh264 --enable-openssl --extra-cflags=-DLIBTWOLAME_STATIC --extra-libs=-lstdc++ --extra-cflags=-DCACA_STATIC --extra-cflags=-DMODPLUG_STATIC --extra-cflags=-DCHROMAPRINT_NODLL --extra-libs=-lstdc++ --extra-cflags=-DZMQ_STATIC --extra-libs=-lpsapi --extra-cflags=-DLIBXML_STATIC --extra-libs=-liconv --disable-w32threads --extra-cflags=-DKVZ_STATIC_LIB --enable-nonfree --extra-cflags=-DAL_LIBTYPE_STATIC --extra-cflags='-IC:/mab/local64/include' --extra-cflags='-IC:/mab/local64/include/AL'
  libavutil      59.  6.100 / 59.  6.100
  libavcodec     61.  2.100 / 61.  2.100
  libavformat    61.  0.100 / 61.  0.100
  libavdevice    61.  0.100 / 61.  0.100
  libavfilter    10.  0.100 / 10.  0.100
  libswscale      8.  0.100 /  8.  0.100
  libswresample   5.  0.100 /  5.  0.100
  libpostproc    58.  0.100 / 58.  0.100

答案1

如果发生错误,ffmpeg 返回的错误代码不保证非零。

一种解决方案是使用-xerror参数,代表“发生错误时停止并退出”。据说使用此参数返回的错误代码更可靠,并且代码0表示没有错误。

另一种解决方案是使用参数-v error并将包含错误的输出重定向到可搜索的文本文件中,然后测试搜索工具返回的错误代码。

参考 :

答案2

好吧,几天后我学到了很多关于 BASH 的知识。看来我错过了很多东西。

当我做

result=$(ffmpeg <options>...)

那么我将无法获得它的返回值,但无论它会报告给屏幕什么,就像您使用 ffprobe 时获得的那样。实际上,您不会从 ffmpeg 获得任何东西,我对此不确定。但我错了,我必须在 ffmpeg 命令后立即添加类似以下内容:

retvalue=$?

为了获取命令的返回值(如 windows-cmd 环境中的 ERRORLEVEL)。

所以很抱歉打扰你,这是我的错。

相关内容