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;
}
/*
* 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说明了需要依赖的库。
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
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:
Description: FFmpeg codec library
Version: 57.24.102
Requires: libswresample >= 2.0.101, libavutil >= 55.17.103
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
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
Description: FFmpeg container format library
Version: 57.25.100
Requires: libavcodec >= 57.24.102, libswresample >= 2.0.101, libavutil >= 55.17.103
Description: FFmpeg utility library
Version: 55.17.103
Requires:
Description: FFmpeg postprocessing library
Version: 54.0.100
Requires: libavutil >= 55.17.103
Description: FFmpeg audio resampling library
Version: 2.0.101
Requires: libavutil >= 55.17.103
Description: FFmpeg image rescaling library
Version: 4.0.100
Requires: libavutil >= 55.17.103
or
undefined reference to `avformat_alloc_context()'
/ffmpeg-release-3.0/libavcodec/atrac3plusdsp.c:107: undefined reference to `cos'
/ffmpeg-release-3.0/libavcodec/atrac3plusdsp.c:111: undefined reference to `exp2f'
/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:281: undefined reference to `pthread_create'
/ffmpeg-release-3.0/libavformat/udp.c:974: undefined reference to `pthread_cancel'