ffmpeg学习---8.ubuntu14.04源码编译ffmpeg-2.1

来源:互联网 发布:触摸屏餐饮软件源码 编辑:程序博客网 时间:2024/05/22 17:18
一. 编译
1. 下载
http://www.ffmpeg.org/ 下载ffmpeg的源码,我这儿下载的是ffmpeg-2.1.7.tar.bz2
2. 简单编译
解压后,进入ffmpeg的源码目录
  1. cong@msi:/work/ffmpeg-2.1.7$ sudo apt-get install yasm    //这儿需要先安装yasm,否则configure会报错
  2. cong@msi:/work/ffmpeg-2.1.7$ mkdir install                //创建一个Install目录,存放编译好之后的东东
  3. cong@msi:/work/ffmpeg-2.1.7$ ./configure --prefix=./install //安装到install目录
  4. Creating config.mak, config.h, and doc/config.texi...     //这儿说明configure成功,可以编译了

  5. cong@msi:/work/ffmpeg-2.1.7$ make -j16
3. 生成ffplay
   之所以默认编译没有生成ffplay的原因是系统中没有安装SDL, ffplay是依赖SDL显示的
  1. cong@msi:/work/ffmpeg-2.1.7$ sudo apt-get install libsdl1.2-dev   
   安装完SDL库之后,重新按照步骤2编译一遍就可以生成ffplay了
4.生成动态库
按照上述2编译出来的是静态库,要想生成动态库,需要在configure时加入--enable-shared 
  1. cong@msi:/work/ffmpeg-2.1.7$ sudo apt-get install yasm    //这儿需要先安装yasm,否则configure会报错
  2. cong@msi:/work/ffmpeg-2.1.7$ mkdir install                //创建一个Install目录,存放编译好之后的东东
  3. cong@msi:/work/ffmpeg-2.1.7$ ./configure --enable-shared --prefix=./install //安装到install目录
  4. Creating config.mak, config.h, and doc/config.texi...     //这儿说明configure成功,可以编译了

  5. cong@msi:/work/ffmpeg-2.1.7$ make -j16
4.1 如果出现如下错误
  1. /usr/bin/ld: libavcodec/mqc.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
  2. libavcodec/mqc.o: error adding symbols: Bad value
  3. collect2: error: ld returned 1 exit status
解决方法是:

  1. config.mak L75加入 -fPIC,然后重新编译
  2. HOSTCFLAGS=-O3 --std=c99 -Wall -fPIC
4.2 编译ffmpeg自带的Demo
  1. a. 要想编译example下的程序
  2. cong@msi:/work/ffmpeg/ffmpeg-2.7.2$ make examples           //编译example
  3. cong@msi:/work/ffmpeg/ffmpeg-2.7.2$ make examplesclean      //清除example
  4. b. 要想编译libavutils下的程序
  5. cong@msi:/work/ffmpeg/ffmpeg-2.7.2$ make testprogs          //不仅只有libavutils下的
  6. 清除的话,直接touch吧,这些文件都是和ffmpeg共用的清了中间文件还得重新编译
4.2.1 在example中加入自己的程序
在ffmpeg-3.0.1中上述Demo己转到doc目录下
a. 在doc/Makefile 中添加 DOC_EXAMPLES-yes       += mytest
b. 在doc/examples/Makefile中添加   EXAMPLES     += mytest
c. 在doc/examples/mytest.c中添加 mytest.c文件
d. 在ffmpeg的源码目录下编译 make examples即可
4.3 不编译ffmpeg ffprobe ffserver
  1. configuration: --prefix=./install --disable-ffmpeg --disable-ffprobe --disable-ffserver

二.开发
1. 在ffmpeg库中加入打印
在libavutil/avutil.h或者libavutil/log.h中加入
  1. 在./libavutil/log.h中
  2. #define dbmsg(fmt, args ...) printf("cong:%s:%s[%d]: "fmt"\n",__FILE__, __FUNCTION__, __LINE__,##args)
