1.FFmpeg编译

1.1.安装yasm

这里我是直接通过ubuntu包安装的,当然也可以通过编译源码来安装。

sudo apt-get install yasm

1.2.下载FFmpeg

git clone https://git.ffmpeg.org/ffmpeg.git

1.3.配置、编译FFMPEG

./configure --prefix=host --enable-shared --disable-static --disable-doc 

关于FFMPEG的配置参数,我们可以通过下面命令来查看

./configure --help

然后执行

make
make install

就可以在host目录下找到我们需要的动态库和头文件了

.
├── bin
│ ├── ffmpeg
│ ├── ffprobe
│ └── ffserver
├── include
│ ├── libavcodec
│ ├── libavdevice
│ ├── libavfilter
│ ├── libavformat
│ ├── libavutil
│ ├── libswresample
│ └── libswscale
├── lib
│ ├── libavcodec.so -> libavcodec.so.57.64.101
│ ├── libavcodec.so.57 -> libavcodec.so.57.64.101
│ ├── libavcodec.so.57.64.101
│ ├── libavdevice.so -> libavdevice.so.57.1.100
│ ├── libavdevice.so.57 -> libavdevice.so.57.1.100
│ ├── libavdevice.so.57.1.100
│ ├── libavfilter.so -> libavfilter.so.6.65.100
│ ├── libavfilter.so.6 -> libavfilter.so.6.65.100
│ ├── libavfilter.so.6.65.100
│ ├── libavformat.so -> libavformat.so.57.56.101
│ ├── libavformat.so.57 -> libavformat.so.57.56.101
│ ├── libavformat.so.57.56.101
│ ├── libavutil.so -> libavutil.so.55.34.101
│ ├── libavutil.so.55 -> libavutil.so.55.34.101
│ ├── libavutil.so.55.34.101
│ ├── libswresample.so -> libswresample.so.2.3.100
│ ├── libswresample.so.2 -> libswresample.so.2.3.100
│ ├── libswresample.so.2.3.100
│ ├── libswscale.so -> libswscale.so.4.2.100
│ ├── libswscale.so.4 -> libswscale.so.4.2.100
│ ├── libswscale.so.4.2.100
│ └── pkgconfig
└── share
└── ffmpeg

2.使用FFMPEG

上面我们编译完了FFMPEG之后可以去运行以下bin目录下生成的可执行文件

~/tmp/ffmpeg/ffmpeg/host/bin$ ./ffmpeg
./ffmpeg: error while loading shared libraries: libavdevice.so.57: cannot open shared object file: No such file or directory

发现系统提示找不到动态库,可以用

ldd ffmpeg

来查看运行当前可执行文件需要哪些动态库

~/tmp/ffmpeg/ffmpeg/host/bin$ ldd ffmpeg
linux-vdso.so.1 => (0x00007fffcfeaf000)
libavdevice.so.57 => not found
libavfilter.so.6 => not found
libavformat.so.57 => not found
libavcodec.so.57 => not found
libswresample.so.2 => not found
libswscale.so.4 => not found
libavutil.so.55 => not found
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f41d6d9e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f41d6b7f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f41d67b9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f41d70c7000)

应该有很多人和我一样,不想编译FFMPEG之后还要动自己系统的环境,这时有一个简单的方法可以解决这个问题。就是在当前终端export一个环境变量。

~/tmp/ffmpeg/ffmpeg/host$ export LD_LIBRARY_PATH=lib/
~/tmp/ffmpeg/ffmpeg/host/bin$ export LD_LIBRARY_PATH=../lib/
~/tmp/ffmpeg/ffmpeg/host/bin$ ldd ffmpeg
linux-vdso.so.1 => (0x00007fff25150000)
libavdevice.so.57 => ../lib/libavdevice.so.57 (0x00007f7348cc8000)
libavfilter.so.6 => ../lib/libavfilter.so.6 (0x00007f73488e8000)
libavformat.so.57 => ../lib/libavformat.so.57 (0x00007f73484cc000)
libavcodec.so.57 => ../lib/libavcodec.so.57 (0x00007f7347034000)
libswresample.so.2 => ../lib/libswresample.so.2 (0x00007f7346e17000)
libswscale.so.4 => ../lib/libswscale.so.4 (0x00007f7346b8f000)
libavutil.so.55 => ../lib/libavutil.so.55 (0x00007f7346917000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f73465f1000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f73463d3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f734600d000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f7345dee000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7345be9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7348edb000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f73459e5000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f73457de000)

然后再去运行上面的可执行文件就可以了

~/tmp/ffmpeg/ffmpeg/host/bin$ ./ffmpeg
ffmpeg version n3.2.2-8-g64bb329 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
configuration: --prefix=host --enable-shared --disable-static --disable-doc
libavutil 55. 34.101 / 55. 34.101
libavcodec 57. 64.101 / 57. 64.101
libavformat 57. 56.101 / 57. 56.101
libavdevice 57. 1.100 / 57. 1.100
libavfilter 6. 65.100 / 6. 65.100
libswscale 4. 2.100 / 4. 2.100
libswresample 2. 3.100 / 2. 3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
Use -h to get full help or, even better, run 'man ffmpeg'

