mjpg streamer(OpenWRT)

软件介绍

mjpg-streamer 可以通过文件或者是HTTP方式访问linux UVC兼容摄像头。

安装

  1. 在openwrt系统下,需要安装以下摄像头的驱动(需联网)。
opkg install kmod-usb2
opkg install kmod-usb-ohci           #一般BCM用的是ohci USB控制器
opkg install kmod-video-gspca-core
opkg install kmod-video-core
opkg install kmod-video-uvc            #免驱uvc摄像头
opkg install kmod-video-gspca-zc3xx    #中微星摄像头 如zc301 zc303 zc305
opkg install kmod-i2c-core 
opkg install kmod-input-core  

如果能找到 /dev/video0 的设备文件,就说明驱动已经安装成功。
如果没有成功,罗技的摄像头还可以尝试一下安装kmod-video-pwc。
在openwrt系统下面,安装mjpg-streamer很简单。

opkg install mjpg-streamer
  1. 安装完了之后,可使用下面指令运行启动
/etc/init.d/mjpg-streamer start

使用

在firefox浏览器里面输入 http://192.168.1.1:8080/?action=stream,应该能看到摄像头抓取的视频。
这个视频的帧数很低,显得摄像头反应很慢。可以修改/etc/config/mjpg-streamer里面的fps参数。
如果想在公司访问家里的摄像头,还应该修改防火墙,接受8080端口的外网请求。
添加下面配置到 /etc/config/firewall

config rule
option src              wan
option proto            tcp
option dest_port        8080
option target           ACCEPT

然后重启防火墙 /etc/init.d/firewall restart,就可以了。
外网访问摄像头的时候,如果看视频可能速度会跟不上,可以只看截屏。http://192.168.1.1:8080/?action=snapshot

:需要将192.168.1.1替换成路由器说使用的公网IP地址

mjpg_streamer启动参数

修改mjpg_streamer启动参数,在您更换摄像头或者更高分辨率等参数时,可使用下面方法进行修改。

vi etc/init.d/fscar #此文件是我自己创建,本身不存在

这里写图片描述

关于输入配置参数:

  • y是关键,默认启动是mjpeg格式,改成YUV格式
  • d指定设备
  • f 制定帧数,默认30帧
  • r指定视频大小,如320×240
  • q指定画质,默认80

关于输出参数:

  • p 指定端口
  • w 指定网页目录
  • c设置通过密码访问

免驱摄像头(UVC标准摄像头,标配使用此类摄像头),使用以下启动参数:

mjpg_streamer -b -i "input_uvc.so -r 320x240 -f 15 -y"  -o "output_http.so -p 8080 -w /web"

设置开机自启动

openwrt是基于linux内核的路由操作系统,
总结一下OpenWrt的启动流程:1.CFE->2.linux->3./etc/preinit->4./sbin/init ->5./etc/inittab ->6./etc/init.d/rcS->7./etc/rc.d/S* ->8.经过裁剪,因此与普通linux系统文件结构有所不同。为了添加摄像头装了mjpg_streamer,但是每次都要手动启动摄像头,实在是太麻烦了于是给它设置为开机自启动。
首先在/etc/init.d里添加需要启动的shell脚本

vim startCamera
#!/bin/sh /etc/rc.common  
# /init.d/startCamera  
START=50  
start()  
{  
mjpg_streamer -b -i "input_uvc.so -r 320x240 -f 15 -y "  -o "output_http.so -p 8080 -w /web"
}  
stop()  
{  
kill all startCamera  
}  

之后还需要在rc.d目录下做一个链接,启动时系统会按顺序启动rc.d目录下的脚本链接,对应执行init.d目录下的启动脚本。
(1) 进入etc文件夹

cd /etc

(2) 命令:

ln -s init.d/startCamera  rc.d/S50startCamera

重启,即可
现在实现了开机自启动
如果想关闭的话 直接杀进程就可以了
服务启动

/etc/init.d/mjpg-streamer enable 是设置开机自动启动
/etc/init.d/mjpg-streamer disable 是禁止开机自动启动
/etc/init.d/mjpg-streamer start 是现在启动
/etc/init.d/mjpg-streamer restart 重启
/etc/init.d/mjpg-streamer stop 停止
service mjpg-streamer start

设置开机自动启动服务

/etc/init.d/mjpg-streamer enable

立即启动服务

/etc/init.d/mjpg-streamer start

很像ser2net,即便拔掉摄像头再插上也会识别。

