前言:
根据正点原子的教程,在官方提供的出厂根文件系统下很容易就实现了 《I.MX6U 嵌入式 Linux C 应用编程指南》第三十四章的视频监控项目。但是想自己从内核、根文件系统自己配置来实现整个流程,以便于在其他平台下能够迁移,而且也算是熟悉buildroot的使用。
环境:
硬件平台:正点原子imx6ull
linux kernel:linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
buildroot:2022.02.8
ffmpeg:4.4.3
nginx:v1.20.0
nginx-rtmp-module
一、内核
对于usb摄像头,需要开启v4l2以及usb摄像头的支持。
在内核目录下,使用make menuconfig ,根据如下图片进行配置
Device Drivers --->
<*> Multimedia support --->
[*] Video capture adapters --->
[*] V4L USB devices --->
<*> USB Video Class (UVC)
[*] UVC input events device support
配置完成后,开始编译make -j12
二、buildroot根文件系统
1、基本配置
参考正点原子的《Buildroot 构建 Qt 根文件系统》,使用正点原子官方提供buildroot-2022.02.8.tar,解压后,开始使用menuconfig配置。下面部分基本参考正点原子的手册,但是不开启QT。
2、配置ffmepg
开启ffmpeg,使能全部功能,虽然会占用空间大点,防止后面缺东西。
3、配置nginx
虽然《I.MX6U 嵌入式 Linux C 应用编程指南》第三十四章的视频监控项目中配置的nginx是使用交叉编译的,但是我这里参考韦东山的视频教程(流媒体方案的实现之Nginx_哔哩哔哩_bilibili 7:00左右),使用buildroot进行nginx的配置,以及使用第三方的库nginx-rtmp-modules。
- 步骤一:将nginx-rtmp-module文件夹放到<buildroot>/dl/nginx目录下。(也可也git clone GitHub - arut/nginx-rtmp-module: NGINX-based Media Streaming Server)
- 步骤二:建议删除之前编译生成的nginx,否则设置第三方模块会不生效。rm -rf <buildroot>/output/build/nginx-xxx
- 步骤三:在menuconfig下配置nginx的addtional modules添加:$(TOPDIR)/dl/nginx/nginx-rtmp-module
- 步骤四:编译 make -j12。生成的根文件系统目录为:<buildroot>/output/images
4、问题汇总
- 问题一:使用编译出来的根文件系统,nfs挂载,提示mount: you must be root
参考连接:(3条消息) buildroot制作的嵌入式Linux系统启动后不是root用户_99自由客的博客-CSDN博客
解决方案:我这里是将buildroot生成rootfs.tar解压到虚拟机中,然后使用nfs进行网络挂载。在根文件中,chmod a-s bin/busybox即可。
- 问题二:每次启动都需要输入用户密码
参考链接:我用buildroot产生的rootfs,每次启动都要登录,有什么办法可以去掉这个登录吗? / 全志 SOC / WhyCan Forum(哇酷开发者社区)
解决方案:在buildroot配置时,已经设置了账户密码均为root。此时第一次登录进入系统后,去到/bin/inittab目录下,修改console:respawn为-/bin/sh。重启即可。
- 问题三:menuconfig中配置添加ffmpeg,nginx的支持,出现无法下载所需的包
解决方案:翻墙、等一会再操作!!!多试几次,网络不好就这样。
三、测试验证
1、根据上面编译出来的内核与根文件系统,启动开发板。
2、验证是否支持usb摄像头。将摄像头插入开发板,打印如下。并且ls /dev/video*可以看到新出现的video设备,即内核配置v4l2以及usb摄像头正常。
3、测试ffmpeg。使用ffmpeg调用摄像头进行录像,测试是否正常。
ffmpeg -s 320x240 -i /dev/video2 ./test.avi
把视频传到虚拟机进行播放,能播放即正常
4、测试nginx是否添加第三方库nginx-rtmp-modules。开发板命令行输入ffmpeg -V。看到红色划线部分即添加正常。
5、配置nginx,这部分参考正点原子《I.MX6U 嵌入式 Linux C 应用编程指南》第三十四章的视频监控项目。
打开 nginx 的配置文件/etc/nginx/nginx.conf添加如下内容:
rtmp {
server {
listen 1935; # 监听 1935 端口
chunk_size 4096;
application live{allow publish 127.0.0.1;
allow play all;
live on; # 打开直播
record off; # 关闭 record
meta copy;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
hls_fragment 8s;
}
}
}
使用ffmpeg采集摄像头视频数据,发送给nginx流媒体服务器(也是imx6ull),执行如下命令:
ffmpeg -f v4l2 -video_size 320x240 -framerate 15 -i /dev/video2 -q 10 -f flv rtmp://127.0.0.1/live/mytest
此时开发板的ip地址为:192.168.124.5
pc上,使用vlc播放器拉流,播放如下地址:rtmp://192.168.124.5/live/mytest