设为首页 收藏本站
查看: 1387|回复: 0

[经验分享] FFmpeg在Linux下编译使用

[复制链接]
累计签到:4 天
连续签到:1 天
发表于 2017-6-22 07:28:40 | 显示全部楼层 |阅读模式
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了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-386629-1-1.html 上篇帖子: 20169217 2016-2017-2 《网络攻防实践》第五周学习总结 下篇帖子: Openstack Core Service
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表