对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库。
不过考虑到刚开始仅仅调用FFmpeg的API,不会马上去改FFmpeg的源码,因此只要给系统安装编译好的FFmpeg动态库,即可着手编写简单的FFmpeg程序。比如这个网站https://github.com/BtbN/FFmpeg-Builds/releases提供了已经编译通过的FFmpeg开发包,囊括Linux、Windows等系统环境的开发版本。对该网站提供的Linux版FFmpeg安装包而言,需要事先安装不低于2.22版本的glibc库,否则编译FFmpeg程序会报错“undefined reference to `_ZGVdN4vv_pow@GLIBC_2.22'”。下面介绍在Linux系统安装已编译的FFmpeg详细步骤。

一、安装glibc

1、到这个网址下载2.23版本的glibc源码包http://ftp.gnu.org/gnu/glibc/。注意:虽然要求glibc版本不低于2.22,但是不宜安装过高版本的glibc,因为较高版本的glibc依赖于python,去整python环境又得费一番功夫,所以弄个比2.22稍高一点的2.23版就够了,也就是下载这个压缩包http://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gz
2、先解压glibc源码包,再进入glibc源码目录,然后创建build目录并进入该目录,也就是依次执行以下命令:

tar zxvf glibc-2.23.tar.gz
cd glibc-2.23
mkdir build
cd build

3、在build目录下依次执行以下命令配置、编译与安装glibc:

../configure --prefix=/usr
make
make install

安装成功后,会在/usr/lib64目录下找到最新的libc.so(还有libc.so.6和libc-2.23.so)和libmvec.so(还有libmvec.so.1和libmvec-2.23.so)等库文件。

二、安装FFmpeg

1、到这个网址下载Linux环境编译好的FFmpeg安装包https://github.com/BtbN/FFmpeg-Builds/releases,比如ffmpeg-master-latest-linux64-gpl-shared.tar.xz。
2、把下载好的FFmpeg安装包解压到/usr/local/ffmpeg目录,也就是依次执行以下命令:

cd /usr/local
tar xvf ffmpeg-master-latest-linux64-gpl-shared.tar.xz
mv ffmpeg-master-latest-linux64-gpl-shared ffmpeg

3、输入cd命令回到当前用户的初始目录,使用vi打开该目录下的.bash_profile,也就是依次执行以下命令:

cd
vi .bash_profile

4、把光标移动到文件末尾,按下a键进入编辑模式,然后在文件末尾添加下面四行环境变量配置:

PATH=$PATH:/usr/local/ffmpeg/bin
export PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ffmpeg/lib
export LD_LIBRARY_PATH

接着保存并退出文件,也就是先按下Esc键退出编辑模式,再按下冒号键,接着输入wq再按回车键,即可完成修改操作。

5、执行以下命令加载最新的环境变量:

source .bash_profile

接着运行下面的环境变量查看命令:

env | grep PATH

发现控制台回显的PATH串包含/usr/local/ffmpeg/bin,同时LD_LIBRARY_PATH串包含/usr/local/ffmpeg/lib,说明FFmpeg的bin目录和lib目录都加载进了环境变量。

三、编写测试程序

1、创建C代码文件名叫hello.c,填入下面的代码内容:

#include <libavutil/avutil.h>

int main(int argc, char* argv[]) {
av_log(NULL, AV_LOG_INFO, "hello world\n");
}

2、保存并退出该文件,执行以下命令编译hello.c:

gcc hello.c -o hello -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm

3、运行编译好的hello程序,也就是执行以下命令:

./hello

发现控制台回显日志信息“hello world”,表示测试程序运行正常,说明FFmpeg开发环境已经成功搭建。

4、刚才的测试程序hello.c采用C语言编写,并且使用gcc编译。若要采用C++编程的话,则需改成下面的hello.cpp代码:

#include <iostream>

// 因为FFmpeg源码使用C语言编写,所以在C++代码中调用FFmpeg的话,要使用标记“extern "C"{……}”把FFmpeg的头文件包含进来
extern "C"
{
#include <libavutil/avutil.h>
} int main(int argc, char* argv[]) {
av_log(NULL, AV_LOG_INFO, "hello world\n");
}

鉴于C++代码采用g++编译,于是hello.cpp的编译命令变成下面这样:

g++ hello.cpp -o hello -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/bin -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm

编译完毕,同样生成名叫hello的可执行程序,如此就实现了C++代码集成FFmpeg函数的目标了。

