最近由于项目上需要一个摄像头在线预览的功能,于是便琢磨了一个小玩意出来分享分享。项目是在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. jQuery遍历(1)

    jQuery 遍历,意为“移动”,用于根据其相对于其他元素的关系来“查找”(或选取)HTML 元素.以某项选择开始,并沿着这个选择移动,直到抵达您期望的元素为止. 图示解释: 举例: jQuery p ...

  2. 对于Element-ui分页进行再次的封装使用

    这是我项目的分页的目录结构,话不多说,直接上代码. <template> <div class="pagination-container"> <el ...

  3. BPM FlowPortal 开发环境及发布环境的配置

    开启开发模式 开发时应设置防缓存和调试信息输出. 开发后发布 开发完成后正式使用时,除了对以上各项做相反设置外,还需设置web.config中的JSVersion,使每个用户都能自动下载最新版的js文 ...

  4. git命令——revert、reset

    参考:如何在 Git 中重置.恢复,返回到以前的状态 使用git时,如果对刚刚提交的后悔了怎么办,如何撤销? 方法一:手动修改 你把新增的文件删了 或者 更改过的文件再改回来,然后再commit一次. ...

  5. Make 和 Makefile快速入门

    前言 一个项目,拥有成百上千的源程序文件,编译链接这些源文件都是有规则的.Makefile是整个工程的编译规则集合,只需要一个make命令,就可以实现“自动化编译”.make是一个解释makefile ...

  6. Linux中条件语句

    Linux中备份一个jar包,需要既判断进程是否停止,又判断文件是否存在 1. 进程停了,文件存在则备份 2.进程停了,文件不存在,无需备份 3. 进程在跑,停止进程:文件存在,将文件进行备份 4. ...

  7. Scala配置环境变量Linux

    1.下载.上传并解压scala-2.11.6.tgz 2.配置环境变量vim /etc/profile 增加如下代码: export SCALA_HOME=/usr/scala/scala-2.11. ...

  8. redis在本地进行启动的方式

    第一种 使用cmd命令行进行过操作 在本地配置好redis之后,启动的话是比较简单的 1-首先打开cmd运行界面 2-定位到本地redis目录 3-运行命令redis-server.exe redis ...

  9. python学习之面向对象

    目录 __main__,__name__ __module__,__class__ __init__ __del__ __repr__,__str__ __mro__ __call__ __new__ ...

  10. ajax二进制流乱码图片解决方法

    仅供自己参考 参考博客 在请求成功的地方 添加以下代码: var blob=new Blob(); blob=this.response; 既然二进制数据拿到了,那么要把它放在一个 html标签中,并 ...