如何在CMake中检测ffmpeg与libav?
我的项目使用libavformat连接到如何在CMake中检测ffmpeg与libav?,ffmpeg,cmake,Ffmpeg,Cmake,我的项目使用libavformat连接到rtsp://url。设置套接字超时并在出错时重新连接是很重要的。不幸的是,stimeoutopen选项仅存在于(尤其是其libavformat版本>=55.1.100)中,而不存在于竞争项目(任何版本)中。我想支持的一些系统(比如Raspbian Jessie)仍然与libav捆绑在一起 所以,我认为我的最佳选择是使用cmake检测是否有合适的版本,如果没有,则在树中安装ffmpeg。我想我应该可以通过以下方式做到这一点: pkg_check_modul
rtsp://
url。设置套接字超时并在出错时重新连接是很重要的。不幸的是,stimeout
open选项仅存在于(尤其是其libavformat版本>=55.1.100)中,而不存在于竞争项目(任何版本)中。我想支持的一些系统(比如Raspbian Jessie)仍然与libav捆绑在一起
所以,我认为我的最佳选择是使用cmake检测是否有合适的版本,如果没有,则在树中安装ffmpeg。我想我应该可以通过以下方式做到这一点:
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和ffmpeg。我在pkgconfig文件或
libavformat/version.h
中没有看到任何东西来区分它们。他们使用的版本号似乎重叠。对于我来说,如何以编程的方式区分差异一点也不明显,更不用说使用一个不奇怪的cmake规则了。有什么想法吗?要具体回答您的问题,请使用以下代码:
#include <stdio.h>
#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;
}
对于您的另一个问题,可以通过查看库的微版本来检测Libav与FFmpeg。对于FFmpeg,它们都从100开始(例如libavformat 55.1.100),而对于Libav,它们从0开始。因此,如果micro<100,则为Libav,否则为FFmpeg。要在运行时获取libavformat micro版本,请在编译时使用&0xff。要具体回答您的问题,请使用以下代码:
#include <stdio.h>
#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;
}
对于您的另一个问题,可以通过查看库的微版本来检测Libav与FFmpeg。对于FFmpeg,它们都从100开始(例如libavformat 55.1.100),而对于Libav,它们从0开始。因此,如果micro<100,则为Libav,否则为FFmpeg。若要在运行时获取libavformat micro版本,请使用&0xff或在编译时使用。您可以运行
ffmpeg
并在那里使用stimeout
,查看它是否支持它。@arrow我不确定我使用的库是否与ffmpeg使用的库相同。我想可靠地检测我实际使用的东西。我想一种可能是编写一个程序,调用avformat\u open\u input
,并在选项
dict之后仍保留刺激时返回错误(意味着它被忽略)。它可能会使用一些伪造的URL,这些URL总是会很快失败,比如“可能”rtsp://0.0.0.0:0/". 我猜cmake有这样的构造来做类似的事情。或者更好,通过查看添加了这个选项的rtsp.c补丁,我认为不可能通过编程来检查它的存在。如果我弄错了,那么是的,您可以使用检查\u c\u source\u runs
。您可以运行ffmpeg
并在那里使用stimeout
来查看它是否支持它。@arrow我不确定我使用的库是否与ffmpeg使用的库相同。我想可靠地检测我实际使用的东西。我想一种可能是编写一个程序,调用avformat\u open\u input
,并在选项
dict之后仍保留刺激时返回错误(意味着它被忽略)。它可能会使用一些伪造的URL,这些URL总是会很快失败,比如“可能”rtsp://0.0.0.0:0/". 我猜cmake有这样的构造来做类似的事情。或者更好,通过查看添加了这个选项的rtsp.c补丁,我认为不可能通过编程来检查它的存在。如果我错了,那么是的,您可以使用check\u c\u source\u runs
。