一. 编译
1. 下载
下载ffmpeg的源码,我这儿下载的是ffmpeg-2.1.7.tar.bz2
2. 简单编译
解压后,进入ffmpeg的源码目录
-
cong@msi:/work/ffmpeg-2.1.7$ sudo apt-get install yasm //这儿需要先安装yasm,否则configure会报错
-
cong@msi:/work/ffmpeg-2.1.7$ mkdir install //创建一个Install目录,存放编译好之后的东东
-
cong@msi:/work/ffmpeg-2.1.7$ ./configure --prefix=./install //安装到install目录
-
Creating config.mak, config.h, and doc/config.texi... //这儿说明configure成功,可以编译了
-
-
cong@msi:/work/ffmpeg-2.1.7$ make -j16
3. 生成ffplay
之所以默认编译没有生成ffplay的原因是系统中没有安装SDL, ffplay是依赖SDL显示的
-
cong@msi:/work/ffmpeg-2.1.7$ sudo apt-get install libsdl1.2-dev
安装完SDL库之后,重新按照步骤2编译一遍就可以生成ffplay了
4.生成动态库
按照上述2编译出来的是静态库,要想生成动态库,需要在configure时加入--enable-shared
-
cong@msi:/work/ffmpeg-2.1.7$ sudo apt-get install yasm //这儿需要先安装yasm,否则configure会报错
-
cong@msi:/work/ffmpeg-2.1.7$ mkdir install //创建一个Install目录,存放编译好之后的东东
-
cong@msi:/work/ffmpeg-2.1.7$ ./configure --enable-shared --prefix=./install //安装到install目录
-
Creating config.mak, config.h, and doc/config.texi... //这儿说明configure成功,可以编译了
-
-
cong@msi:/work/ffmpeg-2.1.7$ make -j16
4.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
-
libavcodec/mqc.o: error adding symbols: Bad value
-
collect2: error: ld returned 1 exit status
解决方法是:
-
config.mak L75加入 -fPIC,然后重新编译
-
HOSTCFLAGS=-O3 -g -std=c99 -Wall -fPIC
4.2 编译ffmpeg自带的Demo
-
a. 要想编译example下的程序
-
cong@msi:/work/ffmpeg/ffmpeg-2.7.2$ make examples //编译example
-
cong@msi:/work/ffmpeg/ffmpeg-2.7.2$ make examplesclean //清除example
-
b. 要想编译libavutils下的程序
-
cong@msi:/work/ffmpeg/ffmpeg-2.7.2$ make testprogs //不仅只有libavutils下的
-
清除的话,直接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
-
configuration: --prefix=./install --disable-ffmpeg --disable-ffprobe --disable-ffserver
二.开发
1. 在ffmpeg库中加入打印
在libavutil/avutil.h或者libavutil/log.h中加入
-
在./libavutil/log.h中
-
#define dbmsg(fmt, args ...) printf("cong:%s:%s[%d]: "fmt"\n",__FILE__, __FUNCTION__, __LINE__,##args)
2. demo
fftest.c
-
#include <stdio.h>
-
#include <libavformat/avformat.h>
-
#include <libswscale/swscale.h>
-
-
#define dbmsgc(fmt, args ...) printf("cong:%s[%d]: "fmt"\n", __FUNCTION__, __LINE__,##args)
-
//#define dbmsg(fmt, args ...) printf("cong:%s:%s[%d]: "fmt"\n",__FILE__, __FUNCTION__, __LINE__,##args)
-
int main(int argc, char **argv)
-
{
-
int i=0;
-
AVFormatContext *pFormatCtx = NULL;
-
avcodec_register_all();
-
#if CONFIG_AVDEVICE
-
avdevice_register_all();
-
#endif
-
avfilter_register_all();
-
av_register_all();
-
-
if(avformat_open_input(&pFormatCtx, argv[1], NULL, NULL)!=0)
-
return -1; // Couldn't open file
-
-
if(avformat_find_stream_info(pFormatCtx, NULL)<0)
-
return -1; // Couldn't find stream inform
-
av_dump_format(pFormatCtx,0, 0, 0);
-
-
return 0;
-
}
Makefile
-
FFMPEG=/work/ffmpeg-2.1.7/install
-
CC=gcc
-
CFLAGS=-g -I$(FFMPEG)/include
-
LDFLAGS = -L$(FFMPEG)/lib/ -lswscale -lswresample -lavformat -lavdevice -lavcodec -lavutil -lavfilter -lm
-
TARGETS=fftest
-
all: $(TARGETS)
-
fftest:fftest.c
-
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
-
-
clean:
-
rm -rf $(TARGETS)
-
-
run:
-
export LD_LIBRARY_PATH=/work//ffmpeg-2.1.7/install/lib/ \
-
&& ./fftest ~/Downloads/testapk/nvren.dts
这样用make run 就可以运行了
fftest.rar (下载后改名为fftest.tar.gz)
三.调试
3.1 加入dump_stack函数
-
./libavutil/log.h
-
#include <execinfo.h>
-
void dump_stack(void);
-
-
./libavutil/log.c
-
void dump_stack()
-
{
-
int i;
-
int size = 64;
-
void * array[64];
-
int stack_num = backtrace(array, size);
-
char ** stacktrace = backtrace_symbols(array, stack_num);
-
for (i = 0; i < stack_num; ++i)
-
{
-
printf("%s\n", stacktrace[i]);
-
}
-
free(stacktrace);
-
}
-
-
-
在./configure文件中
-
将3071行 LD_LIB='-L'改为
-
3071 LD_LIB='-l% -rdynamic'
3.2 不strip
在libray.mak中
L32 -$(if $(ASMSTRIPFLAGS), $(STRIP) $(ASMSTRIPFLAGS) $@) 注掉
附1.git管理
-
cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ vi .gitignore
-
cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ cat .gitignore
-
*.o
-
install
-
.gitignore
-
*.a
-
*.d
-
*.html
-
*.3
-
*.1
-
*.pod
-
*.texi
-
*.pc
-
.config
-
.version
-
config.asm
-
config.fate
-
config.h
-
config.log
-
config.mak
-
doc/config.texi
-
libavutil/avconfig.h
-
libavutil/ffversion.h
-
doc/fate.txt
-
doc/print_options
-
ffmpeg
-
ffmpeg_g
-
ffplay
-
ffplay_g
-
ffprobe
-
ffprobe_g
-
ffserver
-
ffserver_g
-
-
cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ git init
-
cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ git add ./
-
cong@msi:/work/ffmpeg/ffmpeg-3.0.1$ git commit -m 'ffmpeg3.0.1 project init
然后再configure make
阅读(7535) | 评论(0) | 转发(0) |