Mac环境下使用Clion编译测试运行Ffmpeg

本文详细介绍了如何在M1芯片的Mac上编译FFmpeg项目,包括使用特定的编译选项以适应M1架构,以及如何在Clion中创建C++或C项目,并使用CMakeLists.txt文件链接FFmpeg库。同时,提供了C++和C语言版本的示例代码来调用FFmpeg功能。
摘要由CSDN通过智能技术生成

一、编译项目

如果想基于FFmpeg开发的话,虽然可以使用文本进行开发,但是使用开发工具的话无疑更为方便,比如可以查看源码,并且调试也更为方便
首先从官网或者github下载源码
然后参考以下链接:
https://ffmpeg.org/doxygen/trunk/md_INSTALL.html
编译安装ffmpeg。这里面如果自己不熟悉的话不要自己创建额外的文件,比如c文件或者makefile文件,因为整个项目会一起编译,如果环境不对会出现错误
然后中间会把编译的库文件安装到 /usr/local/下面,需要进行授权,出现权限拒绝时候,执行类似于以下的命令进行授权
sudo chmod -R 777 /usr/local/share
或者执行sudo make install进行安装
这个默认安装路径可以在configure文件里面进行修改,打开文件后查找prefix_default="/usr/local", 然后将后面的路径修改为别的位置,然后重新执行configure命令进行配置,然后重新进行构建,重新编译即可。这个路径最好不要设置在ffmpeg源码下面。
以上的整个执行命令的步骤为:

  1. ./configure
  2. make
  3. make install

二、M1芯片编译方式

(该方案源自ChatGpt)
在苹果电脑上编译的是x86架构,这个在intel芯片上是没有问题的,但是在m1芯片上虽然能编译成功,但是实际使用的时候会出错。需要在编译时候指定架构才可以,所以修改编译方式为以下:

./configure --prefix=/usr/local --enable-shared --arch=arm64 --disable-x86asm

完整解决方案如下:

在 M1 芯片上编译 FFmpeg,你需要进行一些特定的设置和配置,以确保编译过程能够适配 M1 架构。以下是一些步骤:

  1. 安装适用于 M1 芯片的开发工具链:首先,你需要安装适用于 M1 芯片的开发工具链,如 Apple Silicon 版本的 Xcode 和 Command Line Tools。确保你的开发环境已更新到最新版本。

  2. 配置 FFmpeg:打开终端,并进入 FFmpeg 源代码目录。运行以下命令来配置编译选项:

 ./configure --prefix=/usr/local --enable-shared --arch=arm64 --disable-x86asm

这些选项将指定安装目录、启用共享库、设置目标架构为 arm64,并禁用 x86 汇编优化。你还可以根据需要添加其他选项。

  1. 编译和安装 FFmpeg:运行以下命令来进行编译和安装:
   make -j8
   sudo make install

这将使用 8 个线程进行编译,你可以根据自己的系统配置进行调整。sudo make install 命令将安装编译好的 FFmpeg 到系统目录。

  1. 验证编译结果:完成编译后,你可以运行一些 FFmpeg 的命令行工具来验证编译结果,确保它们在 M1 芯片上正常工作。

请注意,具体的步骤可能因你所使用的 FFmpeg 版本和配置选项而有所不同。在进行编译之前,最好阅读 FFmpeg 的官方文档或项目文档,以了解针对 M1 芯片的具体编译说明和要求。

三、导入到Clion中

先创建C++项目,C项目也行。使用CmakeList进行构建,使用Makefile构建也行。不过最好是用C语言来写,要不然把C代码转换成C++还是有点麻烦的。这里贴出两个版本:
这里解释一个概念,&表示内存引用,*表示内存地址,** 在有的时候表示动态数组,***有的时候表示指向动态数组的内存地址。
比如如下代码:

void testAddress(){
char **si; //定义一个动态数组
char ***ss = *si; //定义一个指向动态数组的指针
}

1. C++ 版本

CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.25)
project(ffmpegTest)

set(CMAKE_CXX_STANDARD 17)

# 以下路径是ffmpeg编译安装后的路径
set(FFMPEG_PATH /Users/ym/Work/CPlusPlusWorkSpack/FFmpegCompile/local)

include_directories(${FFMPEG_PATH}/include/) # 头文件搜索路径
link_directories(${FFMPEG_PATH}/lib/) # 动态链接库或静态链接库的搜索路径

add_executable(ffmpegTest main.cpp)

//以下是要关联的库
target_link_libraries(
        ffmpegTest //这是自己的执行的库,名字和上述定义的一致,下面是ffmpeg编译出的库
        avcodec
        avdevice
        avfilter
        avformat
        avutil
        swresample
        swscale
)

main.cpp 这里使用c++编写代码调用C语言代码

#include <iostream>
extern "C" {
    #include "libavcodec/avcodec.h"
    #include<libavdevice/avdevice.h>
}

int main() {
    std::cout << "avdevice_license-->" << avdevice_license() << std::endl;
    std::cout << avcodec_configuration();
    return 0;
}

2. C语言版本

CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.25)
project(FFmpegTestC C)

set(CMAKE_C_STANDARD 17)

# 以下路径是ffmpeg编译安装后的路径
set(FFMPEG_PATH /Users/ym/Work/CPlusPlusWorkSpack/FFmpegCompile/local)

include_directories(${FFMPEG_PATH}/include/) # 头文件搜索路径
link_directories(${FFMPEG_PATH}/lib/) # 动态链接库或静态链接库的搜索路径

add_executable(FFmpegTestC main.c)

target_link_libraries(
       FFmpegTestC
       avcodec
       avdevice
       avfilter
       avformat
       avutil
       swresample
       swscale
)

macin.c

#include <stdio.h>
#include "libavcodec/avcodec.h"
#include <libavdevice/avdevice.h>

void iterateMimeType(AVCodecDescriptor *desc){
    if (desc == NULL){
        return;
    }
    const char *const *const mime_types = desc->mime_types; //这是个数组类型
    if (mime_types == NULL){
        return;
    }
    char** current_str = mime_types;
    while (*current_str != NULL) {
        printf("类型:%s\n", *current_str);
        current_str++;
    }
}

void iterateCodec() {
    const AVCodecDescriptor *desc = NULL;
    const AVCodecDescriptor **codecs;
    unsigned nb_codecs = 0, i = 0;
    while ((desc = avcodec_descriptor_next(desc))) {//这个在最后一次会赋值为null
        nb_codecs++; //计算有多少个编码器
        enum AVCodecID avCodecId = desc->id;
        enum AVMediaType avCodecType = desc->type;
        const char *avCodecName = desc->name;
        const char *avCodecLongName = desc->long_name;
        iterateMimeType(desc);
    }
}

int main() {
    const char *license = avdevice_license();
    const char *config = avcodec_configuration();
    printf("avdevice_license-%s->\n", license);
//    printf("avcodec_configuration-%s->\n",config);
    iterateCodec();
    return 0;
}

四、参考链接:

  1. macOS clion ffmpeg 配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值