主要难点是
1、如何编译出ffmpeg和nginx
2、编译好ffmpeg和nginx如何移到开发板
3、usb摄像头缺少设备节点怎么处理
1、buildroot构建IMX6ULL文件系统(含QT5)_风轻云淡的博客-CSDN博客_buildroot qt2
2、百问网韦东山老师【物联网实战项目】手把手教你如何从0搭建智慧家居中的视频监控系统
3、【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.6
4、100ask_imx6ull视频监控项目-流媒体方案的实现之Nginx(四)_Jocelin47的博客-CSDN博客_imx6ull项目
硬件:韦东山 imx6ull pro开发板、USB免驱摄像头(非韦东山店铺所售那个,随便买的)
交叉编译链:确保已经配置好交叉编译环境,基础内容此处不赘述
源码:正点原子提供的buildroot 2019.2源码,可在下列链接里找到
i.MX6ULL Linux阿尔法开发板 — 正点原子资料下载中心 1.0.0 文档
【正点原子】阿尔法Linux开发板(A盘)-基础资料\01、例程源码\08、buildroot源码
复制源码到ubuntu中,然后解压tar -vxjf buildroot-2019.02.6.tar.bz2
进入buildroot目录,然后make clean 然后 make menuconfig打开图形配置界面
配置后如下图所示
跟着下图进行配置
Toolchain
-> Toolchain type = External toolchain
-> Toolchain = Custom toolchain //用户自己的交叉编译器
-> Toolchain origin = Pre-installed toolchain //预装的编译器
-> Toolchain path =/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf
-> Toolchain prefix = $(ARCH)-linux-gnueabihf //前缀
-> External toolchain gcc version = 6.x
-> External toolchain kernel headers series = 4.6.x
-> External toolchain C library = glibc/eglibc
-> [*] Toolchain has SSP support? (NEW) //选中
-> [*] Toolchain has RPC support? (NEW) //选中
-> [*] Toolchain has C++ support? //选中
-> [*] Enable MMU support (NEW) //选中
4.1先把第一项Tooolchain type配置成External toolchain,才会出现其他选项
4.2其中有差异的主要是Toolchain path,这个需要根据自己用的交叉编译链设置对应路径
4.3 然后gcc version 和 kernel headers series我的ubuntu环境分别是6.x和4.6.x,需要根据自己的环境来配,如果配错了,编译时会报错提示说希望是什么版本,但是实际检测到什么版本,根据提示检测到的实际版本,回去配置修改即可
System configuration
-> System hostname = alpha_imx6ull //平台名字,自行设置
-> System banner = Welcome to alpha i.mx6ull //欢迎语
-> Init system = BusyBox //使用 busybox
-> /dev management = Dynamic using devtmpfs + mdev //使用 mdev
-> [*] Enable root login with password (NEW) //使能登录密码
-> Root password = 123456 //登录密码为 123456
-> Filesystem images
-> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4
-> ext2/3/4 variant = ext4 //选择 ext4 格式
-> [*] ubi image containing an ubifs root filesystem //如果使用 NAND 的话就用 ubifs
主要为了提高编译速度,默认我看了是没有选的,可以去看看确认下
-> Kernel
-> [ ] Linux Kernel //不要选择编译 Linux Kernel 选项
-> Bootloaders
-> [ ] U-Boot //不要选择编译 U-Boot 选项!
ffmpeg用于处理输入视频数据和推流,功能强大
音频相关库
Target packages → Libraries → Audio/Sound
音频相关应用
Target packages → Audio and video applications
选中后回车进去把能选的都选上
视频处理核心应用
Target packages → Audio and video applications
选中后,回车进去,把能选的都选上
Target packages → Networking applications
9.1需要下拉找到nginx后选中
9.2 选中后回车进去nginx配置,把里面所有配置项,都选中
9.3 然后在additional modules项回车
添加http-flv模块:$(TODIR)/dl/nginx/nginx/nginx-http-flv-module
9.4 去掉lighttpd服务
默认已经去掉了,主要是防止和nginx并存,可以看看确认下
Target packages → Networking applications
不要直接退出,万一操作失误没保存,1234上面的配置再来一次
在buildroot下创建目录 dl/nginx,在该目录下,输入下列命令获取模块源码
git clone https://github.com/winshining/nginx-http-flv-module.git
在buildroot源码根目录下 sudo make
1、Toolchain中编译工具路径弄错
2、Toolchain中g编译链或者kernel版本弄错
编译后,在output/images目录下会有rootfs.tar
复制rootfs.tar 到ubuntu某个路径下并解压tar -vxf rootfs.tar,准备复制需要的文件
解压后,得到下列文件
这一步是简单且繁琐的
1、先检查开发板有没有自带ffmpeg
输入ffmpeg,如果提示命令搜不到就是没有,如果出来一堆使用说明的话,说明自带了那2步可跳过
2、假设开发板没有自带ffmpeg,那就需要复制了
2.1复制 usr/bin 目录下的ffmpeg到开发板/usr/bin目录下
2.2运行ffmpeg
此时会报错缺少库文件或其他依赖
2.3 报错提示缺少文件后,从解压出来的rootfs中find -name "*xxxx*"查找,xxx是文件的名称,找到后,复制到开发板相同的目录下
2.4 复制后然后运行ffmpeg,还提示缺少其他库文件的话,继续重复2.3步骤,直到命令正常运行出现下列信息
可能有的开发板会自带nginx,但是因为缺少对RTMP推流的支持,所以我们还是用自己编译好的
在解压出来的rootfs的usr/sbin/路径下找到nginx,复制到开发板/usr/sbin/路径下
执行nginx,会报错提示找不到需要的文件
可以用下面提供的命令复制,也可以自己从解压出来的rootfs中find -name "*xxxx*"查找,xxx是文件的名称,找到后,复制到开发板相同的目录下
cp usr/libxslt.so.1 libgd.so.3 /usr/lib //复制缺少的库文件
cp etc/nginx /etc/ -rf //复制配置文件
mkdir /var/log/nginx //创建日志目录
cp etc/init.d/S50nginx /etc/init.d/ //好像是叫服务文件?
vi /etc/nginx/nginx.conf
2.1 修改worker_processes改为auto
2.2 增加下列代码
rtmp{
server{
listen 1935;
chunk_size 4096;
application live{
allow publish 127.0.0.1;
allow play all;
live on;
record off;
meta copy;
}
}
}
2.2 http 里面添加红色框选项
注意这里复制进去运行时经常提示unkonw错误,对有问题的提示行可手动敲到配置文件里
location /test{
flv_live on;
chunked_transfer_encoding on;
add_header 'Access-Control-Allow-Origin''*';
add_header 'Access-Control-Allow-Credentials''true';
}
/etc/init.d/S50nginx restart
如果修改的配置文件格式异常,就会报错,请根据提示修改或者百度下
我遇到的错误
1)提示unknown directive "",好像和编码格式有关,好像是因为复制WINDOW 的txt文件就会出现
2)提示格式不对,这种需要根据提示处理了,可能复制的过程多些额外的符号
网上看其他教程,这个时候在浏览器上输入IP地址,就会出现nginx的信息,我测试只有404
1、开发板输入:ffmpeg -re -i 123.mp4 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/wei
其中123.MP4是我的测试视频
2、启动VLC media player(百度后下载)
打开网口串流,输入:rtmp://192.168.1.3/live/wei
或者:http://192.168.1.3/test?app=live&stream=wei
然后点击左下角的播放,即可看到画面
1、插入USB免驱摄像头检查是否有video1节点
ls /dev/video*
如果 插入摄像头后没有设备节点video1,按以下方法处理:
原因是因为内核没有自动加载相关驱动,我的方法是重新配置linux内核,把USB Video Class(UVC)从M改为*
进入linux源码,make menuconfig打开图形界面
路径Device Drivers → Multimedia support → Media USB Adapters
make zImage -j4 编译好linux内核后把arch/arm/boot/zImage替换到开发板/boot/zImage
2、开发板对摄像头数据推流
ffmpeg -f v4l2 -framerate 10 -i /dev/video1 -q 10 -f flv rtmp://127.0.0.1/live/wei
3、启动VLC media player(百度后下载)
打开网口串流,输入:rtmp://192.168.1.3/live/wei
或者:http://192.168.1.3/test?app=live&stream=wei
然后点击左下角的播放,即可看到画面
参考以下文章
使用flv.js快速搭建html5网页直播_impingo的博客-CSDN博客_flv html
根据上面文章提供的百度网盘链接下载测试网页
链接: 百度网盘 请输入提取码
提取码: gd55
解压后打开里面的index.html
在Stream URL栏输入http://192.168.1.3/test?app=live&stream=wei
点击右边按钮Swotch URL后,再点击左下角的Load按钮,正常的话即有视频。建议这里先用视频文件测试不要用摄像头,因为摄像头比较卡
我自己弄的时候一开始总是显示不了,发现是添加到nginx.conf的命令敲错了,请重点检查下图位置
测试用摄像头推流,浏览器显示一直不成功,研究中。。。