CSDN仅用于增加百度收录权重,排版未优化,日常不维护。请访问:www.hceng.cn 查看、评论。
本博文对应地址: https://hceng.cn/2019/06/23/AM335X——USB摄像头/#more
记录使用AM335X,在LCD和Web上显示USB摄像头图像。
之前在Tiny4412上学习了UVC,并在Tiny4412的LCD上显示了USB摄像头图像。
最近需要在AM335X上,实现USB摄像头图像在LCD和Web上显示,简单记录一下。
参考之前博客博客Linux摄像头驱动2——UVC_2.2移植内核摄像头驱动里,修改drivers/media/usb/uvc/uvc_driver.c
和drivers/media/usb/uvc/uvc_video.c
。
在内核里,添加UVC驱动
Device Drivers --->
<*> Multimedia support --->
[*] Media USB Adapters --->
<*> USB Video Class (UVC)
重新编译内核,烧写。
参考之前的博客Linux摄像头驱动3——LCD显示,直接使用代码,交叉编译得到LCD显示程序video2lcd
。
把video2lcd
拷贝到AM335X里运行,发现提示报错:
Wrong JPEG library version: library is 92, caller expects 62
video2lcd
中的mjpeg2rgb.c
会用到libjpeg
库,程序里请求的是62版本的,而AM335x里比较新,为92版本,提示不兼容。
看了下LCD显示程序的源码,源码里没看到哪里对版本需求的定义,决定暂时先重新移植62版的libjpeg
库。
先下载jpegsrc.v6b.tar.gz
,编译该源码会用到libtool-1.5.22.tar.gz
,也要下载。
交叉编译libtool-1.5.22
1、因为是交叉编译,需要先创建安装路径,让生成的文件保存在该目录,避免覆盖主机的相关文件,mkdir /work/out_libtool
;
2、解压源码,tar xf libtool-1.5.22.tar.gz
;
3、进入解压目录,设置配置文件,./configure --host=arm-linux-gnueabihf --prefix=/work/out_libtool CC=arm-linux-gnueabihf-gcc
;
4、交叉编译、安装,make && make install
;
交叉编译jpegsrc.v6b
1、先创建安装路径,mkdir /work/out_jpeg
;
2、解压源码,tar xf libtool-1.5.22.tar.gz
;
3、进入解压目录,设置配置文件,./configure --host=arm-linux-gnueabihf --prefix=/work/out_jpeg CC=arm-linux-gnueabihf-gcc --enable-shared --enable-static
;
4、该程序无法自动生成一些目录,手动创建以下四个目录:/work/out_jpeg/man/man1
、/work/out_jpeg/include
、/work/out_jpeg/lib
、/work/out_jpeg/bin
;
5、将前面libtool-1.5.22
生成的libtool
和libtoolize
复制到源码根目录,cp /work/libtool/libtool /work/jpeg-6b/
、cp work/libtool/libtoolize /work/jpeg-6b/
;
6、交叉编译、安装,make && make install
;
在/work/out_jpeg/lib
会生成如下文件:
libjpeg.so libjpeg.so.62 libjpeg.so.62.0.0
在AM335x里,执行rm /usr/lib/libjpeg*
,删除AM335x的libjpeg*
相关文件,复制前面生成的文件到该目录下,因为原来/usr/lib/
下还有/usr/lib/libjpeg.so.8
和libjpeg.so.9
,其它程序(后面Web)会用到,还需要执行ln -sf /usr/lib/libjpeg.so.62 libjpeg.so.8
和ln -sf /usr/lib/libjpeg.so.62 libjpeg.so.9
,让libjpeg.so.8
和libjpeg.so.9
软链接到libjpeg.so.62
,此时/usr/lib/libjpeg*
如下:
{% codeblock lang:shell %}
-rwxr-xr-x 1 root root 134.3K Jan 1 1970 /usr/lib/libjpeg.so
-rwxr-xr-x 1 root root 134.3K Jan 1 1970 /usr/lib/libjpeg.so.62
-rwxr-xr-x 1 root root 134.3K Jan 1 1970 /usr/lib/libjpeg.so.62.0.0
lrwxrwxrwx 1 root root 22 Jan 1 00:06 /usr/lib/libjpeg.so.8 -> /usr/lib/libjpeg.so.62
lrwxrwxrwx 1 root root 22 Jan 1 00:07 /usr/lib/libjpeg.so.9 -> /usr/lib/libjpeg.so.62
{% endcodeblock %}
此时再执行video2lcd -v /dev/video0 -d /dev/fb0
即可在LCD上看到USB摄像头图像。
MJPG-streamer
是一个优秀的开源项目,它可以通过HTTP的方式访问Linux上面的兼容摄像头,从而做到远程视频传输的效果。
在Buildroot
里添加mjpg-streamer
:
Target packages --->
Networking applications --->
[*] mjpg-streamer
重新烧写根文件系统,执行以下命令启动服务:
mjpg_streamer -i "/usr/lib/input_uvc.so -d /dev/video0 -r 640x480 -f 30 -q 90 -n" -o "/usr/lib/output_http.so -w /usr/www"
打开浏览器,输入AM335X的IP:8080
即可看到默认显示界面:
在/usr/www
目录下,有很多html的示例,包括静态图片、视频图像、控制等,参考html修改,实现自定义的Web界面。
如果想要外网访问,参考之前博客黑群辉_3.2.2 反向代理frp
尝试外网访问。
最后再记录下命令参数含义。
{% codeblock lang:shell %}
In case the modules (=plugins) can not be found:
{% endcodeblock %}
得知mjpg_streamer
后需要接-i
和-o
两个参数,再分别看这两个参数提供的不同so
插件文件支持哪些选项。
可选的-h
查询帮助信息、-v
查询版本信息、-b
后台执行就不多介绍了。
输入so插件包含:input_uvc.so
、input_testpicture.so
、(input_file.so
、input_ptp2.so
、input_http.so
)
输出so插件包含:output_http.so
、(output_file.so
、output_udp.so
、output_rtsp.so
、output_viewer.so
)
其中括号部分,我这个Buildroot
的mjpg_streamer
版本没有提供。
The following parameters can be passed to this plugin:
Optional parameters (may not be supported by all cameras):
input_init() return value signals to exit
{% endcodeblock %}
基本参数:
-d
:指定video设备节点
-r
:指定分辨率,VGA或640x480类似值
-f
:指定每秒帧数
-q
:指定JPEG编码质量
-m
:指定丢弃小于该值的帧
-e
:删除除编号以外的所有帧
-n
:不要初始化Linux-UVC驱动程序的dynctrls
-l
:设置LED on/off/blink,设置auto将取决于驱动程序
-t
:设置TV-Norm pal,ntsc或secam
-u
:指定输入为UYVY格式,通过CPU将UYVC转为MJPEG,这样会消耗更多CPU
-v
:指定输入为YUV格式,通过CPU将YUV转为MJPEG,这样会消耗更多CPU
-fourcc
:使用FOURCC编解码器argopt,目前支持的编解码器是:RGBP
新版新增:
-timestamp
:使用系统时间填充帧时间戳
-softfps
:丢帧以尝试实现此FPS
图像参数:
-br
:设置图像亮度
-co
:设置图像对比度
-sh
:设置图像清晰度
-sa
:设置图像饱和度
-cb
:设置图像颜色平衡
-wb
:设置图像白平衡
-ex
:设置图像曝光
-bk
:设置图像曝光补偿
-rot
:设置图像旋转0-359
-hf
:设置图像水平翻转
-vf
:设置图像垂直翻转
-pl
:设置图像避免闪烁频率
-gain
:设置图像增益
-cagc
:设置图像色度增益控制
The following parameters can be passed to this plugin:
input_init() return value signals to exit
{% endcodeblock %}
基本参数:
-d
:指定在两帧之间的延时
-r
:指定在分辨率
The following parameters can be passed to this plugin:
input_init() return value signals to exit
{% endcodeblock %}
基本参数:
-d
:指定在两帧之间的延时(单位:s)
-f
:指定查看新JEPG文件的目录
-r
:指定读取后要删除的JEPG文件
-n
:指定除非文件名匹配忽略更改
-e
:指定目录读取现有JPG文件
The following parameters can be passed to this plugin:
input_init() return value signals to exit
{% endcodeblock %}
基本参数:
-h
:打印帮助
-u
:指定在两帧之间的延时(单位:us)
-d
:指定可用相机
The following parameters can be passed to this plugin:
input_init() return value signals to exit
{% endcodeblock %}
基本参数:
-v
:打印版本信息
-h
:打印帮助信息
-H
:指定主机地址
-p
:指定端口
The following parameters can be passed to this plugin:
output_init() return value signals to exit
{% endcodeblock %}
基本参数:
-w
:指定网页根目录(不支持子文件夹)
-p
:指定HTTP服务器的TCP端口
-l
:指定监听主机IP
-c
:指定在连接时询问的账户名、密码
-n
:指定禁用命令执行
The following parameters can be passed to this plugin:
output_init() return value signals to exit
{% endcodeblock %}
基本参数:
-f
:指定保存图片文件夹
-m
:将帧保存的mjpg文件夹
-l
:将ringbuffer中的最后一张图片链接为此固定命名文件
-d
:保存图片后延时(单位:ms)
-i
:从指定的输入插件中读取帧
仅当当前模式不是MJPG时,以下参数才会生效
-s
:环形缓冲区的大小(要保留的最大图片数)
-e
:允许ringbuffer超过此数量的限制
-c
:保存图片后执行命令
The following parameters can be passed to this plugin:
[-f | --folder ]…: folder to save pictures
[-d | --delay ]…: delay after saving pictures in ms
[-c | --command ]…: execute command after saveing picture
[-p | --port ]…: UDP port to listen for picture requests. UDP message is the filename to save
[-i | --input ]…: read frames from the specified input plugin (first input plugin between the arguments is the 0th)
output_init() return value signals to exit
{% endcodeblock %}
基本参数:
-f
:指定保存图片的文件夹
-d
:保存图片后延时(单位:ms)
-c
:保存图片后执行命令
-p
:指定UDP端口监听图片请求
-i
:从指定的输入插件读取帧
The following parameters can be passed to this plugin:
[-p | --port ]…: UDP port to listen for picture requests. UDP message is the filename to save
[-i | --input ]…: read frames from the specified input plugin (first input plugin between the arguments is the 0th)
output_init() return value signals to exit
{% endcodeblock %}
基本参数:
-p
:指定UDP端口监听图片请求
-i
:从指定的输入插件读取帧
output_init() return value signals to exit
{% endcodeblock %}
基本参数:
无