3.测试程序

程序可以打印出FFmpeg类库的基本信息,使用该程序通常可以验证FFmpeg是否正确的安装配置

#include <stdio.h>  

#define __STDC_CONSTANT_MACROS  

#ifdef __cplusplus
extern "C"
{
#endif
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
#ifdef __cplusplus
};
#endif /**
* AVFormat Support Information
*/
char * avformatinfo(){ char *info=(char *)malloc(40000);
memset(info,0,40000); av_register_all(); AVInputFormat *if_temp = av_iformat_next(NULL);
AVOutputFormat *of_temp = av_oformat_next(NULL);
//Input
while(if_temp!=NULL){
sprintf(info, "%s[In ] %10s\n", info, if_temp->name);
if_temp=if_temp->next;
}
//Output
while (of_temp != NULL){
sprintf(info, "%s[Out] %10s\n", info, of_temp->name);
of_temp = of_temp->next;
}
return info;
} /**
* AVCodec Support Information
*/
char * avcodecinfo()
{
char *info=(char *)malloc(40000);
memset(info,0,40000); av_register_all(); AVCodec *c_temp = av_codec_next(NULL); while(c_temp!=NULL){
if (c_temp->decode!=NULL){
sprintf(info, "%s[Dec]", info);
}
else{
sprintf(info, "%s[Enc]", info);
}
switch (c_temp->type){
case AVMEDIA_TYPE_VIDEO:
sprintf(info, "%s[Video]", info);
break;
case AVMEDIA_TYPE_AUDIO:
sprintf(info, "%s[Audio]", info);
break;
default:
sprintf(info, "%s[Other]", info);
break;
} sprintf(info, "%s %10s\n", info, c_temp->name); c_temp=c_temp->next;
}
return info;
} /**
* AVFilter Support Information
*/
char * avfilterinfo()
{
char *info=(char *)malloc(40000);
memset(info,0,40000); avfilter_register_all(); AVFilter *f_temp = (AVFilter *)avfilter_next(NULL); while (f_temp != NULL){
sprintf(info, "%s[%15s]\n", info, f_temp->name);
f_temp=f_temp->next;
}
return info;
} /**
* Configuration Information
*/
char * configurationinfo()
{
char *info=(char *)malloc(40000);
memset(info,0,40000); av_register_all(); sprintf(info, "%s\n", avcodec_configuration()); return info;
} int main(int argc, char* argv[])
{
char *infostr=NULL;
infostr=configurationinfo();
printf("\n<<Configuration>>\n%s",infostr);
free(infostr); infostr=avformatinfo();
printf("\n<<AVFormat>>\n%s",infostr);
free(infostr); infostr=avcodecinfo();
printf("\n<<AVCodec>>\n%s",infostr);
free(infostr); infostr=avfilterinfo();
printf("\n<<AVFilter>>\n%s",infostr);
free(infostr); return 0;
}

编译方法

~/tmp/ffmpeg/ffmpeg/host/test$ g++ -I ../include/ hello_world.cpp -o hello_world -L../lib/ -lavcodec -lavdevice -lavfilter -lavformat -lavutil

-I 指定头文件的搜索路径, -L指定动态库的搜索路径 -l指定要链接的动态库

2017/4/22:

这样编译出来的bin文件里面没有ffplay如果要生成ffplay需要下面两个步骤

1.编译SDL2

安装 libasound2-dev

sudo apt-get install libasound2-dev

否则可能会报下面的错误,不能播放声音

SDL_OpenAudio (2 channels, 32000 Hz): No such audio device
SDL_OpenAudio (1 channels, 32000 Hz): No such audio device
No more combinations to try, audio open failed

下载SDL2

http://www.libsdl.org/release/SDL2-2.0.5.zip

编译SDL2

unzip SDL2-2.0.5.zip
cd SDL2-2.0.5/
./configure --prefix=/usr/local/
make
sudo make install
2.重新配置编译FFMPEG

在执行./configure是添加 --enable-ffplay

./configure --prefix=host --enable-shared --disable-static --disable-doc --enable-ffplay
make
make install

这样就会在host/bin目录下生成ffplay了

 
 

