默认情况下,Openwrt是移植了Libffmpeg-full架构的,同时包含libffmpeg-custom、libffmpeg-mini、libffmpeg-audio-dec架构。但是openwrt中关于ffmpeg的makefile目前只能编译通过libffmpeg-full架构,其他三个还有待验证与修改。本文就针对libffmpeg-custom架构编译进行makefile配置修改。
1、makefile 与 config.in之间的关系
由于openwrt / ffmpeg的makefile中包含:
define Package/libffmpeg-custom/config
source "$(SOURCE)/Config.in"
endef
即,对于libffmpeg-custom模块在menuconfig中,包含配置子菜单。
对于子菜单内容,由config.in决定。
对于子菜单中内容选中是否生效,则需要同时在openwrt / ffmpeg的makefile中配置相应的宏。
如:
menuconfig中libffmpeg-custom的decoders模块:
需要有AAC选项,则config.in中需要对应的:
同时,要使在menuconfig中选择了AAC decoder就对应的AAC decoder生效的话,还需要 openwrt / ffmpeg的makefile中FFMPEG_CUSTOM_DECODERS宏中包含AAC decoder。
只有在编译产生的config.h中对应的宏都为1,同时该宏对应的.c文件都产生了.o文件,才能说明,该文件确实被编译了。
#define CONFIG_AAC_DECODER 1
#define CONFIG_AAC_FIXED_DECODER 1
#define CONFIG_AAC_LATM_DECODER 1
#define CONFIG_LIBFDK_AAC_DECODER 1
2、menuconfig中libffmpeg-custom添加新模块
在menuconfig中的libffmpeg-custom配置子菜单中添加新选项,filters,则需要在openwrt/ffmpeg makefile 中添加 filter
FFMPEG_CUSTOM_FILTERS:= \
aresample adrawgraph showvolume showwaves showspectrum aphasemeter amovie
同时,在宏PKG_CONFIG_DEPENDS中添加filter
PKG_CONFIG_DEPENDS:= \
$(patsubst %,CONFIG_FFMPEG_CUSTOM_ENCODER_%,$(FFMPEG_CUSTOM_ENCODERS)) \
$(patsubst %,CONFIG_FFMPEG_CUSTOM_DECODER_%,$(FFMPEG_CUSTOM_DECODERS)) \
$(patsubst %,CONFIG_FFMPEG_CUSTOM_MUXER_%,$(FFMPEG_CUSTOM_DEMUXERS)) \
$(patsubst %,CONFIG_FFMPEG_CUSTOM_DEMUXER_%,$(FFMPEG_CUSTOM_DEMUXERS)) \
$(patsubst %,CONFIG_FFMPEG_CUSTOM_PARSER_%,$(FFMPEG_CUSTOM_PARSERS)) \
$(patsubst %,CONFIG_FFMPEG_CUSTOM_PROTOCOL_%,$(FFMPEG_CUSTOM_PROTOCOLS))\
$(patsubst %,CONFIG_FFMPEG_CUSTOM_FILTER_%,$(FFMPEG_CUSTOM_FILTERS))
且在FFMPEG_CONFIGURE中添加filter。
同时,config.in中也需添加对应模块:
此时,就可以menuconfig中选择aresample filter了。但编译过后,发现aresample.c并没有产生对应的.o文件,查看config.h中发现对应的宏CONFIG_ARESAMPLE_FILTER也是为0。这说明,aresample虽然在menuconfig中可选,但选中仍未生效。查找ffmpeg资料,发现aresample filter还依赖于库libswresample,所以enable libavfilter的同时,还需要enable libswresample,才可以使aresample filter真正生效。
3、写好config.in以及makefile中libffmpeg-custom相关的宏,只是为了配置好menuconfig中的菜单选项,至于如何能使libffmpeg-custom编译通过,还需对makefile进一步修改。
首先,DEPENDS需修改为@BUILD_PATENTED (具体什么原因,还不是很清楚)
同时,安装开发环境时,需把对应的库放入开发环境以用于编译调用(此时,只是把6个库放入了开发环境。):
最后,安装时(安装,就是把对应的库拷贝到相应的目录下)
这里安装时,只将6个动态库拷贝到了相应目录下。这说明libffmpeg-custom只融合了这6个库,基于这6个库的开发,可以使用libffmpeg-custom。如果有涉及到Libswscale库的API调用开发,单链接Libffmpeg-custom 是会出错的。同时,安装过程,拷贝到相应目录的动态库的总大小,会影响最后生成的.ipk以及.bin文件的大小。这对于系统大小裁剪也是一个可考虑因素。