1.FFmpeg编译

1.1.安装yasm

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

  1. sudo apt-get install yasm

1.2.下载FFmpeg

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

1.3.配置、编译FFMPEG

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

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

  1. ./configure --help

然后执行

  1. make
  2. make install

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

  1. .
  2. ├── bin
  3. ├── ffmpeg
  4. ├── ffprobe
  5. └── ffserver
  6. ├── include
  7. ├── libavcodec
  8. ├── libavdevice
  9. ├── libavfilter
  10. ├── libavformat
  11. ├── libavutil
  12. ├── libswresample
  13. └── libswscale
  14. ├── lib
  15. ├── libavcodec.so -> libavcodec.so.57.64.101
  16. ├── libavcodec.so.57 -> libavcodec.so.57.64.101
  17. ├── libavcodec.so.57.64.101
  18. ├── libavdevice.so -> libavdevice.so.57.1.100
  19. ├── libavdevice.so.57 -> libavdevice.so.57.1.100
  20. ├── libavdevice.so.57.1.100
  21. ├── libavfilter.so -> libavfilter.so.6.65.100
  22. ├── libavfilter.so.6 -> libavfilter.so.6.65.100
  23. ├── libavfilter.so.6.65.100
  24. ├── libavformat.so -> libavformat.so.57.56.101
  25. ├── libavformat.so.57 -> libavformat.so.57.56.101
  26. ├── libavformat.so.57.56.101
  27. ├── libavutil.so -> libavutil.so.55.34.101
  28. ├── libavutil.so.55 -> libavutil.so.55.34.101
  29. ├── libavutil.so.55.34.101
  30. ├── libswresample.so -> libswresample.so.2.3.100
  31. ├── libswresample.so.2 -> libswresample.so.2.3.100
  32. ├── libswresample.so.2.3.100
  33. ├── libswscale.so -> libswscale.so.4.2.100
  34. ├── libswscale.so.4 -> libswscale.so.4.2.100
  35. ├── libswscale.so.4.2.100
  36. └── pkgconfig
  37. └── share
  38. └── ffmpeg

2.使用FFMPEG

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

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

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

  1. ldd ffmpeg

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

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

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

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

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

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

3.测试程序

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

  1. #include <stdio.h>
  2.  
  3. #define __STDC_CONSTANT_MACROS
  4.  
  5. #ifdef __cplusplus
  6. extern "C"
  7. {
  8. #endif
  9. #include "libavcodec/avcodec.h"
  10. #include "libavformat/avformat.h"
  11. #include "libavfilter/avfilter.h"
  12. #ifdef __cplusplus
  13. };
  14. #endif
  15.  
  16. /**
  17. * AVFormat Support Information
  18. */
  19. char * avformatinfo(){
  20.  
  21. char *info=(char *)malloc(40000);
  22. memset(info,0,40000);
  23.  
  24. av_register_all();
  25.  
  26. AVInputFormat *if_temp = av_iformat_next(NULL);
  27. AVOutputFormat *of_temp = av_oformat_next(NULL);
  28. //Input
  29. while(if_temp!=NULL){
  30. sprintf(info, "%s[In ] %10s\n", info, if_temp->name);
  31. if_temp=if_temp->next;
  32. }
  33. //Output
  34. while (of_temp != NULL){
  35. sprintf(info, "%s[Out] %10s\n", info, of_temp->name);
  36. of_temp = of_temp->next;
  37. }
  38. return info;
  39. }
  40.  
  41. /**
  42. * AVCodec Support Information
  43. */
  44. char * avcodecinfo()
  45. {
  46. char *info=(char *)malloc(40000);
  47. memset(info,0,40000);
  48.  
  49. av_register_all();
  50.  
  51. AVCodec *c_temp = av_codec_next(NULL);
  52.  
  53. while(c_temp!=NULL){
  54. if (c_temp->decode!=NULL){
  55. sprintf(info, "%s[Dec]", info);
  56. }
  57. else{
  58. sprintf(info, "%s[Enc]", info);
  59. }
  60. switch (c_temp->type){
  61. case AVMEDIA_TYPE_VIDEO:
  62. sprintf(info, "%s[Video]", info);
  63. break;
  64. case AVMEDIA_TYPE_AUDIO:
  65. sprintf(info, "%s[Audio]", info);
  66. break;
  67. default:
  68. sprintf(info, "%s[Other]", info);
  69. break;
  70. }
  71.  
  72. sprintf(info, "%s %10s\n", info, c_temp->name);
  73.  
  74. c_temp=c_temp->next;
  75. }
  76. return info;
  77. }
  78.  
  79. /**
  80. * AVFilter Support Information
  81. */
  82. char * avfilterinfo()
  83. {
  84. char *info=(char *)malloc(40000);
  85. memset(info,0,40000);
  86.  
  87. avfilter_register_all();
  88.  
  89. AVFilter *f_temp = (AVFilter *)avfilter_next(NULL);
  90.  
  91. while (f_temp != NULL){
  92. sprintf(info, "%s[%15s]\n", info, f_temp->name);
  93. f_temp=f_temp->next;
  94. }
  95. return info;
  96. }
  97.  
  98. /**
  99. * Configuration Information
  100. */
  101. char * configurationinfo()
  102. {
  103. char *info=(char *)malloc(40000);
  104. memset(info,0,40000);
  105.  
  106. av_register_all();
  107.  
  108. sprintf(info, "%s\n", avcodec_configuration());
  109.  
  110. return info;
  111. }
  112.  
  113. int main(int argc, char* argv[])
  114. {
  115. char *infostr=NULL;
  116. infostr=configurationinfo();
  117. printf("\n<<Configuration>>\n%s",infostr);
  118. free(infostr);
  119.  
  120. infostr=avformatinfo();
  121. printf("\n<<AVFormat>>\n%s",infostr);
  122. free(infostr);
  123.  
  124. infostr=avcodecinfo();
  125. printf("\n<<AVCodec>>\n%s",infostr);
  126. free(infostr);
  127.  
  128. infostr=avfilterinfo();
  129. printf("\n<<AVFilter>>\n%s",infostr);
  130. free(infostr);
  131.  
  132. return 0;
  133. }

