最近由于项目上需要一个摄像头在线预览的功能,于是便琢磨了一个小玩意出来分享分享。项目是在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. 解决 VUE项目过大nodejs内存溢出问题

    今天在启动vue项目的时候报了这样一个错误, 如图所示:频繁出现此种情况,项目太大,导致内存溢出,排除代码问题外,可参照以下方式解决 // 全局安装increase-memory-limit npm ...

  2. stm32内联汇编

    首先,先看一下mdk下的混合编程的基本方法: 使用如上方法就可以进行混合编程了. 但是要特殊注意一点,个人感觉这个是直接调用一个代码段,并非一个函数,因为他不会保护调用这个代码段之前的现场.比如: 在 ...

  3. SQL SERVER-LinkServer搬迁

    选中linkserver,按F7打开对象游览器, 选中linkserver,生成脚本. 把密码填入脚本运行即可 USE [master] GO /****** Object: LinkedServer ...

  4. 初识Nginx,简单配置实现负载均衡(ubuntu + Nginx + tomcat)

    工作需要,研究了一下Nginx的反向代理实现负载均衡,网上搜了一下教程,大多含糊不清,所以写下这个,权当总结,方便日后查看,如果能恰好帮到一些需要的人,那就更好了 先说需求,域名指向搭建了Nginx的 ...

  5. 第二篇:Python基本知识

    这一篇我们简单的介绍一下Python学习的基本知识-->Python文件是如何运行.Python文件打开通常会有两行注释,那么这两行注释是什么:上篇提到的字节码,这些字节码都存储在哪?即pyc文 ...

  6. JVM学习总结

    JVM指令执行流程架构图:

  7. shell 文本替换 ---出现--- sed:-e 表达式 #1,字符 8:“s”的未知选项

    需要替换的行为: monitor.url=http://192.168.25.100:8443/rest 查询资料得知,报错是因为替换的字符串包含有分隔符/ 所以这行改一下分隔符就可以解决问题了  ( ...

  8. python 获取本机的 IP 地址,windows,linux均可

    #encoding=utf-8 #参考csdn某篇文章 import socket def get_host_ip(): """ 查询本机ip地址 :return: ip ...

  9. ZZNU - OJ - 2080 : A+B or A-B【暴力枚举】

    2080 : A+B or A-B(点击左侧标题进入zznu原题页面) 时间限制:1 Sec 内存限制:0 MiB提交:8 答案正确:3 提交 状态 讨论区 题目描述 Give you three s ...

  10. python_面向对象——类方法和静态方法

    1.类方法不能访问实例变量,只能访问类变量. class Dog(object): name = 'wdc' def __init__(self,name): self.name = name def ...