FFmpeg在Linux下编译使用
文章转自:http://www.cnblogs.com/CoderTian/p/6655568.html
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在Linux下编译使用的更多相关文章
- FFmpeg之Linux下编译与调试
注:下面的一切都是在 root 模式下进行的,可以不再 root 模式下进行 1. 安装linux的基础环境 基础环境就是编译代码的基础库,Ubuntu联网安装软件很简单,一个语句即可搞定,这里列出语 ...
- FFmpeg在Linux下安装编译过程
转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52402759 今天介绍下FFmpeg在Linux下 ...
- linux下编译ffmpeg 引入外部库x264
Found no assembler Minimum version is nasm-2.13 If you really want to compile without asm, configure ...
- FFmpeg在Linux下搭建 ***
今天介绍下FFmpeg在Linux下安装编译过程,总体过程比较顺利,就是在ffmpeg等的时间稍长点,仅当记录. 关于FFmpeg FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采 ...
- linux下编译gcc6.2.0
linux下编译gcc6.2.0 在archlinx的下gcc已经更新到6.2.1了,win10的WSL下还是gcc4.8.官方源没有比较新的版本,于是自己编译使用. GCC6的几个新特性 GCC 6 ...
- LINUX下编译安装PHP各种报错大集合
本文为大家整理汇总了一些linux下编译安装php各种报错大集合 ,感兴趣的同学参考下. nginx1.6.2-mysql5.5.32二进制,php安装报错解决: 123456 [root@clien ...
- linux下编译安装vim7.4并安装clang_complete插件
linux下编译安装vim7.4并安装clang_complete插件 因为debian里软件仓库中下载安装的vim是不支持python写的插件的(可以打开vim,在命令模式先输入:py测试一下),导 ...
- linux下编译出现空间不足解决办法
linux下编译出现空间不足解决办法 编译内核出现问题: AS .tmp_kallsyms1.o .tmp_kallsyms1.S:2: fatal error: when writing ...
- linux下编译安装curl
linux下编译安装curl 1.下载curl git clone https://github.com/curl/curl.git 2.在curl目录下生成configure文件 ./buldcon ...
随机推荐
- 微信小程序背景音频播放分享功能
如果正常背景音频播放的话,只能跳转到自己对应的微信小程序,无法分享朋友圈,我们需要设置分享朋友圈,需要调用一个API 音频背景播放 注意:背景播放在锁屏后播放只支持IOS端,安卓端虽然可以播放,但是锁 ...
- Linq 分组(group by)求和(sum)并且按照分隔符(join)分割列数据
转载:http://www.cnblogs.com/zq281660880/archive/2012/09/26/2704836.html 今天在使用linq处理一下需求时碰到一点小问题,特此记录. ...
- Skip-External-Locking – MySQL性能参数详解
MySQL的配置文件my.cnf中默认存在一行skip-external-locking的参数,即“跳过外部锁定”.根据MySQL开发网站的官方解释,External-locking用于多进程条件下为 ...
- mount 和 umount 命令
参考:http://man.chinaunix.net/linux/mandrake/101/zh_cn/Command-Line.html/fs-and-mntpoints-mount.html 现 ...
- 使用cwrsync做服务器文件夹同步
首先要下载cwRsync的服务端和客户端软件(4.05免费版),下载地址如下: https://www.itefix.no/i2/cwrsync 具体的配置过程和遇到的问题可参考: http://ww ...
- js复制兼容:ZeroClipboard复制到剪切板(支持IE、FF、Chrome)
注意:ZeroClipboard在本地测试无法直接使用,必须在服务器上测试,如http://localhost... 准备:ZeroClipboard.swf 和 ZeroClipboard.js 小 ...
- 周赛 POJ 3934 Queue
Description Linda is a teacher in ACM kindergarten. She is in charge of n kids. Because the dinning ...
- Qt控件中的属性sizePolicy说明
1. Fixed: 大小不能改变 2. Minimum: 已经是最小, 不能再被缩小, 但能放大. 3. Maximum: 已经是最大, 不能再被放大, 但能缩小. 4. Preferred: 控件 ...
- 1)Linux程序设计入门--基础知识
)Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makef ...
- Nginx安装及配置文件解释
安装nginx,还是在mac上面用brew比较方便. 首先,brew install nginx,提示改权限 sudo chown -R $(whoami) /usr/local 然后brew ins ...