如何在CMake中检测到ffmpeg vs libav?

时间:2015-12-18 07:38:08

标签: ffmpeg cmake

我的项目使用libavformat连接到rtsp://个网址。设置套接字超时并在出错时重新连接非常重要。不幸的是,stimeout打开选项只存在于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规则。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

要专门回答您的问题,请使用以下代码:

#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;
}

这可以进行运行时检测,以及它的工作原理:

bash-3.2$ /tmp/test hi
0x0
bash-3.2$ /tmp/test stimeout
0x103420100

对于您的其他问题,可以通过查看库微版本来检测Libav与FFmpeg。对于FFmpeg,它们都从100开始(例如libavformat 55.1.100),而对于Libav,它们从0开始。所以如果微&lt; 100,它的Libav,否则它是FFmpeg。要在运行时获得libavformat微版本,请使用avformat_version()&amp; 0xff,或编译时LIBAVFORMAT_VERSION_MICRO