编译方法

  1. ~/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

  1. sudo apt-get install libasound2-dev

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

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

下载SDL2

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

编译SDL2

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

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

  1. ./configure --prefix=host --enable-shared --disable-static --disable-doc --enable-ffplay
  2. make
  3. 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. CF543A Writing Code

    题目描述 Programmers working on a large project have just received a task to write exactly m m m lines o ...

  2. 概念理解-异步IO

    #include <aio.h> /* 函数名 :int aio_write(struct aiocb *aiocbp) 参 数 :struct aiocb *aiocbp 返回值 :执行 ...

  3. Elastic Stack 简介

    一.ElasticSearch ElasticSearch 是一个基于 Apache Lucene 的开源搜索引擎.它通过RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单.不 ...

  4. jmeter基本组件介绍

    常用术语统一:元件-jmeter工具菜单的一个子菜单(功能)  组件-一组元件的集合.如http请求与取样器的的关系  jmeter测试计划要素: (1)脚本中测试计划只能有一个: (2)测试计划中至 ...

  5. [UWP]组合CompositionBrush并使用BlendEffect

    1. 什么是BlendEffect 上一篇文章介绍了CompositionLinearGradientBrush的基本用法, 这篇文章再结合BlendEffec介绍一些更复杂的玩法. Microsof ...

  6. ESP8266开发之旅 网络篇① 认识一下Arduino Core For ESP8266

        博主的 ESP8266开发之旅 专栏主要分为三个部分: 基础篇 网络篇 应用篇     从这一篇开始,博主将会带领各位读者在基础篇的基础上进入网络的世界.在此,博主认为各位读者已经具备以下前提 ...

  7. PSTAT 115 Homework4 课业解析

    PSTAT 115 Homework4 课业解析 题意: 蒙特卡洛采样之拒绝采样 解析: 给定一个概率分布p(z)=p~(z)/Zp,p~(z)已知,Zp为归一化常数,为未知数.对该分布进行拒绝采样, ...

  8. 获取用户地理位置.html

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. VMware问题--无法获得 VMCI 驱动程序的版本: 句柄无效

    关于VMware问题:无法获得 VMCI 驱动程序的版本: 句柄无效.驱动程序“vmci.sys”的版本不正确 问题截图: 解决 1.根据配置文件路径找到对应的.vmx文件: 2.用编辑器打开,找到v ...

  10. 大前端技术系列:TWA技术+TensorFlow.js => 集成原生和AI功能的app

    大前端技术系列:TWA技术+TensorFlow.js => 集成原生和AI功能的app ( 本文内容为melodyWxy原作,git地址:https://github.com/melodyWx ...