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 foundlibavfilter.so.6 => not foundlibavformat.so.57 => not foundlibavcodec.so.57 => not foundlibswresample.so.2 => not foundlibswscale.so.4 => not foundlibavutil.so.55 => not foundlibm.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 developersbuilt with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)configuration: --prefix=host --enable-shared --disable-static --disable-doclibavutil      55. 34.101 / 55. 34.101libavcodec     57. 64.101 / 57. 64.101libavformat    57. 56.101 / 57. 56.101libavdevice    57.  1.100 / 57.  1.100libavfilter     6. 65.100 /  6. 65.100libswscale      4.  2.100 /  4.  2.100libswresample   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了

2018/9/14:

ffplay 播放yuv视频

ffplay -pixel_format yuva444p10le -video_size 1920x1080 test.yuv

2018/10/22:

编译debug版ffmpeg

./configure --enable-debug --enable-gpl --disable-optimizations --enable-shared --enable-static --enable-ffplay --disable-x86asm --prefix=host

调试ffmpeg时,因为make install拷贝到prefix目录的动态库是不带调试信息的,可以在/etc/ld.so.conf.d目录下添加ffmpeg.conf文件然后运行sudo ldconfig

/home/cent/source/ffmpeg/libavcodec
/home/cent/source/ffmpeg/libavdevice
/home/cent/source/ffmpeg/libavfilter
/home/cent/source/ffmpeg/libavformat
/home/cent/source/ffmpeg/libavresample
/home/cent/source/ffmpeg/libavutil
/home/cent/source/ffmpeg/libpostproc
/home/cent/source/ffmpeg/libswresample
/home/cent/source/ffmpeg/libswscale

转载于:https://www.cnblogs.com/CoderTian/p/6655568.html

FFmpeg在Linux下编译使用相关推荐

  1. linux编译ffmpeg.exe,linux下编译FFmpeg

    linux下编译FFmpeg 2020年01月11日 阅读数:12 这篇文章主要向大家介绍linux下编译FFmpeg,主要内容包括基础应用.实用技巧.原理机制等方面,希望对大家有所帮助. 1.首先获 ...

  2. LINUX 下编译 ffmpeg

    转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52402759 今天介绍下FFmpeg在Linux下 ...

  3. FFmpeg在Linux下搭建

    今天介绍下FFmpeg在Linux下安装编译过程,总体过程比较顺利,就是在ffmpeg等的时间稍长点,仅当记录. 关于FFmpeg FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采 ...

  4. FFmpeg在Linux下搭建 ***

    今天介绍下FFmpeg在Linux下安装编译过程,总体过程比较顺利,就是在ffmpeg等的时间稍长点,仅当记录. 关于FFmpeg FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采 ...

  5. 在Ubuntu18.04安装GMT-6.1.1(在 Linux 下编译 GMT 源代码)

    参考:GMT中文社区 写本文的目的:参考了CSDN上面许多安装GMT方法但是安装过程出现了各种问题,可能因为下载了官网的最新版本,而CSDN都是老版的安装方法有些地方不适用,走了好多弯路.后来才发现G ...

  6. linux 保存编译log,(转)Linux下编译安装log4cxx

    一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. 第一步安装apr-1.3.8,顺序不能错,它必须首 ...

  7. linux下编译make文件报错“/bin/bash^M: 坏的解释器,使用grep快速定位代码位置

    一.linux下编译make文件报错"/bin/bash^M: 坏的解释器 参考文章:http://blog.csdn.net/liuqiyao_01/article/details/415 ...

  8. 一份简单的在 Linux下编译及调试 C 代码的指南

    摘要: 一份简单的在 Linux下编译及调试 C 代码的指南 对于Linux下的C程序员来说,几乎天天都会和Linux打交道.但在很多人的眼中,Linux是一个易用性极差.靠命令驱动的操作系统,根本无 ...

  9. linux下软件编译终止,[2018年最新整理]linux下编译运行程序命令大全.ppt

    [2018年最新整理]linux下编译运行程序命令大全 1. 项目课题引入 2. Vi编辑器的使用方法 3. Linux中C语言程序的编辑 4. Linux中C语言程序的运行 5. 现场演示案例 课题 ...

最新文章

  1. ABAP 如何实现屏幕字段不可输入
  2. GPU Gems1 - 3 Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)
  3. mysql表 c#实体类,创建基于MySQL表中的C#类
  4. ZigBee简介(不断补充)
  5. [混音插件]板岩混响效果器
  6. 忘记密码怎么卸载和删除网维大师~
  7. Transmission下载安装
  8. 桥本分数式-DFS法-Java
  9. 编译caffe2遇到的坑
  10. mysql 校对规则_MySQL:校对规则
  11. matlab 表示希腊字母yita,常用希腊字母读法
  12. M1 ARM版miniforge安装与移除TensorFlow和pytorch环境
  13. JavaScript 求平均数的方法(实参个数不确定)
  14. Parameter-FreeSpatialAttentionNetworkforPersonRe-Identification
  15. 简约黄历日历网站源码分享
  16. 什么文案才算得上好文案
  17. 【计算机毕业设计】jsp+mysql 基于SSM的儿童疫苗接种管理系统(可改为新冠疫苗)
  18. 解决各种中文乱码的方法
  19. 购物商城实现点击商品列表某商品,进入其详情页!
  20. springboot+solr实现搜索引擎

热门文章

  1. kubesphere 3.0离线安装
  2. 多个vue项目合并成一个_集美们,快看如何一步将多个PDF合并成一个PDF
  3. Mac下PyCharm CE 配置PyQt5环境
  4. 程序员生存定律--程序人生的出口
  5. [BX] 和 loop指令
  6. tcp协议接收方对out of order的分段是如何处理的?_TCP协议与流通信
  7. linux mysql进阶_mysql进阶学习二之搭建主从
  8. 启明去端分享| ESP32-S3如何实现tcp_client和tcp_server9-07
  9. 启明云端分享|乐鑫推出在线选型工具 ESP Product Selector
  10. 小明分享:8ms平台入门教程