获取视频 RTMP 推流web播放

这篇具有很好参考价值的文章主要介绍了获取视频 RTMP 推流web播放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工作需要研究下市面上显示实时视频方案。这里介绍下RTMP协议。

需求获取USB摄像头,手机谁摄像头。显示到web网页上。

一、 采集摄像头

这个使用opencvSharp来采集:

nuget:

获取视频 RTMP 推流web播放,音视频

 

 var task = Task.Run(() =>
            {

                var capture = new VideoCapture(0);
                VideoCaptureProperties captureProperties = new VideoCaptureProperties();

                capture.Fps = 30;

                //苹果测试流
                //var capture = new VideoCapture("http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8", VideoCaptureAPIs.FFMPEG);
                if (!capture.IsOpened())
                {
                    ShowContent("Failed to open capture");
                    return;
                }

                //capture.Set(captureProperties, 80);

                var frame = new Mat();
                var process = new Process();
                while (true)
                {
                    capture.Read(frame);
                    if (frame.Size().Width > 0 && frame.Size().Height > 0)
                    {
                        HersheyFonts fontFace = new HersheyFonts();
                        frame.PutText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), new OpenCvSharp.Point(10, 30), fontFace, 1.0, Scalar.Red);
                        //var buffer = frame.ToBytes();
                        //byte[] bytes = frame.ToBytes(".jpg");
                        #region 压缩尺寸变小
                        //Cv2.Resize(frame, frame, new OpenCvSharp.Size(frame.Width / 2, frame.Height / 2));
                        byte[] bytes = CompressImEncode(frame); //CompressImEncodeNew(frame); //
                        //预览压缩
                        frame = Mat.FromImageData(bytes);

                        #endregion
                        MatToBitmapShow(frame);

                        MemoryStream memory = new MemoryStream();
                        memory.Write(bytes, 0, bytes.Length);
                        memory.Write(_delimiter, 0, _delimiter.Length);
                        SendTCP(memory.ToArray());
                        //Cv2.ImShow("Video", frame);
                        //Cv2.WaitKey(1);
                        // 延时一段时间
                        Cv2.WaitKey(1);
                    }
                }
            });

获取视频 RTMP 推流web播放,音视频

二、 准备RTMP 流服务器 

 这里使用 nginx-rtmp-http-flv

worker_processes  1;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;

        application live {
            live on;
            ##打开 GOP 缓存,减少首屏等待时间
            gop_cache on ; #打开GOP缓存,减少首屏等待时间
            record_max_size 1K; #设置录制文件的最大值。
            

        }
    }
}

#推流地址:rtmp://192.168.1.194:1935/live/video1
#FLV 播放地址:http://127.0.0.1:8088/flv?port=1935&app=live&stream=video1

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       8088;
        server_name  localhost;

        location / {
            add_header 'Access-Control-Allow-Origin' '*';
            root html;
            index  index.html index.htm;
        }

        location /live {
            flv_live on;
        }

        location /flv {
            add_header 'Access-Control-Allow-Origin' '*';
            flv_live on;
            chunked_transfer_encoding on;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

写推流到流媒体服务器:

string rtmp1 = "rtmp://127.0.0.1:1935/live/video1";
            string rtmp2 = "rtmp://127.0.0.1/live/test110";

            task = Task.Run(() =>
            {
                // 初始化 FFmpeg 库
                var capture = new VideoCapture(0);
                //var capture = new VideoCapture("http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8", VideoCaptureAPIs.FFMPEG);
                if (!capture.IsOpened())
                {
                    ShowContent("Failed to open capture");
                    return;
                }

                var frame = new Mat();
                var process = new Process();
                process.StartInfo.FileName = "ffmpeg";
                //aac 音频 -r 25 帧率25 -acodec aac
                process.StartInfo.Arguments = "-re -i - -vcodec libx264  -f flv " + rtmp1;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardInput = true;
                //下面这设置使其后台运行
                process.StartInfo.CreateNoWindow = true;

                process.Start();

                while (true)
                {
                    capture.Read(frame);
                    if (frame.Size().Width > 0 && frame.Size().Height > 0)
                    {
                        HersheyFonts fontFace = new HersheyFonts();
                        frame.PutText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), new OpenCvSharp.Point(10, 30), fontFace, 1.0, Scalar.Red);
                        var buffer = frame.ToBytes();

                        process.StandardInput.BaseStream.Write(buffer, 0, buffer.Length);
                        MatToBitmapShow(frame);
                        //Cv2.ImShow("Video", frame);
                        //Cv2.WaitKey(1);
                    }
                }
                process.WaitForExit();
            });