2. demo
fftest.c
  1. #include <stdio.h>
  2. #include <libavformat/avformat.h>
  3. #include <libswscale/swscale.h>

  4. #define dbmsgc(fmt, args ...) printf("cong:%s[%d]: "fmt"\n", __FUNCTION__, __LINE__,##args)
  5. //#define dbmsg(fmt, args ...) printf("cong:%s:%s[%d]: "fmt"\n",__FILE__, __FUNCTION__, __LINE__,##args)
  6. int main(int argc, char **argv)
  7. {
  8.     int i=0;
  9.     AVFormatContext *pFormatCtx = NULL;
  10.     avcodec_register_all();
  11. #if CONFIG_AVDEVICE
  12.     avdevice_register_all();
  13. #endif
  14.     avfilter_register_all();
  15.     av_register_all();

  16.     if(avformat_open_input(&pFormatCtx, argv[1], NULL, NULL)!=0)
  17.         return -1; // Couldn't open file

  18.     if(avformat_find_stream_info(pFormatCtx, NULL)<0)
  19.         return -1; // Couldn't find stream inform
  20.     av_dump_format(pFormatCtx,0, 0, 0);

  21.     return 0;
  22. }
Makefile
  1. FFMPEG=/work/ffmpeg-2.1.7/install
  2. CC=gcc
  3. CFLAGS=--I$(FFMPEG)/include
  4. LDFLAGS = -L$(FFMPEG)/lib/ -lswscale -lswresample -lavformat -lavdevice -lavcodec -lavutil -lavfilter -lm 
  5. TARGETS=fftest
  6. all: $(TARGETS)
  7. fftest:fftest.c
  8.     $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

  9. clean:
  10.     rm -rf $(TARGETS)

  11. run:
  12.     export LD_LIBRARY_PATH=/work//ffmpeg-2.1.7/install/lib/ \
  13.     && ./fftest ~/Downloads/testapk/nvren.dts
这样用make run 就可以运行了

fftest.rar (下载后改名为fftest.tar.gz)

三.调试
3.1 加入dump_stack函数
  1. ./libavutil/log.h
  2. #include <execinfo.h>
  3. void dump_stack(void);

  4. ./libavutil/log.c
  5. void dump_stack()
  6. {
  7.     int i;
  8.     int size = 64; 
  9.     void * array[64];
  10.     int stack_num = backtrace(array, size);
  11.     char ** stacktrace = backtrace_symbols(array, stack_num);
  12.     for (= 0; i < stack_num; ++i)
  13.     { 
  14.         printf("%s\n", stacktrace[i]);
  15.     } 
  16.     free(stacktrace);
  17. }


  18. 在./configure文件中
  19. 将3071行 LD_LIB='-L'改为
  20. 3071 LD_LIB='-l% -rdynamic'
3.2 不strip
在libray.mak中
L32 -$(if $(ASMSTRIPFLAGS), $(STRIP) $(ASMSTRIPFLAGS) $@) 注掉

附1.git管理
  1. cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ vi .gitignore 
  2. cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ cat .gitignore 
  3. *.o
  4. install
  5. .gitignore
  6. *.a
  7. *.d
  8. *.html
  9. *.3
  10. *.1
  11. *.pod
  12. *.texi
  13. *.pc
  14. .config
  15. .version
  16. config.asm
  17. config.fate
  18. config.h
  19. config.log
  20. config.mak
  21. doc/config.texi
  22. libavutil/avconfig.h
  23. libavutil/ffversion.h
  24. doc/fate.txt
  25. doc/print_options
  26. ffmpeg
  27. ffmpeg_g
  28. ffplay
  29. ffplay_g
  30. ffprobe
  31. ffprobe_g
  32. ffserver
  33. ffserver_g

  34. cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ git init
  35. cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ git add ./
  36. cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ git commit -'ffmpeg3.0.1 project init
然后再configure   make 
0 0
原创粉丝点击