配置用户名和密码

mjpg-streamer 还可以使用用户名和密码来访问。
修改 /etc/init.d/mjpg-streamer 中的

[ $enabled -gt 0 -a -c $device ] && sleep 3 && $SSD -S -m -p $PIDF -q -x $PROG -- --input "input_uvc.so --device $device --fps $fps --resolution $resolution" --output "output_http.so --port $port" &为[ $enabled -gt 0 -a -c $device ] && sleep 3 && $SSD -S -m -p $PIDF -q -x $PROG -- --input "input_uvc.so --device $device --fps $fps --resolution $resolution" --output "output_http.so --port $port -c user:pass" &

最后添加的部分就是用户名和密码,中间用冒号分割。重新启动mjpg-streamer,保证配置生效。

/etc/init.d/mjpg-streamer restart
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在Qt中实现mjpg streamer,可以使用Qt的网络模块和多线程技术。 首先,需要创建一个Qt网络服务器,用于接收客户端的请求。在服务器的槽函数中,可以使用Qt的多线程技术创建一个新的线程,用于发送mjpg流数据。在线程中,需要不断地读取摄像头的数据,并将数据转换成mjpg格式的数据流,然后通过网络发送给客户端。 具体的实现步骤如下: 1. 创建一个Qt网络服务器,用于接收客户端的请求; 2. 在服务器的槽函数中启动一个新的线程; 3. 在新线程中,使用OpenCV读取摄像头的数据,并将数据转换成mjpg格式的数据流; 4. 将mjpg数据流通过网络发送给客户端; 5. 循环执行步骤3和4,直到服务器停止。 注意事项: 1. 在多线程中操作摄像头需要加锁,避免多个线程同时访问同一个资源; 2. 不同的浏览器对mjpg流的支持不同,需要测试不同浏览器的兼容性; 3. 需要注意线程的退出条件,避免线程一直运行导致程序崩溃。 参考代码如下: ```cpp #include <QtNetwork> #include <QThread> #include <opencv2/opencv.hpp> class MJPGServer : public QTcpServer { Q_OBJECT public: explicit MJPGServer(QObject *parent = nullptr) : QTcpServer(parent) { listen(QHostAddress::Any, 8080); qDebug() << "Server started"; } protected: void incomingConnection(qintptr socketDescriptor) override { qDebug() << "New connection: " << socketDescriptor; MJPGThread *thread = new MJPGThread(socketDescriptor); connect(thread, &MJPGThread::finished, thread, &MJPGThread::deleteLater); thread->start(); } }; class MJPGThread : public QThread { Q_OBJECT public: explicit MJPGThread(qintptr socketDescriptor, QObject *parent = nullptr) : QThread(parent), socketDescriptor(socketDescriptor) { } private: qintptr socketDescriptor; void run() override { QTcpSocket socket; if (!socket.setSocketDescriptor(socketDescriptor)) { qDebug() << "Error setting socket descriptor"; return; } cv::VideoCapture cap(0); if (!cap.isOpened()) { qDebug() << "Error opening camera"; return; } while (!socket.isWritable()) { msleep(1000); } socket.write("HTTP/1.0 200 OK\r\n"); socket.write("Server: MJPGServer\r\n"); socket.write("Connection: close\r\n"); socket.write("Max-Age: 0\r\n"); socket.write("Expires: 0\r\n"); socket.write("Cache-Control: no-cache, private\r\n"); socket.write("Pragma: no-cache\r\n"); socket.write("Content-Type: multipart/x-mixed-replace; boundary=--frame\r\n\r\n"); cv::Mat frame; std::vector<uchar> buffer; std::vector<int> params; params.push_back(cv::IMWRITE_JPEG_QUALITY); params.push_back(80); while (socket.state() == QTcpSocket::ConnectedState) { cap >> frame; if (!frame.empty()) { cv::imencode(".jpg", frame, buffer, params); socket.write("--frame\r\n"); socket.write("Content-Type: image/jpeg\r\n"); socket.write(QString("Content-Length: %1\r\n\r\n").arg(buffer.size()).toUtf8()); socket.write((const char*)buffer.data(), buffer.size()); socket.write("\r\n"); } } } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MJPGServer server; return a.exec(); } #include "main.moc" ``` 上面的代码使用了Qt的网络模块和多线程技术,实现了一个简单的mjpg streamer服务器。在浏览器中访问 http://localhost:8080 即可查看摄像头的实时画面。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值