通过rtsp-simple-server和ffmpeg实现录屏并发布视频直播
Posted 病毒宇宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过rtsp-simple-server和ffmpeg实现录屏并发布视频直播相关的知识,希望对你有一定的参考价值。
最近有个项目要对B超影像做实时的视频分析,B超探头是type C接口的,我本以为跟普通摄像头一样直接在PC上获取视频信号就行了,但是经过测试发现我又天真了,B超探头回传的信号必须用他们自己的软件解码。这就悲剧了,我去搞解码肯定不可能。所以想了个简单的办法:在安装B超解码软件的电脑上录屏,并通过rtsp把视频流传输到做视频分析的电脑上实时处理。下面把安装和调试过程记录一下,希望能帮到有需要的朋友。
- 下载rtsp-simple-server
下载地址Releases · aler9/rtsp-simple-server · GitHub
- 启动rtsp-simple-server
下载完成后解压缩然后执行里面的rtsp-simple-server.exe
- 安装ffmpeg
从官网下载ffmpeg,官网地址https://ffmpeg.org/download.html
- 配置ffmpeg
解压缩ffmpeg之后,把ffmpeg-master-latest-win64-gpl\\bin\\ffmpeg.exe配置到环境变量中,用户变量和系统变量都加上。
- 启动ffmpeg
打开CMD,执行命令ffmpeg -f gdigrab -r 30 -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtsp -g 5 -an rtsp://192.168.1.195:8554/mystream
命令参数中desktop表示录屏整个桌面,也可以只录其中一部分;最后面的地址写本机IP,其他电脑看视频流的时候也要用这个IP和路径。配置参数我就不一一列举了。
- 查看rtsp流
用一台局域网内的电脑,安装个能看rtsp的播放器,播放rtsp://192.168.1.195:8554/mystream 就是前面命令里面定义的rtsp地址。此时应该可以看到安装rtsp-simple-server和ffmpeg那台电脑的桌面了。我的配置延迟大概1秒。
在rtsp-simple-server.exe上能看到客户端连接和断开rtsp的情况。
好了,大功告成!
从打开的 cv 中的图像序列创建视频
【中文标题】从打开的 cv 中的图像序列创建视频【英文标题】:create a video from image sequence in open cv 【发布时间】:2014-03-28 04:31:04 【问题描述】:我正在使用 c++ 开发开放式 cv。我有大约 30 帧图像。我需要将这些帧组合起来以获得视频。有人可以建议我方法吗?就像读取每一帧并存储在 videowriter 中一样吗?请建议
【问题讨论】:
【参考方案1】:我建议使用 ffmpeg。您可以通过编程方式或使用命令行来执行此操作。在命令行上执行此操作的示例是:
ffmpeg -start_number n -i image%d.jpg -vcodec mpeg4 test.avi
其中 n 是第一个图像编号。
【讨论】:
我想以编程方式在 open cv 上而不是在命令行上进行 我从来没有使用过 OpenCV,只有图像处理。不知道有没有可能。【参考方案2】:Tutorial how to do Videooutput
系统将询问您要使用的编解码器。有点复杂,但是SO上已经有很多编解码相关的问题了。
此代码应该可以工作(未经测试):
#include <iostream> // for standard I/O
#include <string> // for strings
#include <vector>
#include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat)
#include <opencv2/highgui/highgui.hpp> // Video write
using namespace std;
using namespace cv;
int main(int argc, char *argv[], char *window_name)
vector<Mat> images; //fill this somehow
Size S = vector[0].getSize();
VideoWriter outputVideo; // Open the output
outputVideo.open(NAME , ex=-1, 30), S, true); //30 for 30 fps
if (!outputVideo.isOpened())
cout << "Could not open the output video for write: "<< endl;
return -1;
for(int i=0; i<images.size(); i++)
outputVideo << res;
cout << "Finished writing" << endl;
return 0;
【讨论】:
将图像填充到矢量中由您决定。你可以用命令行参数来做,或者硬编码,或者用其他方式来做......以上是关于通过rtsp-simple-server和ffmpeg实现录屏并发布视频直播的主要内容,如果未能解决你的问题,请参考以下文章