dql2016 发表于 2021-11-19 21:34

【米尔MYD-YA15XC-T评测】+使用mjpg-streamer搭建网络摄像头

<div class='showpostmsg'> 本帖最后由 dql2016 于 2021-11-20 16:03 编辑

<p><span style="font-size:20px;"><strong>0、mjpg-streamer介绍</strong></span></p>

<p>mjpg-streamer是一款免费基于IP地址的视频流服务器,它的输入插件从摄像头读取视频数据,这个输入插件产生视频数据并将视频数据复制到内存中,它有多个输出插件将这些视频数据经过处理,其中最重要的输出插件是网站服务器插件,它将视频数据传送到用户浏览器中,mjpg-streamer的工作就是将其中的一个输入插件和多个输出插件绑定在一起,所有的工作都是通过它的各个插件完成的。mjpg-streamer各个文件如下:</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;(1)input_testpicture.so。这是一个图像测试插件,它将预设好的图像编译成一个头文件,可以在没有摄像头的情况下传输图像,从而方便调试程序。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;(2)input_uvc.so。此文件调用USB摄像头驱动程序V4L2,从摄像头读取视频数据。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;(3)input_control.so。这个文件实现对摄像头转动的控制接口。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;(4)output_http.so。这是一个功能齐全的网站服务器,它不仅可以从单一文件夹中处理文件,还可以执行一定的命令,它可以从输入插件中处理一幅图像,也可以将输入插件的视频文件根据现有M-JPEG标准以HTTP视频数据服务流形式输出。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;(5)output_file.so。这个插件的功能是将输入插件的JPEG图像存储到特定的文件夹下,它可以用来抓取图像。</p>

<p>mjpg-streamer优点是对RAM和CPU的消耗比较少,可以快速的传输jpeg流。</p>

<p>&nbsp;</p>

<p><span style="font-size:20px;"><strong>一、米尔SDK安装</strong></span></p>

<p>在终端执行命令:</p>

<pre>
<code class="language-bash">. /opt/st/myir/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi</code></pre>

<p>将设置好交叉编译工具链,常用的环境变量如CC。</p>

<p>&nbsp;</p>

<p><strong><span style="font-size:20px;">二、libjpeg交叉编译</span></strong></p>

<p>有些UVC摄像头只支持输出YUV原始图像,此时mjpg-streamer会将其转码为mjpeg,然后进行传输,此时会对CPU的消耗以及实时流的流畅度有影响,特别是分辨率比较大的时候。</p>

<p>因此mjpg-streamer 依赖&nbsp;libjpeg,&nbsp;libjpeg下载地址:<br />
<a href="http://www.ijg.org/files/jpegsrc.v9b.tar.gz">http://www.ijg.org/</a></p>

<p></p>

<p>目前最新版本是v9d。libjpeg交叉编译命令:</p>

<pre>
<code class="language-bash">make clean
. /opt/st/myir/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
./configure --host=arm-ostl-linux-musl --prefix=$HOME/stm32mp1/build_jpegsrc.v9d
make -j6
make install</code></pre>

<p>写成编译脚本:</p>

<p></p>

<p>编译成功后得到动态库:</p>

<p></p>

<p>&nbsp;</p>

<p>米尔MYD-YA15XC-T内核已经配置好了UVC和USB 驱动,因此无需重新配置编译内核。</p>

<p>&nbsp;</p>

<p><strong><span style="font-size:20px;">三、mjpg-streamer交叉编译</span></strong></p>

<p>mjpeg-streamer下载</p>

<p><a href="https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/" target="_blank">https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/</a></p>

<p></p>

<p>目前最新版本为r182,本次测试使用版本r63。</p>

<p>在ubuntu可通过2种命令下载代码:</p>

<pre>
<code class="language-bash">svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code</code></pre>

<p>或者</p>

<pre>
<code class="language-bash">svn checkout https://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code</code></pre>

<p>在编译前需要对源码的Makefile做以下修改:<br />
将源码的所有Makefile(包含其子目录)中的编译工具链修改为米尔开发板的编译工具链,由于在终端执行命令<strong>. /opt/st/myir/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi</strong>会设置好交叉编译相关的环境变量,因此去掉Makefile文件中的CC 即可。</p>

<p>本次测试只需要 input_uvc.so 和 output_http.so,在主目录中的Makefile里面只选择这两个,其它的去掉。</p>

<p>插件input_uvc依赖jpeg,因此修改plugins/input_uvc/Makefile文件,指定jpeg库头文件路径:</p>

<pre>
<code class="language-bash">CFLAGS += -I$HOME/stm32mp1/build_jpegsrc.v9d/include </code></pre>

