ffmpeg - 如何在 CMake 中检测 ffmpeg 与 libav?

标签 ffmpeg cmake

我的项目使用 libavformat 连接到 rtsp://网址。设置套接字超时并在错误时重新连接很重要。不幸的是,stimeout开放选项只存在于 ffmpeg (特别是它的 libavformat 版本 >= 55.1.100),而不是竞争项目 libav (任何版本)。并且我想支持的一些系统(例如 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 vs 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;
}

这可以进行运行时检测,它的工作原理如下:
bash-3.2$ /tmp/test hi
0x0
bash-3.2$ /tmp/test stimeout
0x103420100

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

关于ffmpeg - 如何在 CMake 中检测 ffmpeg 与 libav?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34350589/

相关文章:

windows - 为什么我的 mp4 文件的音频不同步

c++ - 编译 cpp 文件时出错 (ros)

Linux 上的 CMake : "target platform does not support dynamic linking"

makefile - 如何指定./configure的参数 '--includedir'和 '--libdir'给cmake

c# - 使用 FFMPEG(c# 应用程序)向视频添加文本

video - 没有这样的过滤器 : 'drawtext'

video - 查找 MJPEG 视频的特定帧是否比查找 h.264 文件更快?

ffmpeg.exe 在 3gp 文件转换 flv 时不起作用

gcc - 使用 cmake 处理 header 依赖项

c++ - CMake - visual studio 2008 的 fatal error