最近由于项目上需要一个摄像头在线预览的功能,于是便琢磨了一个小玩意出来分享分享。项目是在win上,合作的人懂js,基于这样的情况,我只选择nodejs作为开发。并未使用php相关。

一开始做这个,我并不感到陌生,因为我以前使用过开源的解码器FFmpeg,所以我知道使用它就可以实现摄像头的rtsp流转hls,只要转成hls了,我就可以使用开源的video-js-control-hls来播放m3u8文件了,而且我司用了海康的软件产品,它们就是开放接口,通过请求接口获取在线播放文件。思路是很清晰的,那我有了这样的思路,并开始在npmjs.com里面找轮子

经过一番的查找,最后我选定了几个轮子。首先是fluent-ffmpeg这个操作ffmpeg的中间件,然后就是hls-server这个http服务,它过滤所有和hls无法的资源,只保留.m3u8和.ts资源。那这样的话,轮子有了,那下面就是去熟悉一下理论知识(音视频转码、ffmpeg等)

浏览了大概的理论知识后,那再接着就是细节的优化了。细节问题我在做之前发了一个思否的提问(链接:做一个海康摄像头转hls然后使用h5方式播放的细节问题),心寒的是,平名无法被人看到,知识就是力量,力量不够就有问题,所以我开始自己的琢磨(基本上那几天晚上都在想)。

琢磨了几天后,我找到了几个关键点:

什么时候开始转码(服务启动就转码还是接口发送后收到转码通知在转码) 当然是接口发送后收到转码通知在转码
什么时候没人看了,关闭转码服务,清理播放文件 用户观看的时间作为更新时间,服务端建立一个心跳检测,当超过设置时间没人看,就治理ffmpeg进程和播放文件
如果生成的播放文件,一直没人看,那也要关闭转码服务,清理播放文件 记录播放文件观看的时间,如果有人看,就更新这个时间,服务端建立一个心跳检测,当超这个时间超过过设置时间没人看,就治理ffmpeg进程和播放文件
是否加入缓存 一开始没加,每次请求都生成新的播放文件,后面考虑到我们是应用层开发,不是c++这些,所以还是加缓存,当关闭转码服务,清理播放文件的条件满足时,同时也清理缓存的url

当我完成了这个版本后,我发现不够好,为什么不够好呢,因为开始转码到生成播放文件,我在我的电脑和服务器上测试的平均时间是在11秒左右,最好的时候是3秒。我们在保证服务器配置的同时应该在思考有没有优化的空间。我这个版本就是api请求,然后使用fluent-ffmpeg的方法去创建ffmpeg进程,fluent-ffmpeg使用pipe向进程输入命令。那我就想了,我能否预先的生成ffmpeg进程并让它挂起(就是做ffmpeg进程池),然后api请求,我从进程池里面拿一个出来用,当自动清理时,我不再关闭进程,而是使用信号暂停进程。我想这样的方式,应该会加快生成播放文件的时间,减少api等待的时间。

目前的话,我开始研究fluent-ffmpeg的源码,感觉从它这里还没找到方法,我于是自己操作了一个示例,我在启动tcp后,使用

  1. child_process.spawn建立ffmpeg进程,参考代码:

  2. server.on("listening", () => {
    console.log('listening');
    const args = ['-i', 'pipe:0', '-f', 'mp3', '-ac', '2', '-ab', '128k', '-acodec', 'libmp3lame', 'pipe:1'];
    for (let i = 0; i < 10; i++) {
    const ffmpeg = spawn('ffmpeg', args);
    pools[i] = ffmpeg;
    }
    });

理论上是可以的了,而且这样创建的进程是挂起的,我后续在关键参数加管道,后面应该就可以实现了吧,暂时在研究中,如果研究成功,我会发布第二版本。

最后,我附上一个git地址给大家吧,代码写的不咋样,见笑了:hk-hls

原文链接:http://jcycms.boomyang.cn/article/view/51