<p>指定链接jpeg动态库路径:</p>

<pre>
<code class="language-bash">-ljpeg -L$HOME/stm32mp1/build_jpegsrc.v9d/lib</code></pre>

<p></p>

<p>编译成功之后,在lib目录会生成如下输入、输出动态库文件:</p>

<p></p>

<p>在mjpg-streamer-r63目录生成mjpg-streamer可执行文件:</p>

<p></p>

<p>查看一下mjpg-streamer文件信息,ARM 32位可执行程序:</p>

<p></p>

<p>将上面生成的动态库文件都复制到lib目录:</p>

<p></p>

<p>然后将lib目录里面的文件和mjpg-streamer可执行文件一起打包为app_and_lib.tar.xz,使用<strong>SCP</strong>命令将它复制到开发板home目录:</p>

<p>解压:</p>

<p>得到如下文件,使用<strong>chmod +x mjpg-streamer</strong>命令为mjpg-streamer添加可执行权限:</p>

<p></p>

<p><strong><span style="font-size:20px;">四、测试</span></strong></p>

<p>插入USB UVC摄像头,正确识别到了视频设备:</p>

<p>手动指定一下库路径:</p>

<pre>
<code class="language-bash">export LD_LIBRARY_PATH=./</code></pre>

<p>执行下列命令启动mjpg-streamer:</p>

<pre>
<code class="language-coffeescript">./mjpg_streamer -i "input_uvc.so -r 1920x1080" -o "output_http.so -w ./www"</code></pre>

<p><br />
如果是输出YUV格式的UVC摄像头,则执行命令:</p>

<pre>
<code class="language-bash">./mjpg_streamer -i "input_uvc.so -y -r 1920x1080" -o "output_http.so -w ./www</code></pre>

<p>查看图片,在浏览器输入:<br />
http://192.168.1.136:8080/?action=snapshot<br />
查看视频,在浏览器输入:<br />
http://192.168.1.136:8080/?action=stream<br />
其中192.168.1.136为开发板IP地址。</p>

<p>视频和抓拍效果如下:</p>

<p><iframe allowfullscreen="true" frameborder="0" height="450" src="//player.bilibili.com/player.html?bvid=14f4y1M7wP&amp;page=1" style="background:#eee;margin-bottom:10px;" width="700"></iframe></p>

<p>&nbsp;</p>

<p><iframe allowfullscreen="true" frameborder="0" height="450" src="//player.bilibili.com/player.html?bvid=1y34y1d792&amp;page=1" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
&nbsp;</p>

<p><span style="color:#e74c3c;"><strong><span style="font-size:24px;">附录:</span></strong></span></p>

<p><strong>MJPG简介:</strong>MJPEG全名为 &quot;Motion Joint Photographic Experts Group&quot;,是一种视频编码格式,Motion JPEG技术常用与闭合电路的电视摄像机的模拟视频信号&ldquo;翻译&rdquo;成视频流,并存储在硬盘上。典型的应用如数字视频记录器等。MJPEG不像MPEG,不使用帧间编码,因此用一个非线性编辑器就很容易编辑。MJPEG的压缩算法与MPEG一脉相承,功能很强大,能发送高质图片,生成完全动画视频等;从另一个角度说,在某些条件下,MJPEG也许是效率最低的编码/解码器之一。MJPEG与MJPG的区别:mjpeg是视频,就是由系列jpg图片组成的视频。</p>

<p>&nbsp;</p>

<p>还有一款MJPG视频流服务开源软件uStreamer:</p>

<p>&micro;Streamer is a lightweight and very quick server to stream&nbsp;<a href="https://en.wikipedia.org/wiki/Motion_JPEG" rel="nofollow">MJPG</a>&nbsp;video from any V4L2 device to the net.</p>

<p><a href="https://github.com/pikvm/ustreamer" target="_blank">https://github.com/pikvm/ustreamer</a></p>

<p></p>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2021-11-22 07:34

<p>看来这个输出插件的网站服务器插件很重要</p>

<p>其实,mjpg-streamer 是用插件的形势来完成相关的功能,主程序为 mjpg-streamer, 插件分输入和输出,输入就是取视频的方式,输出就是将内容转出的方式</p>

dql2016 发表于 2021-11-24 09:05

Jacktang 发表于 2021-11-22 07:34
看来这个输出插件的网站服务器插件很重要

其实,mjpg-streamer 是用插件的形势来完成相关的功能,主程序 ...

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>

freebsder 发表于 2021-11-25 23:40

<p>谢谢分享,收藏了!</p>
页: [1]
查看完整版本: 【米尔MYD-YA15XC-T评测】+使用mjpg-streamer搭建网络摄像头