我的项目使用libavformat连接到rtsp://
URL.设置套接字超时并在出错时重新连接非常重要.不幸的是,stimeout
open的选项仅存在于ffmpeg(特别是其libavformat版本> = 55.1.100),而不是竞争项目libav(任何版本).我想支持的一些系统(例如Raspbian Jessie)仍然与libav捆绑在一起.
所以,我认为我最好的选择是使用cmake检测我是否有合适的版本,如果没有,请安装ffmpeg in-tree.我想我应该可以通过以下方式做到这一点:
pkg_check_modules(FFMPEG libavutil libavcodec libavformat) if(not FFMPEG_FOUND or FFMPEG_VERSION VERSION_LESS 55.1.101) ExternalProject_Add( FfmpegProject URL "http://ffmpeg.org/releases/ffmpeg-2.8.3.tar.xz" URL_HASH "SHA1=a6f39efe1bea9a9b271c903d3c1dcb940a510c87" INSTALL_COMMAND "") ...set up flags and such to use this in-tree version... endif()
除了我不知道如何检测libav vs ffmpeg.我没有在pkgconfig中看到任何东西或libavformat/version.h
区分它们.他们使用的版本号似乎重叠.对我来说,如何以编程方式区分差异并不是很明显,更不用说使用非奇怪的cmake规则.有任何想法吗?
要专门回答您的问题,请使用以下代码:
#include#include "libavutil/opt.h" #include "libavformat/avformat.h" int main(int argc, char *argv[]) { av_register_all(); AVInputFormat *input = av_find_input_format("rtsp"); const AVClass *klass = input->priv_class; const AVOption *opt = av_opt_find2(&klass, argv[1], NULL, 0, AV_OPT_SEARCH_FAKE_OBJ, NULL); printf("%p\n", opt); return 0; }
这可以做运行时检测,这是它的工作原理:
bash-3.2$ /tmp/test hi 0x0 bash-3.2$ /tmp/test stimeout 0x103420100
对于您的其他问题,可以通过查看库微版本来检测Libav与FFmpeg.对于FFmpeg,它们都从100开始(例如libavformat 55.1.100),而对于Libav,它们从0开始.因此,如果微<100,它是Libav,否则它是FFmpeg.要在运行时获取libavformat微版本,请在编译时使用avformat_version()&0xff或LIBAVFORMAT_VERSION_MICRO.