h5播放rtsp流的更多相关文章

  1. 浏览器无插件播放rtsp流解决方案

    1. 安装 FFmpeg 参考 CentOS下安装FFmpeg,特别详细. 我遇到的错误和解决办法: 缺少lame ffmpeg+libmp3lame库源码安装教程(CentOS) make ffmp ...

  2. 使用vlc播放器播放rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器播放rt ...

  3. HTML5播放RTSP,H5播放RTSP,解决方案源码,基于海康网络摄像头

    视频是用的海康网络摄像头(支持RTSP,标准H.264 RTP封装的设备),可以通过 rtsp://admin:1008@192.0.0.64:81/h264/ch1/main/av_stream   ...

  4. 提供HTML5播放RTSP流 提供微信播放RTSP流 HTML5支持rtsp web播放rtsp,微信支持rtsp

    首先H5的video不支持RTSP播放,以下是html5的video官方介绍 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(O ...

  5. 用vlc SDK创建一个播放视频文件和RTSP流视频的Demo

    #include <stdio.h> #include <tchar.h> #include <time.h> #include <windows.h> ...

  6. 使用Gin+WebSocket在HTML中无插件播放RTSP

    在后台的开发中遇到了对接显示摄像头视频流的需求.目前获取海康及大华等主流的摄像头的视频流使用的基本都是RTSP协议.不过HTML页面并不能直接播放RTSP协议的视频流,查询了一番各种网页播放RTSP的 ...

  7. [转] web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!

    需求 问题:有没有flash播放RTSP的播放器?H5能不能支持RTSP播放? 答案:没见过,以后估计也不会有: 问题:可以自己做浏览器插件播放RTSP吗? 答案:可以的,chrome做ppapi插件 ...

  8. web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!

    本文转自:http://www.cnblogs.com/babosa/p/7355468.html 需求 问题:有没有flash播放RTSP的播放器?H5能不能支持RTSP播放? 答案:没见过,以后估 ...

  9. web网页中使用vlc插件播放相机rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 使用vlc播放器播放rtsp视频 使用vlc进行二次开发做自己的播放器 vlc功能还是很强大的,有很多的现成的二次开发接口,不需配置太多即可轻松做客户端播放 ...

随机推荐

  1. Java 之 注解

    一.注解介绍 注解概念:注解是说明程序的,给计算机看的. 注释概念:用文字描述程序的,给程序员看的. 注解定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是 JDK1.5 及以后 ...

  2. spark 机器学习 ALS原理(一)

    1.线性回归模型线性回归是统计学中最常用的算法,当你想表示两个变量间的数学关系时,就可以用线性回归.当你使用它时,你首先假设输出变量(相应变量.因变量.标签)和预测变量(自变量.解释变量.特征)之间存 ...

  3. Linux磁盘管理——虚拟文件系统

    前言 Linux支持众多文件系统,包括: 传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等:日志式文件系统: ext3 / ...

  4. 2019-ACM-ICPC-南昌区网络赛-H. The Nth Item-特征根法求通项公式+二次剩余+欧拉降幂

    2019-ACM-ICPC-南昌区网络赛-H. The Nth Item-特征根法求通项公式+二次剩余+欧拉降幂 [Problem Description] ​ 已知\(f(n)=3\cdot f(n ...

  5. 基于Java+Selenium的WebUI自动化测试框架(三)------记录LOG

    在有了Position类和接口类之后,我们是不是立刻就要着手开始写实现类了呢?按照一般的顺序是这样.但是,我们这里先停一下.原因有二: 1)既然是写一个框架,我们希望总体的功能上是全面的.实现类中,我 ...

  6. 华为OJ:字符串处理

    #include <iostream> #include <stdlib.h> #include <string> #include <sstream> ...

  7. 织梦阿里云OSS解决方案

    准备工作 申请OSS账号,并且创建一个public-read的bucket.这里需要权限为public-read是因为后面需要匿名访问. 详细步骤 1.开启织梦远程附件功能2.现在织梦还有远程附件还有 ...

  8. 1. let与const

    1.ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. var a = []; for (var i = 0;i<10;i++) ...

  9. 多继承以及MRO顺序

    class A: def test(self): print("A --- test方法") def demo(self): print("A --- demo方法&qu ...

  10. 如何在C中定义多行宏定义?

    请参阅下面的示例,其中我将交换两个变量的值. do-while(0)结构很不错 #include <stdio.h> #define swap(x,y,T) do { \ T temp = ...