ffmpeg 编译安装的更多相关文章

  1. linxu ffmpeg 编译安装

    1.下载ffmpeg. 下载网址:http://www.ffmpeg.org/download.html 2.解压缩 tar -zxvf ffmpeg-2.0.1.tar.gz 3.配置,生成Make ...

  2. FFMPEG系列一:Mac下FFMPEG编译安装配置及使用例子

    系统环境:10.13以前系统版本,没有升级到macOS High Sierra.正常情况是直接输入brew install ffmpeg即可安装ffmpeg,但是该过程还是有一些坑需要填. 一.mac ...

  3. [CentOS_7.4]Linux编译安装ffmpeg

    [CentOS_7.4]Linux编译安装ffmpeg   安装过程: 下载安装源,配置,编译,安装,设置环境变量. # wget http://www.ffmpeg.org/releases/ffm ...

  4. ffmpeg源码编译安装(Compile ffmpeg with source) Part 2 : 扩展安装

    在Ubuntu,Debian,Mint上编译ffmpeg 本文主要为在Ubuntu,Debian和Mint上编译安装ffmpeg和库文件以及一些扩展的编解码器.当然这与从源中安装无关. 请首先看一下通 ...

  5. ffmpeg源码编译安装(Compile ffmpeg with source) Part 1 : 通用部分

    本页内容包含了在Unix/Linux中用源码包编译的通用的结构 可能不仅仅适用于ffmpeg 为啥使用源码包编译 编译源码可以扩展功能, 实现相对于自己平台的最优化, 还可以自定义的修改 概述 大部分 ...

  6. Windows下编译安装 FFmpeg

    在Linux/Mac下编译 ffmpeg是非常方便的.但要在 Windows下编译 ffmpeg还真要花点时间.以下就是在 Windowns下编译ffmpeg的步骤: 一.安装Cygwin 在wind ...

  7. Linux---centos编译安装ffmpeg

    环境 系统环境:CentOS release 6.7 (Final) 需求 编译安装ffmpeg 获取依赖 安装依赖包 yum install -y autoconf automake cmake f ...

  8. linux ffmpeg编译配置安装详解

    http://www.111cn.net/sys/linux/53039.htm ffmpeg是一开源的可跨平台使用的一个图形处理插件,这可以进行录制.转换以及流化音视频,同时可以对视频进行截图,下面 ...

  9. CentOS-6.4 编译安装ffmpeg加x264以及rtmp

    CentOS 6.4-64位下编译ffmpeg几个简单步骤: 1.编译前环境准备: 2.下载源码: 3.编译,安装: ----------------------------------------- ...

随机推荐

  1. vue使用 封装websocket心跳包

    ---恢复内容开始--- 这套代码可以拿过去直接用 一些注意我会在下面代码中加上注释: 谢谢支持 核心代码 //这里需要引入vuex import store from './store'; let ...

  2. 开普勒云平台:如何配置gitlab与Jenkins

    一.Kplcloud是什么? kplcloud是一个基于Kubernetes的轻量级PaaS平台,通过可视化的界面对应用进行管理,降低应用容器化的对度,从而减少应用容器化的时间成本. Kplcloud ...

  3. Arduino学习笔记⑦ EEPROM断电保存数据

    1.前言     EEPROM,叫做电可擦可编程可读寄存器(是不是觉得好官方,不知道是什么鬼?反正我也一脸懵逼),只需要知道这是一种断电后数据不会丢失的存储设备,可以用来应对需要做记录做保存的场合.简 ...

  4. 无情的Java 8 之 Stream和lambda表达式篇

    不好意思,最近刷小视频刷的有点上头 看到这图就不自觉的要来一句:"卧槽,无情" 好了,我要开始正经了 JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样 ...

  5. The usage of Markdown---目录

    更新时间:2019.09.14   当我们编辑的内容比较多时,通常要生成目录来进行页内跳转.除了之前提到过的页内跳转链接的方法,还有一种方法--目录树,能够自动生产目录,大大减少工作量. tip1: ...

  6. Java IO_003.Reader与Writer--字符流以及编码对数据的操作(读取与写入)

    Java IO之Reader与Writer对象常用操作(包含了编码问题的处理) 涉及到文件(非文件夹)内容的操作,如果是纯文本的情况下,除了要用到File(见之前文章),另外就必须用到字符输入流或字符 ...

  7. PHP的陷阱

    PHP的陷阱 写代码的时候有个疑惑,那就是数组下标不存在的时候就会挂掉Undefined Index XXXX,这是对的,但是有时候他就不报错,这又是矛盾的. 请看下面的例子: $json_raw = ...

  8. PhpStorm10和Apache24配置多项目开发环境

    PhpStorm10和Apache24配置多项目开发环境 Apache配置 httpd.conf LoadModule vhost_alias_module modules/mod_vhost_ali ...

  9. day19作业

    1.什么是对象?什么是类? ​ 对象是特征和功能的结合体 ​ 类是一系列对象相同的特征和技能的集合体 2.绑定方法的有什么特点 ​ 绑定方式是由对象来调用类内部的函数,特点是会把对象当作第一个参数传入 ...

  10. Spring(三)面向切面编程(AOP)

    在直系学长曾经的指导下,参考了直系学长的博客(https://www.cnblogs.com/WellHold/p/6655769.html)学习Spring的另一个核心概念--面向切片编程,即AOP ...