Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在CMake中检测ffmpeg与libav?_Ffmpeg_Cmake - Fatal编程技术网

如何在CMake中检测ffmpeg与libav?

如何在CMake中检测ffmpeg与libav?,ffmpeg,cmake,Ffmpeg,Cmake,我的项目使用libavformat连接到rtsp://url。设置套接字超时并在出错时重新连接是很重要的。不幸的是,stimeoutopen选项仅存在于(尤其是其libavformat版本>=55.1.100)中,而不存在于竞争项目(任何版本)中。我想支持的一些系统(比如Raspbian Jessie)仍然与libav捆绑在一起 所以,我认为我的最佳选择是使用cmake检测是否有合适的版本,如果没有,则在树中安装ffmpeg。我想我应该可以通过以下方式做到这一点: pkg_check_modul

我的项目使用libavformat连接到
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