0%

视频流移植

本文包含确前置准备确认、内核驱动移植、mjpeg-streamer 移植、移植中遇到的错误和可能遇到的错误、以及解决方案、配置网页显示等内容。

MJPG

MJPGMJPEG 的缩写,但是 MJPEG 还可以表示文件格式扩展名,全名为 **”Motion Joint Photographic Experts Group”**,是一种视频编码格式。
Motion JPEG 技术常用与闭合电路的电视摄像机的模拟视频信号“翻译”成视频流,并存储在硬盘上。

环境

  • 主机:Ubuntu 18.04.4 LTS
  • 目标机:Cortex-A7
  • 交叉工具链:arm-linux-gnueabihf-
  • 摄像头:OV5640

查看摄像头信息

  1. 支持 UVC (免驱)
  2. YUV 或者 MJPRG 格式输出

驱动移植

  1. 进入内核配置菜单,make menuconfig
  2. 选择
    Device Drivers -> Multimedia support -> Video capture adapters -> V4l USB devices & V4L platform devices
    Device Drivers -> Multimedia support -> V4L platform devices -> Support for timberdale Video In/LogiWIN & SoC camera support & platform camera support
    Device Drivers -> Multimedia support -> Video capture adapters -> V4l USB devices -> USB Video class (UVC) & UVC input events device support & GSPCA based webcams
    Device Drivers -> Multimedia support -> Video capture adapters -> V4l USB devices -> GSPCA based webcams -> ZC3XX USB Camera Driver
  3. 编译内核,make -j4 uImage 并拷贝到共享目录

mjpeg-streamer 移植

mjpg-stream的移植需要jpeg的库,所以需要先移植jpeg的库

jpeg 库移植

  1. 下载 jpeg 库
    http://www.ijg.org/files/jpegsrc.v8b.tar.gz
  2. 解压
    tar -xvf jpegsrc.v8b.tar.gz
  3. 配置源码
    1
    2
    3
    cd jpeg-8b
    mkdir rootfs/video/jpegarm -p
    ./configure --prefix=`home/rootfs/video/jpegarm --host=arm-linux-gnueabighf
  4. 编译安装
    1
    2
    make
    make install
  5. 拷贝库到网络文件系统中
    1
    sudo cp -arf /home/rootfs/video/jpegarm/lib/* /home/rootfs/lib

mjpg-streamer 移植

  1. 下载 mjpg-streamer
    https://sourceforge.net/projects/mjpg-streamer/
  2. 解压
    1
    2
    tar -xvf mjpg-streamer-r182.tar.gz
    cd mjpg-streamer-182
  3. 修改源码
    1
    2
    3
    4
    5
    6
    7
    8
    cd mjpg-streamer
    vim ./plugins/input_uvc/Makefile
    # CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
    # 修改为
    # CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /home/ming/rootfs/video/jpegarm/include
    # $(CC) $(CFLAGS) -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(LFLAGS)
    # 修改为
    # $(CC) $(CFLAGS) -L /home/ming/rootfs/video/jpegarm/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(LFLAGS)
  4. 编译
    1
    2
    cd mjpg-streamer-182/mjpg-streamer
    make CC=arm-linux-gnueabihf-gcc
  5. 在网络文件系统中创建文件夹并拷贝文件
    1
    2
    3
    4
    mkdir -p /home/rootfs/mjpg-streamer
    sudo cp *.so /home/ming/rootfs/mjpg-streamer -arf
    sudo cp mjpg_streamer /home/ming/rootfs/mjpg-streamer -arf
    sudo cp start.sh www/ /home/ming/rootfs/mjpg-streamer/ -arf
  6. 修改 start.sh 文件
    1
    # ./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so -w ./www" 
  7. http://开发板IP地址:8080/?action=stream 查看视频流
  8. http://开发板IP地址:8080/?action=snapshot 查看快照
  9. 修改网页源码

错误

1. make: svnversion: Command not found

电脑中缺少必要的库,需要安装必要的软件集

1
sudo apt-get install subversion  libv4l-dev  libjpeg62-dev  imagemagick

2. mjpg_streamer.c:27:28: fatal error: linux/videodev.h: No such file or directory

可能是因为内核2.6.38和以后的版本已经移除了对 v4l1 的支持,这个东西可能比较老旧了。新的头文件是 video4linux2.h;相比v4l1很多接口都变化 。
可以选择以前低版本内核,或者用新版本的mjpg-streamer-code-182

3. Init v4L2 failed !! exit fatal \n init_VideoIn failed

可能是由于摄像头支持YUV,而不是JPEG格式,需要修改start.sh文件

1
./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so -w ./www" 

4. 获得帮助

1
./mjpg_streamer -h