一、编译项目
如果想基于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源码下面。
以上的整个执行命令的步骤为:
./configure
make
make install
二、M1芯片编译方式
(该方案源自ChatGpt)
在苹果电脑上编译的是x86架构,这个在intel芯片上是没有问题的,但是在m1芯片上虽然能编译成功,但是实际使用的时候会出错。需要在编译时候指定架构才可以,所以修改编译方式为以下:
./configure --prefix=/usr/local --enable-shared --arch=arm64 --disable-x86asm
完整解决方案如下:
在 M1 芯片上编译 FFmpeg,你需要进行一些特定的设置和配置,以确保编译过程能够适配 M1 架构。以下是一些步骤:
-
安装适用于 M1 芯片的开发工具链:首先,你需要安装适用于 M1 芯片的开发工具链,如 Apple Silicon 版本的 Xcode 和 Command Line Tools。确保你的开发环境已更新到最新版本。
-
配置 FFmpeg:打开终端,并进入 FFmpeg 源代码目录。运行以下命令来配置编译选项:
./configure --prefix=/usr/local --enable-shared --arch=arm64 --disable-x86asm
这些选项将指定安装目录、启用共享库、设置目标架构为 arm64,并禁用 x86 汇编优化。你还可以根据需要添加其他选项。
- 编译和安装 FFmpeg:运行以下命令来进行编译和安装:
make -j8
sudo make install
这将使用 8 个线程进行编译,你可以根据自己的系统配置进行调整。sudo make install
命令将安装编译好的 FFmpeg 到系统目录。
- 验证编译结果:完成编译后,你可以运行一些 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;
}