ffmpeg库使用及其错误解决

来源:互联网 发布:php企业网站管理系统 编辑:程序博客网 时间:2024/06/18 05:46

ffmpeg库使用及其错误解决


1.首先,需要弄明白Linux下动态库和静态库基础知识,这个网上自行搜索;

(1)linux动态库和静态库工作原理;

(2)如何用制作linux动态库和静态库;

(3)如何引用linux动态库和静态库;


2.ffmpeg动态库和静态库选项设定及编译

动态库 --enable-shared

./configure --prefix="ffmpeg-release-3.0/ffmpeg_build" --bindir="ffmpeg-release-3.0/ffmpeg_build/bin" --enable-shared --enable-gpl --extra-cflags="-I/ffmpeg-release-3.0/include" --extra-ldflags="-L/ffmpeg-release-3.0/ffmpeg_build/lib"
make V=1

make install V=1

静态库 --enable-static

./configure --prefix="ffmpeg-release-3.0/ffmpeg_build" --bindir="ffmpeg-release-3.0/ffmpeg_build/bin" --enable-static --enable-gpl --extra-cflags="-I/ffmpeg-release-3.0/include" --extra-ldflags="-L/ffmpeg-release-3.0/ffmpeg_build/lib"
make V=1

make install V=1


编译完成后:

ffmpeg_build/lib$ ls -l --block-size=m
total 200M
-rw-r--r-- 1 wr wr 128M Sep 18 10:42 libavcodec.a
-rw-r--r-- 1 wr wr   2M Sep 18 10:42 libavdevice.a
-rw-r--r-- 1 wr wr  19M Sep 18 10:42 libavfilter.a
-rw-r--r-- 1 wr wr  43M Sep 18 10:42 libavformat.a
-rw-r--r-- 1 wr wr   3M Sep 18 10:42 libavutil.a
-rw-r--r-- 1 wr wr   1M Sep 18 10:42 libpostproc.a
-rw-r--r-- 1 wr wr   1M Sep 18 10:42 libswresample.a
-rw-r--r-- 1 wr wr   7M Sep 18 10:42 libswscale.a
drwxr-xr-x 2 wr wr   1M Sep 18 10:42 pkgconfig


3.单个ffmpeg库使用:建议用ffmpeg动态库,静态库太大了,100多M,由于我编译的是静态库,那就以静态库示例;

单个静态库,不涉及库依赖,直接在gcc里面用-L参数引用即可;

/* * file: ffmpeglibtest.c * * author: openswc * http://blog.csdn.net/openswc * * gcc ffmpeglibtest.c -I./ffmpeg_build/include/ -L./ffmpeg_build/lib/ -lavutil -o ffmpeglibtest * gcc ffmpeglibtest.c -I /home/xxx/temp/ffmpeg-release-3.0/ffmpeg_build/include/ -L /home/xxx/temp/ffmpeg-release-3.0/ffmpeg_build/lib/ -lavutil -o ffmpeglibtest*/#include <stdio.h>#include "libavutil/log.h"int main(){int iLogLev = 0; iLogLev = av_log_get_level(); printf("av_log_get_level is *%d*\n", iLogLev); av_log_set_level(AV_LOG_DEBUG);iLogLev = av_log_get_level();printf("av_log_set_level is *%d*\n", iLogLev); return 0;}

3.多个ffmpeg库使用:以静态库示例;


/* * file: ffmpeglibtestm.c * * author: openswc * http://blog.csdn.net/openswc * * gcc ffmpeglibtestm.c -I./ffmpeg_build/include/ -L./ffmpeg_build/lib/ -lavformat -lavcodec -lswresample -lavutil -pthread -lva -lm -lz -o ffmpeglibtestm * gcc ffmpeglibtestm.c -I /home/xxx/temp/ffmpeg-release-3.0/ffmpeg_build/include -L /home/xxx/temp/ffmpeg-release-3.0/ffmpeg_build/lib -lavformat -lavcodec -lswresample -lavutil -pthread -lva -lm -lz -o ffmpeglibtestm*/#include <stdio.h>#include "libavutil/log.h"#include "libavformat/avformat.h"void test_log(){av_register_all();AVFormatContext *obj=NULL;obj=avformat_alloc_context();printf("====================================\n");av_log(obj,AV_LOG_PANIC,"Panic: Something went really wrong and we will crash now.\n");av_log(obj,AV_LOG_FATAL,"Fatal: Something went wrong and recovery is not possible.\n");av_log(obj,AV_LOG_ERROR,"Error: Something went wrong and cannot losslessly be recovered.\n");av_log(obj,AV_LOG_WARNING,"Warning: This may or may not lead to problems.\n");av_log(obj,AV_LOG_INFO,"Info: Standard information.\n");av_log(obj,AV_LOG_VERBOSE,"Verbose: Detailed information.\n");av_log(obj,AV_LOG_DEBUG,"Debug: Stuff which is only useful for libav* developers.\n");printf("====================================\n");avformat_free_context(obj);}int main(){int iLogLev = 0;iLogLev = av_log_get_level();printf("av_log_get_level is *%d*\n", iLogLev);av_log_set_level(AV_LOG_DEBUG);iLogLev = av_log_get_level();printf("av_log_set_level is *%d*\n", iLogLev);test_log();return 0;}

