C/C++编程:linux上安装ffmpeg

Ubuntu

Ubuntu 中安装比较简单,因为包管理器中收纳了,直接用 apt 安装即可

sudo  apt install -y ffmpeg

如果安装时提示找不到对应的安装包试一下升级系统再重新安装

sudo apt-get update 

CentOS

由于 ffmpeg 是没有收入 yum 的,所以需要编译安装,会麻烦点。

wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2      #下载源文件
tar -jxv -f ffmpeg-4.2.2.tar.bz2                         #解压缩

cd ffmpeg-4.2.2/           #进入解压缩后的文件夹
./configure --enable-gpl --prefix=/usr/local/ffmpeg   #适配系统并指定安装的目录

报错:FFmpeg yasm/nasm not found or too old.Use --disable-yasm for a crippledbuild 是需要安装额外的 yasm 汇编编译器
原因:yasm是汇编编译器,ffmpeg为了提高效率使用了汇编指令,如MMX和SSE等。所以系统中未安装yasm时,就会报上面错误。
解决:

wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
sudo make install

安装 yasm 后重新编译安装

./configure --enable-gpl --prefix=/usr/local/ffmpeg  
make && make install

–enable-gpl 参数是为了安装后可以使用滤镜功能,如果不需要可以不加。(是 --enable-gpl,两个中划线 )

等待片刻后 ffmpeg 就被安装到 /usr/local/ffmpeg 目录下了。

测试程序:

#include <stdio.h>

#define __STDC_CONSTANT_MACROS

#ifdef _WIN32
#include <Windows.h>
//Windows
extern "C"
{
    
    
#include "libavformat/avformat.h"
};
#else
//Linux...
#ifdef __cplusplus
extern "C"
{
    
    
#endif
#include <libavformat/avformat.h>
#ifdef __cplusplus
};
#endif
#endif

int main()
{
    
    
    printf("%s\n", avcodec_configuration());
    return 0;
}

编译: gcc main.c pkg-config --cflags --libs libavformat libavutil libavcodec

而cmakelist.txt右怎么编写呢?

  • 有些CMake作为项目构建工具时,有一些库并没有提供cmake文件,往往提供的是pkg-config.pc文件,虽然可以在cmake中用include_directorieslink_directories来手动指定查找目录,但是这样写并不能保证跨平台,甚至同一个库在不同Linux发行版中的位置也不一样,这个时候最好的解决方法就是能够在 cmake 中(优雅地)使用pkg-config提供的信息。
    拿FFmpeg举例,这是一个纯C库,并且没有提供cmake配置文件,接下来我们要在 cmake 项目中使用 ffmpeg;
pkg-config --list-all | grep libav
libavformat                 libavformat - FFmpeg container format library
libavcodec                  libavcodec - FFmpeg codec library
libavfilter                 libavfilter - FFmpeg audio/video filtering library
libavdevice                 libavdevice - FFmpeg device handling library
libavresample               libavresample - Libav audio resampling library
libavutil                   libavutil - FFmpeg utility library

接下来我们在 CMakeLists.txt 中的相关位置添加如下语句:

find_package(PkgConfig REQUIRED)

pkg_check_modules(ffmpeg REQUIRED IMPORTED_TARGET libavcodec libavformat libavutil)

target_link_libraries(${
    
    PROJECT_NAME} PRIVATE PkgConfig::ffmpeg)

参考