三、网页播放:

效果:

获取视频 RTMP 推流web播放,音视频

 

<!DOCTYPE html><html><head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    <title>flv.js demo</title>
    <style>
        .mainContainer {            display: block;            width: 1024px;            margin-left: auto;            margin-right: auto;
        }        .urlInput {            display: block;            width: 100%;            margin-left: auto;            margin-right: auto;            margin-top: 8px;            margin-bottom: 8px;
        }        .centeredVideo {            display: block;            width: 100%;            height: 576px;            margin-left: auto;            margin-right: auto;            margin-bottom: auto;
        }        .controls {            display: block;            width: 100%;            text-align: left;            margin-left: auto;            margin-right: auto;
        }    
        
        </style>
        </head>
        
        <body>

            <h1>FLV </h1>
    <div class="mainContainer">
        <video id="videoElement" class="centeredVideo" controls autoplay width="1024" height="576">Your browser is too old which doesn't support HTML5 video.</video>
    </div>
    <br>
    <div class="controls">
        <!--<button onclick="flv_load()">加载</button>-->
        <button onclick="flv_start()">开始</button>
        <button onclick="flv_pause()">暂停</button>
        <button onclick="flv_destroy()">停止</button>
        <input style="width:100px" type="text" name="seekpoint" />
        <button onclick="flv_seekto()">跳转</button>
    </div>
    <script src="flv.min.js"></script>
    <script>
        var player = document.getElementById('videoElement');       
         if (flvjs.isSupported()) {         
               var flvPlayer = flvjs.createPlayer({          
                      type: 'flv',            
                          "isLive": true,//<====加个这个 
                    url: 'http://192.168.1.194:8088/flv?port=1935&app=live&stream=video1',//<==自行修改
                    
                    //url: 'http://127.0.0.1:8080/live/test110.flv',
            });
        flvPlayer.attachMediaElement(videoElement);
            flvPlayer.load(); //加载
            flv_start();
        }       
         function flv_start() {
            player.play();
        }        
        function flv_pause() {
            player.pause();
        }      
          function flv_destroy() {
            player.pause();
            player.unload();
            player.detachMediaElement();
            player.destroy();
            player = null;
        }      
        function flv_seekto() {
            player.currentTime = parseFloat(document.getElementsByName('seekpoint')[0].value);
        }   

        $(function(){
            flv_start();
        });

        // setInterval(() => {
        //     if (this.player.buffered.length) {
        //         let end = this.player.buffered.end(0);//获取当前buffered值
        //         let diff = end - this.player.currentTime;//获取buffered与currentTime的差值
        //         if (diff >= 0.5) {//如果差值大于等于0.5 手动跳帧 这里可根据自身需求来定
        //         this.player.currentTime = this.player.buffered.end(0);//手动跳帧
        //     }
        //     }
        // }, 2000); //2000毫秒执行一次  

         </script>
         
        </body>
         </html>

未完待续。。。文章来源地址https://www.toymoban.com/news/detail-580833.html

