imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验

主要难点是

1、如何编译出ffmpeg和nginx

2、编译好ffmpeg和nginx如何移到开发板

3、usb摄像头缺少设备节点怎么处理

参考资料:

1、buildroot构建IMX6ULL文件系统(含QT5)_风轻云淡的博客-CSDN博客_buildroot qt​​​​​​2

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 文档

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第1张图片

【正点原子】阿尔法Linux开发板(A盘)-基础资料\01、例程源码\08、buildroot源码

一、配置buildroot

1、解压源码

        复制源码到ubuntu中,然后解压tar -vxjf buildroot-2019.02.6.tar.bz2

2、打开配置界面

进入buildroot目录,然后make clean 然后 make menuconfig打开图形配置界面

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第2张图片

3、配置 Target options

配置后如下图所示

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第3张图片

 4、配置Toolchain

跟着下图进行配置

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) //选中

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第4张图片

4.1先把第一项Tooolchain type配置成External toolchain,才会出现其他选项

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第5张图片

4.2其中有差异的主要是Toolchain path,这个需要根据自己用的交叉编译链设置对应路径

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第6张图片

4.3 然后gcc version 和 kernel headers series我的ubuntu环境分别是6.x和4.6.x,需要根据自己的环境来配,如果配错了,编译时会报错提示说希望是什么版本,但是实际检测到什么版本,根据提示检测到的实际版本,回去配置修改即可

5、配置 System configuration

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

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第7张图片

6、配置 Filesystem images

-> 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

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第8张图片

7、禁止编译 Linux 内核和 uboot

主要为了提高编译速度,默认我看了是没有选的,可以去看看确认下

-> Kernel 
    -> [ ] Linux Kernel //不要选择编译 Linux Kernel 选项
-> Bootloaders 
    -> [ ] U-Boot //不要选择编译 U-Boot 选项!

8、ffmpeg和需要用到的依赖

ffmpeg用于处理输入视频数据和推流,功能强大

8.1 选中alsa-lib

音频相关库

Target packages → Libraries → Audio/Sound 

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第9张图片

 8.2 选中alsa-utils

音频相关应用

Target packages → Audio and video applications

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第10张图片

 选中后回车进去把能选的都选上

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第11张图片

 8.3 选中ffmpeg

视频处理核心应用

Target packages → Audio and video applications

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第12张图片

 选中后,回车进去,把能选的都选上

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第13张图片

 9、nginx配置

Target packages → Networking applications 

9.1需要下拉找到nginx后选中

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第14张图片

9.2 选中后回车进去nginx配置,把里面所有配置项,都选中

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第15张图片

9.3 然后在additional modules项回车

添加http-flv模块:$(TODIR)/dl/nginx/nginx/nginx-http-flv-module

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第16张图片

9.4 去掉lighttpd服务

默认已经去掉了,主要是防止和nginx并存,可以看看确认下

Target packages → Networking applications 

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第17张图片

10 保存配置,再退出

不要直接退出,万一操作失误没保存,1234上面的配置再来一次

11 创建nginx路径并下载模块

在buildroot下创建目录  dl/nginx,在该目录下,输入下列命令获取模块源码

git clone https://github.com/winshining/nginx-http-flv-module.git

 二、编译buildroot和处理编译出来的文件

编译

在buildroot源码根目录下 sudo make

编译时常见错误

1、Toolchain中编译工具路径弄错

2、Toolchain中g编译链或者kernel版本弄错

解压文件系统

编译后,在output/images目录下会有rootfs.tar

复制rootfs.tar 到ubuntu某个路径下并解压tar -vxf rootfs.tar,准备复制需要的文件

解压后,得到下列文件

三、复制执行文件到开发板

这一步是简单且繁琐的

复制ffmpeg

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步骤,直到命令正常运行出现下列信息

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第18张图片

配置nginx

可能有的开发板会自带nginx,但是因为缺少对RTMP推流的支持,所以我们还是用自己编译好的 

1、复制nginx相关文件

在解压出来的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/        //好像是叫服务文件?

2、修改nginx配置文件

vi /etc/nginx/nginx.conf

2.1 修改worker_processes改为auto

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第19张图片

 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错误,对有问题的提示行可手动敲到配置文件里

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第20张图片

location /test{
  flv_live on;
  chunked_transfer_encoding on;
  add_header 'Access-Control-Allow-Origin''*';
  add_header 'Access-Control-Allow-Credentials''true';
}

3  重启nginx服务

/etc/init.d/S50nginx restart

如果修改的配置文件格式异常,就会报错,请根据提示修改或者百度下

我遇到的错误

1)提示unknown directive "​",好像和编码格式有关,好像是因为复制WINDOW 的txt文件就会出现

2)提示格式不对,这种需要根据提示处理了,可能复制的过程多些额外的符号

 4 疑惑

网上看其他教程,这个时候在浏览器上输入IP地址,就会出现nginx的信息,我测试只有404

四、推流测试

验证nginxRTMP服务是否正常

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

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第21张图片

 然后点击左下角的播放,即可看到画面

摄像头推流

1、插入USB免驱摄像头检查是否有video1节点

        ls /dev/video*

      如果 插入摄像头后没有设备节点video1,按以下方法处理:

原因是因为内核没有自动加载相关驱动,我的方法是重新配置linux内核,把USB Video Class(UVC)从M改为*

进入linux源码,make menuconfig打开图形界面

路径Device Drivers → Multimedia support → Media USB Adapters 

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第22张图片

 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

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第23张图片

 然后点击左下角的播放,即可看到画面

浏览器观看

参考以下文章

使用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的命令敲错了,请重点检查下图位置

imx6ull开发板 ffmpeg nginx buildroot 摄像头推流实验_第24张图片

测试用摄像头推流,浏览器显示一直不成功,研究中。。。

你可能感兴趣的:(C,LINUX,linux,嵌入式硬件)