ffmpeg學習---8.ubuntu14.04原始碼編譯ffmpeg-2.1
阿新 • • 發佈:2019-01-09
一. 編譯
1. 下載
http://www.ffmpeg.org/ 下載ffmpeg的原始碼,我這兒下載的是ffmpeg-2.1.7.tar.bz2
2. 簡單編譯
解壓後,進入ffmpeg的原始碼目錄
之所以預設編譯沒有生成ffplay的原因是系統中沒有安裝SDL, ffplay是依賴SDL顯示的
4.生成動態庫
按照上述2編譯出來的是靜態庫,要想生成動態庫,需要在configure時加入--enable-shared
在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. 在ffmpeg庫中加入列印
在libavutil/avutil.h或者libavutil/log.h中加入
fftest.c
fftest.rar (下載後改名為fftest.tar.gz)
三.除錯
3.1 加入dump_stack函式
在libray.mak中
L32 -$(if $(ASMSTRIPFLAGS), $(STRIP) $(ASMSTRIPFLAGS) [email protected]) 注掉
附1.git管理
1. 下載
http://www.ffmpeg.org/ 下載ffmpeg的原始碼,我這兒下載的是ffmpeg-2.1.7.tar.bz2
2. 簡單編譯
解壓後,進入ffmpeg的原始碼目錄
-
[email protected]:/work/ffmpeg-2.1.7$
sudo apt-get install yasm //這兒需要先安裝yasm,否則configure會報錯
-
[email protected]:/work/ffmpeg-2.1.7$ mkdir install //建立一個Install目錄,存放編譯好之後的東東
-
[email protected]
-
Creating config.mak, config.h, and doc/config.texi... //這兒說明configure成功,可以編譯了
-
[email protected]:/work/ffmpeg-2.1.7$
make -j16
之所以預設編譯沒有生成ffplay的原因是系統中沒有安裝SDL, ffplay是依賴SDL顯示的
-
[email protected]:/work/ffmpeg-2.1.7$
sudo apt-
4.生成動態庫
按照上述2編譯出來的是靜態庫,要想生成動態庫,需要在configure時加入--enable-shared
-
[email protected]:/work/ffmpeg-2.1.7$
sudo apt-get install yasm //這兒需要先安裝yasm,否則configure會報錯
-
[email protected]:/work/ffmpeg-2.1.7$ mkdir install //建立一個Install目錄,存放編譯好之後的東東
-
[email protected]:/work/ffmpeg-2.1.7$ ./configure --enable-shared --prefix=./install
//安裝到install目錄
-
Creating config.mak, config.h, and doc/config.texi...
//這兒說明configure成功,可以編譯了
-
[email protected]:/work/ffmpeg-2.1.7$
make -j16
-
/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
-
a. 要想編譯example下的程式
-
[email protected]:/work/ffmpeg/ffmpeg-2.7.2$
make examples //編譯example
-
[email protected]:/work/ffmpeg/ffmpeg-2.7.2$
make examplesclean //清除example
-
b. 要想編譯libavutils下的程式
-
[email protected]:/work/ffmpeg/ffmpeg-2.7.2$
make testprogs //不僅只有libavutils下的
- 清除的話,直接touch吧,這些檔案都是和ffmpeg共用的清了中間檔案還得重新編譯
在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)
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;
- }
-
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
[email protected] $^ $(LDFLAGS)
-
clean:
-
rm -rf $(TARGETS)
-
run:
-
export LD_LIBRARY_PATH=/work//ffmpeg-2.1.7/install/lib/ \
- && ./fftest ~/Downloads/testapk/nvren.dts
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'
在libray.mak中
L32 -$(if $(ASMSTRIPFLAGS), $(STRIP) $(ASMSTRIPFLAGS) [email protected]) 注掉
附1.git管理
-
[email protected]:/work/ffmpeg/ffmpeg-3.0.1$
vi .gitignore
-
[email protected]:/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
-
[email protected]:/work/ffmpeg/ffmpeg-3.0.1$
git init
-
[email protected]:/work/ffmpeg/ffmpeg-3.0.1$
git add ./
- [email protected]:/work/ffmpeg/ffmpeg-3.0.1$ git commit -m 'ffmpeg3.0.1 project init