ffmpeg库使用及其错误解决

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值