FFmpeg开发笔记(一)搭建Linux系统的开发环境的更多相关文章

  1. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  2. 《Linux就该这么学》培训笔记_ch00_认识Linux系统和红帽认证

    <Linux就该这么学>培训笔记_ch00_认识Linux系统和红帽认证 文章最后会post上书本的笔记照片. 文章主要内容: 认识开源 Linux系统的种类及优势特性 认识红帽系统及红帽 ...

  3. tiny4412学习(一)之从零搭建linux系统(烧写uboot、内核进emmc+uboot启动内核)【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74080109 版权声明:本文为博主原创文章,转载请注明http://blog.c ...

  4. 嵌入式linux系统应用开发

    关于嵌入式系统   平时大家说的嵌入式其实范围比较广的,是一种软硬件可裁剪,以应用为中心开发的专用系统,硬件平台可以是单片机,或者以ARM系列的处理器.单片机一般直接裸奔程序,不过现在有了好多基于单片 ...

  5. 【嵌入式】安装Linux系统到开发板

    一.开发板基本介绍 Flash --相当于硬盘 RAM -- 内存 Micro USB或232串口 连电脑 USB 接口连摄像头 启动方式 选择开关 :SD卡启动或NAND FLASH 启动 USB转 ...

  6. Linux系统下修改环境变量PATH路径的三种方法

    这里介绍Linux的知识,比如把/etc/apache/bin目录添加到PATH中有三种方法,看完之后你将学会Linux系统下如何修改环境变量PATH路径,需要的朋友可以参考下 电脑中必不可少的就是操 ...

  7. 阿里云服务器部署php的laravel项目,在阿里云买ECS 搭建 Linux+Nginx+Mysql+PHP环境的

    在阿里云买ECS的时候选择自己习惯的镜像系统,我一般都是使用Linux Ubuntu,所以,以下的配置都是在Ubuntu 14.04稳定支持版的环境中搭建Linux+Nginx+Mysql+PHP环境 ...

  8. CentOS(六)--Linux系统的网络环境配置

    Linux系统下的网络环境配置,Linux.Unix就是网络的世界,所以在Linux系统中如何配置网络环境变量是至关重要的,这里将会给出3种Linux系统下网络环境配置的方法! 在配置网络环境之前,首 ...

  9. OpenCV2学习笔记01:Linux下OpenCV开发环境的搭建

    个人已经厌倦了Windows下的开发方式,于是决定转到Linux平台上来,当然我也知道这个转变会很艰辛,但是我还是要坚持.所以,后面的所有开发我都会基于Linux和Qt,先从开发环境的搭建开始做起,当 ...

  10. Linux系统Go开发环境搭建

    Go 语言是由谷歌的科学家开发的,并开源的新语言,被誉为"21世纪的C语言",它的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得 ...

随机推荐

  1. C语言的导数和积分

    用C进行导数和积分的运算 进行求导 设一个dx,利用f(x)-f(x-dx)/dx或f(x)-f(x+dx)/dx进行计算. float qd(float x) { float dx=0.01,y; ...

  2. 2020.11.24 javaScript匿名函数的使用

    参考链接:http://www.voidcn.com/article/p-ngxxuegm-bmv.html 匿名函数: 函数表达式中创建的函数叫做匿名函数,也就是没有函数名的函数. 自执行函数: 创 ...

  3. [Unity移动端]Mono与IL2Cpp

    参考链接: https://blog.csdn.net/linxinfa/article/details/87358809 https://blog.csdn.net/Aison_/article/d ...

  4. Windows软件堆栈溢出(stack overflow)的一些解决方法

    欢迎访问我的个人博客:xie-kang.com 原文地址 Windows平台下,有三种方法调整堆栈大小(适用于MSVC编译器): 1)添加编译参数:/F size  #其中size的单位是byte可设 ...

  5. MongoRepository查询数据常用语法

    安装 查看mongo可用版本 docker search mongo 安装指定版本的mogo或者拉取最新版本的镜像 docker pull mongo:latest 或者官网下载安装包 https:/ ...

  6. 一文明白:JavaScript异步编程

    同步和异步 JS是单线程 JavaScript语言的一大特点是单线程,同一时间只能做一件事 (单线程的JS 就是一个傻子,脑子一根筋,做着当前的这件事情,没有完成之前,绝对不会做下一件事情) 当然,这 ...

  7. Android笔记--如何在Android studio里面打开数据库

    具体操作 可参考这篇(更为详细): https://www.cnblogs.com/liuzijin/p/17029231.html 1.找到界面内的Device File Explorer 这里找可 ...

  8. 可靠消息最终一致性【本地消息表、RocketMQ 事务消息方案】

    更多内容,前往IT-BLOG 一.可靠消息最终一致性事务概述 可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理事务成功,此方案强调 ...

  9. odoo 开发入门教程系列-模型和基本字段

    模型和基本字段 在上一章的末尾,我们创建一个odoo模块.然而,此时它仍然是一个空壳,不允许我们存储任何数据.在我们的房地产模块中,我们希望将与房地产相关的信息(名称(name).描述(descrip ...

  10. JMM知识点总结

    JMM知识点总结 一.什么是JMM? 不知道大家在学习的过程有没有思考过这两个问题 为什么说java是跨平台语言 导致并发问题的原因是什么 第一个问题,我是这么理解的,代码运行本质上是将我们写的语言转 ...