如果引用多个ffmpeg库,则需要注意多个ffmepg库之间的依赖关系,那如何确定这个依赖关系呢?

找到该库的信息配置文件libxxx.pc,里面的Requires说明了需要依赖的库。

ffmpeg_build/lib/pkgconfig$ ls
libavcodec.pc  libavdevice.pc  libavfilter.pc  libavformat.pc  libavutil.pc  libpostproc.pc  libswresample.pc  libswscale.pc
ffmpeg-release-3.0/ffmpeg_build/lib/pkgconfig$ cat libavcodec.pc
prefix=/home/xxx/temp/ffmpeg-release-3.0/ffmpeg_build
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include
Name: libavcodec
Description: FFmpeg codec library
Version: 57.24.102
Requires: libswresample >= 2.0.101, libavutil >= 55.17.103
Requires.private:
Conflicts:
Libs: -L${libdir}  -lavcodec -lva -lva-x11 -lva -lxcb -lXau -lXdmcp -lxcb-shm -lxcb -lXau -lXdmcp -lxcb-xfixes -lxcb-render -lxcb-shape -lxcb -lXau -lXdmcp -lxcb-shape -lxcb -lXau -lXdmcp -lX11 -lasound -lSDL -lpthread -lm -ldl -lasound -lm -ldl -lpthread -lpulse-simple -lpulse -lX11 -lXext -ldirectfb -lfusion -ldirect -lpthread -lcaca -lpthread -lm -lz -pthread
Libs.private:


Name: libavcodec
Description: FFmpeg codec library
Version: 57.24.102
Requires: libswresample >= 2.0.101, libavutil >= 55.17.103
Name: libavdevice
Description: FFmpeg device handling library
Version: 57.0.101
Requires: libavfilter >= 6.31.100, libswscale >= 4.0.100, libpostproc >= 54.0.100, libavformat >= 57.25.100, libavcodec >= 57.24.102, libswresample >= 2.0.101, libavutil >= 55.17.103
Name: libavfilter
Description: FFmpeg audio/video filtering library
Version: 6.31.100
Requires: libswscale >= 4.0.100, libpostproc >= 54.0.100, libavformat >= 57.25.100, libavcodec >= 57.24.102, libswresample >= 2.0.101, libavutil >= 55.17.103
Name: libavformat
Description: FFmpeg container format library
Version: 57.25.100
Requires: libavcodec >= 57.24.102, libswresample >= 2.0.101, libavutil >= 55.17.103
Name: libavutil
Description: FFmpeg utility library
Version: 55.17.103
Requires:
Name: libpostproc
Description: FFmpeg postprocessing library
Version: 54.0.100
Requires: libavutil >= 55.17.103
Name: libswresample
Description: FFmpeg audio resampling library
Version: 2.0.101
Requires: libavutil >= 55.17.103
Name: libswscale
Description: FFmpeg image rescaling library
Version: 4.0.100
Requires: libavutil >= 55.17.103

根据以上信息,确定库之间的依赖关系如下:-lavutil -lswresample -lavcodec -lavformat,然后反过来放到gcc命令-L选项后面:-lavformat -lavcodec -lswresample -lavutil;
另外还缺少-lva -lm -lz -pthread库,加入进去之后gcc编译命令为:
gcc ffmpeglibtestm.c -I./ffmpeg_build/include/ -L./ffmpeg_build/lib/ -lavformat -lavcodec -lswresample -lavutil -pthread -lva -lm -lz -o ffmpeglibtestm
or 
gcc ffmpeglibtestm.c -I /home/xx/temp/ffmpeg-release-3.0/ffmpeg_build/include -L /home/xx/temp/ffmpeg-release-3.0/ffmpeg_build/lib -lavformat -lavcodec -lswresample -lavutil -pthread -lva -lm -lz -o ffmpeglibtestm

如果库的依赖顺序不对,则会报undefined reference to错误;
undefined reference to `av_register_all()'
undefined reference to `avformat_alloc_context()'

如果缺少-lva,则会报以下undefined reference to错误;
libavcodec/vaapi.c:128: undefined reference to `vaCreateBuffer'

如果缺少-lm,则会报以下undefined reference to错误;
/ffmpeg-release-3.0/libavcodec/atrac3plusdsp.c:103: undefined reference to `sin'
/ffmpeg-release-3.0/libavcodec/atrac3plusdsp.c:107: undefined reference to `cos'
/ffmpeg-release-3.0/libavcodec/atrac3plusdsp.c:111: undefined reference to `exp2f'

如果缺少-lz,则会报以下undefined reference to错误;

/ffmpeg-release-3.0/libavformat/http.c:626: undefined reference to `inflateEnd'
/ffmpeg-release-3.0/libavformat/http.c:627: undefined reference to `inflateInit2_'
/ffmpeg-release-3.0/libavformat/http.c:632: undefined reference to `zlibCompileFlags'

如果缺少-pthread,则会报以下undefined reference to错误;

/ffmpeg-release-3.0/libavformat/async.c:313: undefined reference to `pthread_join'
/ffmpeg-release-3.0/libavformat/async.c:281: undefined reference to `pthread_create'
/ffmpeg-release-3.0/libavformat/udp.c:974: undefined reference to `pthread_cancel'


1 0
原创粉丝点击