史上最全的基于ffmpeg+sdl网络摄像头编解码播放资料(包含交叉编译过程,附带完整源码)

原创博文,严禁私自转载,转载请注明出处!!!

近期,由于工作需要,要在开发板上跑一个摄像头,摄像头款式比较老,不支持rtsp格式,所以选择编译ffmpeg+sdl实现软解码播放摄像头,特此记录整个编译过程(非常之艰辛,发文留念)

在ubuntu上交叉编译环境的搭建:因为开发板上搭建的程序的运行环境和用于编译的PC上的编译环境要匹配,所以要看好自己的需要,交叉编译工具链有好几种,最常见的arm-none-linux-gnueabi-,我使用的是arm-linux-gnueabihf- ,由于ffmpeg的交叉编译需要依赖sdl,所以二者之间就存在版本的匹配问题,sdl1.2和sdl2.0之间有很大的差异,所以开始编译前要搞清楚自己的版本,通过查找资料和反复测试,初步的出结论ffmpeg3.1.x版本以上+sdl2.0可以编译通过(网上说sdl2.0与ffmpeg3.0.11以上版本比配,测试了一下,没成功),sdl1.2+ffmpeg2.x

SDL1.2迁移到SDL2.0的区别及迁移指南参考文档https://blog.csdn.net/Amrf2/article/details/75119570

ffmpeg与sdl版本匹配问题参考文档https://blog.csdn.net/cyf15238622067/article/details/79423052

开发板:imax6dl

系统:ubuntu16.04

摄像头:好像是fairy(后来因为视野达不到要求改用别的了)

在正式交叉编译前首先要先来及简单了解一下视频依赖库ffmpeg和sdl

FFmpeg(负责解码)+SDL(负责显示)
   
 (1)FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序
        FFmpeg源码的简单分析,参考文档:https://blog.csdn.net/leixiaohua1020/article/details/44116215

     (2)SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件
        SDL2源码的简单分析,参考文档:https://blog.csdn.net/leixiaohua1020/article/details/41207787

好的,简单了解了ffmpeg和sdl之后正式交叉编译sdl和ffmpeg

因为是交叉编译,所以编译过程中./configure参数时一定要注意,要弄清楚host,build,target所代表的含义,要设置正确不然编译会报错,关于该问题后文将不再赘述

host,build,target所代表的含义参考文档http://www.cnblogs.com/baiduboy/p/7573778.html

先编译低版本的视频库ffmpeg2.3.6+sdl1.2

交叉编译sdl1.2

因为fmpeg编译需要依赖sdl库,所以先编译sdl

./configure --prefix=/home/user/arm --disable-video-wayland --disable-video-wayland-qt-touch --disable-pulseaudio --disable-video-dummy --disable-arts --disable-esd --disable-alsa --disable-video-x11 --disable-video-rpi --disable-input-tslib --enable-video-directfb --disable-video-mir --build=x86_64 --host=arm-linux-gnueabihf 

make install 

make( -j4)

至此,完成对sdl的编译

上面为我编译时./configure的参数,需要注意的是版本的不同可能造成./configure参数的不同,所以要善于用./configure --help看配置参数信息

交叉编译ffmpeg2.3.6

编译ffmpeg时需要注意,版本一定要和sdl版本匹配,不然编译会报错,另外,如果想添加播放功能,需要添加--enable-ffplay,但是这样还是编译不出来ffplay,还要在ffmmpeg在configure后会生成config.mak,打开config.mak中去掉HAVE_SDL和CONFIG_FFPLAY前面的“!”,然后就可以把ffplay编译出来了参考文档如下:

编译ffplay参考文档:https://blog.csdn.net/liaojunwu/article/details/80425593

此外,若想播放MP4格式视频,还要--enable-libx264,为了enable成功,还要额外编译x264以及他的两个依赖库gpac和zlib,交叉编译成功后移植到开发板,

交叉编译x264
./configure --prefix=/home/user/arm --enable-shared --enable-pic --disable-asm --disable-win32thread --cross-prefix=arm-linux-gnueabihf- --host=arm-linux-gnueabihf

交叉编译gpac
./configure --prefix=/home/user/arm --cross-prefix=arm-linux-gnueabihf- --enable-vrml --enable-odf --enable-player --enable-avi --enable-dvb4linux --extra-cflags=-I/home/user/zlib/include --extra-ldflags=-L/home/user/zlib/lib --extra-libs=-ldl
交叉编译zlib
./configure --prefix=/home/user/arm --shared