到了这里,关于获取视频 RTMP 推流web播放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android音视频学习系列(九) — Android端实现rtmp推流

    Android音视频学习系列(一) — JNI从入门到精通 Android音视频学习系列(二) — 交叉编译动态库、静态库的入门 Android音视频学习系列(三) — Shell脚本入门 Android音视频学习系列(四) — 一键编译32/64位FFmpeg4.2.2 Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲

    2024年02月09日
    浏览(50)
  • Android-音视频学习系列-(九)Android-端实现-rtmp-推流(2)

    配置好之后,检查一下 AudioRecord 当前的状态是否可以进行录制,可以通过 AudioRecord##getState 来获取当前的状态: STATE_UNINITIALIZED 还没有初始化,或者初始化失败了 STATE_INITIALIZED 已经初始化成功了。 2. 开启采集 创建好 AudioRecord 之后,就可以开启音频数据的采集了,可以通过调

    2024年04月12日
    浏览(62)
  • 【音视频】基于NGINX如何播放rtmp视频流

    现阶段直播越来越流行,直播技术发展也越来越快。Webrtc、rtmp、rtsp是比较火热的技术,而且应用也比较广泛。本文通过实践来展开介绍关于rtmp如何播放。 本文重点介绍基于NGINX如何播放rtmp视频流 可以参考上一篇博文:【音视频】基于webrtc协议浏览器播放rtsp https://blog.csdn.n

    2024年01月19日
    浏览(64)
  • Qt音视频开发41-文件推流(支持网页和播放器播放并切换进度)

    本功能最初也是有一些人提过类似的需求,就是能不能将本地的音视频文件,通过纯Qt程序推流出去,然后用户可以直接在网页上播放,也可以用各种播放器播放,然后还可以任意切换播放进度,其实说白了就是个文件服务器,用户通过网络地址访问以后,告诉对方当前是媒

    2024年02月01日
    浏览(73)
  • JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并转码推流rtmp流媒体服务

    《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 本篇文章用于解决javacv接入h264/hevc裸流或者接入ps/ts流等字节流的非流媒体协议视频源接入并推流到rtmp流媒体服务。 本篇文章适用于gb28181/海康大华网络摄像机设备sdk对接以及海康大华等视频平

    2023年04月09日
    浏览(60)
  • 【音视频】基于ffmpeg对视频的切割/合成/推流

    基于FFmpeg对视频进行切割、合成和推流的价值和意义在于它提供了一种高效、灵活且免费的方式来实现视频内容的定制、管理和分发。通过FFmpeg,用户可以轻松地剪辑视频片段,根据需要去除不必要的部分或提取特定时间段的内容,从而优化观看体验和提高内容的价值。视频

    2024年01月18日
    浏览(72)
  • 音视频开发 RTMP协议发送H.264编码及AAC编码的音视频(C++实现)

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如 FMS , Red5 , crtmpserver 等。RTMP协议可用于实现直播、点播应用,通过 FMLE(Flash Media Live Encoder) 推送音

    2023年04月08日
    浏览(79)
  • Qt音视频开发42-网络推流(视频推流/本地摄像头推流/桌面推流/网络摄像头转发推流等)

    上次实现的文件推流,尽管优点很多,但是只能对现在存在的生成好的音视频文件推流,而现在更多的场景是需要将实时的视频流重新推流分发,用户在很多设备比如手机/平板/网页/电脑/服务器上观看,这样就可以很方便的将分散的视频流统一集中的流媒体服务器上,然后统

    2024年02月03日
    浏览(48)
  • 音视频 ffmpeg命令直播拉流推流

    对于不是rtmp的协议 -c copy要谨慎使用 参数:-re,表示按时间戳读取文件 参考:Nginx搭建rtmp流媒体服务器(Ubuntu 16.04)https://www.jianshu.com/p/16741e363a77 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/

    2024年02月10日
    浏览(63)
  • 音视频学习(二十一)——rtmp收流(tcp方式)

    本文主要介绍rtmp协议收流流程,在linux上搭建rtmp服务器,通过自研的rtmp收流库发起取流请求,使用ffmpeg+qt实现视频流的解码与播放。 关于rtmp协议基础介绍可查看:https://blog.csdn.net/www_dong/article/details/131026072 下载nginx 解压,将nginx-rtmp-module拷贝至nginx-1.24.0目录,如下所示:

    2024年02月03日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包