通过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实现录屏并发布视频直播的主要内容,如果未能解决你的问题,请参考以下文章

windows环境下,搭建RTSP视频推流服务器

AndroidStudio 中使用FFMPEG

FFmpeg的常见结构体

媒体基础:在没有容器的情况下解码和显示 H264 帧

搭建USB摄像头转RTSP服务器的多种方法

centos7 ffmpeg安装