交叉编译x264库参考文档:https://blog.csdn.net/tgww88/article/details/51392984

./configure --prefix=/home/user/arm --enable-shared --enable-ffserver --enable-ffplay --enable-ffprobe --enable-gpl --enable-libx264 --cross-prefix=arm-linux-gnueabihf- --enable-cross-compile --arch=arm --disable-stripping --extra-cflags=-I/home/user/arm/include --extra-ldflags=-L/home/user/arm/lib --extra-libs=-lSDL2 --extra-libs=-ldl --target-os=linux

make install

make(-j4)

至此,sdl1.2+ffmpeg2.3.6编译结束

注:这里说一下--prefix=/home/user/arm这个参数,最好把所有的库放在一个文件夹下,免得有依赖关系的库之间因为路径问题找不到而报错,都像上面这样配置就避免了这个问题,切记!!!

以上依赖库资源打包已上传:https://download.csdn.net/download/weixin_42550424/10855689

接下里是要交叉编译ffmpeg3.2.12+sdl2.0
同样,我们尝试在ffmpeg3.2.12+sdl2.0上编译出ffplay验证播放功能,依旧要根据上文章前面的内容,configure后要在config.mak下修改参数HAVE_SDL和CONFIG_FFPLAY前面的"!"去掉。同样成功编译出ffplay,但是将编译出来的ffmpeg和sdl的动态库移植到板子,发现ffplay命令无法播放任何格式的视频文件,通过查看,发现编译sdl2.0时没有打开framebuffer选项,配置参数变了,sdl1.2中打开framebuffer支持的参数是-enable-video-fbcon,但是在sdl2.0中变为--enable-video-directfb,于是修改参数重新configure,但是通过查看config.log,发现framebuffer支持还是没有打开,通过查资料,发现如果想要在编译sdl时打开framebuffer支持,必须额外编译directfb库,通过查看sdl2.0的README,发现sdl2.0只支持directfb1.0,1.2.x,1.3,所以我下载了directfb,此外编译Ddirectfb需要4个依赖库 分别为libpng,jpegsrc,zlib,freetype,之后编译sdl时添加--enable-video-directfb,成功打开framebuffer支持,然后编译

编译SDL之前要先编译directfb以及他的四个依赖库,才能在编译编译sdl时--enable-video-directfb成功,详细编译方法见下面链接,这里不做过多赘述(我也是按照下面做的)


交叉编译directfb参考文档:https://blog.csdn.net/u012075739/article/details/25030029
交叉编译directfb四个依赖库参考文档:http://blog.csdn.net/u012075739/article/details/25159849

交叉编译SDL2.0

./configure --prefix=/home/user/arm --disable-video-directfb --disable-video-dummy --disable-arts --disable-video-wayland --disable-esd --disable-alsa --disable-render-metal --disable-video-x11  --disable-input-tslib --disable-video-x11-xcursor --disable-video-x11-xdbe --disable-video-x11-xinerama --disable-video-x11-xinput --disable-video-x11-xrandr --disable-video-x11-scrnsaver --disable-video-x11-xshape --disable-video-x11-vm --disable-video-cocoa --disable-video-wscons --disable-video-vivante --disable-oss --disable-video-xbios --disable-video-gem --disable-video-opengl --disable-directx --disable-pulseaudio --build=x86_64 --host=arm-linux-gnueabihf

make install 

make(-j4)

接下来编译ffmpeg3.2.12(版本要匹配!!!)

./configure --prefix=/home/user/arm --enable-shared --enable-ffserver --enable-ffplay --enable-ffprobe --enable-gpl --enable-libx264 --cross-prefix=arm-linux-gnueabihf- --enable-cross-compile --arch=arm --disable-stripping --extra-cflags=-I/home/user/arm/include --extra-ldflags=-L/home/user/arm/lib --extra-libs=-lSDL2 --extra-libs=-ldl --target-os=linux

make install 

make(-j4)

至此,ffmpeg3.2.12+sdl2.0编译成功

以上所有用到的依赖库资源:https://download.csdn.net/download/weixin_42550424/10855778

基于ffmpeg2.3.6+sdl1.2实现的播放网络摄像头和本地文件的代码:

自己修改的播放本地文件代码,可播放网络摄像头:https://download.csdn.net/download/weixin_42550424/10855599

基于该程序修改的程序(简单的播放器):https://blog.csdn.net/leixiaohua1020/article/details/8652605

猜你喜欢

转载自blog.csdn.net/weixin_42550424/article/details/84976723