我一直通过 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)。
所以很抱歉打扰你,这是我的错。