ffmpeg+flv视频推拉流实现(demo版)

news/2024/7/10 20:46:03 标签: ffmpeg, 音视频, javascript

前言

工作需要,记录一下前后端推拉流方案,基于HTTP-FLV协议,使用node + flv.js + ffmpeg进行前后端交互。
此方案为demo版,目的是打通前后端链路,项目应用正在研究中。

步骤

ffmpeg_4">1.安装ffmpeg

后端推流需要借助ffmpeg流媒体服务器,需要在本机安装,安装方式参考如下:

参考:https://zhuanlan.zhihu.com/p/324472015添加链接描述

2.前端代码实现

引入flv.js,更多用法参照官网

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <video id="videoElement"></video>
    <button id="btn">click</button>
    <script src="https://cdn.bootcdn.net/ajax/libs/flv.js/1.6.2/flv.min.js"></script>
    <script>
      const btn = document.getElementById("btn");
      btn.addEventListener("click", function () {
        if (flvjs.isSupported()) {
          var videoElement = document.getElementById("videoElement");
          var flvPlayer = flvjs.createPlayer({
            type: "flv",
            isLive: true,
            // 在线视频流,20230926亲测可用
            url: "ws://127.0.0.1:9999/rtsp/78910/?url=rtmp://ns8.indexforce.com/home/mystream",
          });
          flvPlayer.attachMediaElement(videoElement);
          flvPlayer.load();
          flvPlayer.play();
        }
      });
    </script>
  </body>
</html>

3.后端代码实现

后端项目自行构建,这里只提供js文件代码;
借助了express,websocket,ffmpeg组件,需要自行安装;
整体逻辑:建立前后端socket链接–》获取页面传过来的视频流–》调用ffmpeg解析并推流

var express = require("express");
var expressWebSocket = require("express-ws");
var ffmpeg = require("fluent-ffmpeg");
ffmpeg.setFfmpegPath("ffmpeg");
var webSocketStream = require("websocket-stream/stream");
var WebSocket = require("websocket-stream");
var http = require("http");

// config
let rtspServerPort = 9999;

function localServer() {
  let app = express();
  app.use(express.static(__dirname));
  expressWebSocket(app, null, {
    perMessageDeflate: true,
  });
  app.ws("/rtsp/:id/", rtspRequestHandle);
  app.listen(rtspServerPort);
  console.log("express listened on port : " + rtspServerPort);
}

function rtspRequestHandle(ws, req) {
  console.log("rtsp request handle");
  const stream = webSocketStream(
    ws,
    {
      binary: true,
      browserBufferTimeout: 1000000,
    },
    {
      browserBufferTimeout: 1000000,
    }
  );
  let url = req.query.url;
  console.log("rtsp url:", url);
  console.log("rtsp params:", req.params);
  try {
    ffmpeg(url)
      // .addInputOption("-rtsp_transport", "tcp", "-buffer_size", "102400") // 这里可以添加一些 RTSP 优化的参数
      .on("start", function () {
        console.log(url, "Stream started.");
      })
      .on("codecData", function () {
        console.log(url, "Stream codecData.");
        // 摄像机在线处理
      })
      .on("error", function (err) {
        console.log(url, "An error occured: ", err.message);
      })
      .on("end", function () {
        console.log(url, "Stream end!");
        // 摄像机断线的处理
      })
      .outputFormat("flv")
      .videoCodec("copy")
      .noAudio()
      .pipe(stream);
  } catch (error) {
    console.log(error);
  }
}

localServer();

4.结果

点击按钮后加载视频

在这里插入图片描述


http://www.niftyadmin.cn/n/5053259.html

相关文章

Kotlin小节(二)

1、安全索引取值函数&#xff1a;getOrElse和getOrNull getOrElse&#xff1a;如索引值存在&#xff0c;返回索引处数值&#xff1b;索引值不存在&#xff0c;返回lamada值 getOrNull&#xff1a;如索引值存在&#xff0c;返回索引处数值&#xff1b;索引值不存在&#xff0c…

学信息系统项目管理师第4版系列10_变更管理与文档管理

1. 文档管理 1.1. 分类 1.1.1. 开发文档 1.1.1.1. 描述开发过程本身 1.1.1.2. 可行性研究报告和项目任务书、需求规格说明、功能规格说明、设计规格说明&#xff08;包括程序和数据规格说明、开发计划、软件集成和测试计划、质量保证计划、安全和测试信息等&#xff09; 1…

Vue3.3 新特性 - 初体验

前言 Vue3.3 是 Vue.js 框架的最新版本&#xff0c;它带来了一些令人兴奋的新特性和改进。本文将对一些重要的新特性进行简要介绍&#xff0c;并通过示例代码进行说明。 Composition API Vue3.3 引入了 Composition API&#xff0c;这是一个全新的 API 风格&#xff0c;旨在…

数据库信息速递: Oracle 23C 引入了向量搜索功能,为生成式人工智能应用提供支持 (译)...

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友…

OpenHarmony装饰指定自定义组件:@BuilderParam装饰器

当开发者创建了自定义组件&#xff0c;并想对该组件添加特定功能时&#xff0c;例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法&#xff0c;将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题&#xff0c;ArkUI引入了BuilderParam装饰器&…

L10 数据库

1&#xff0c; 数据库的安装 sudo dpkg -i *.deb 2, 数据库命令&#xff1a; 1&#xff09;系统命令 &#xff0c; 都以.开头 .exit .quit .table 查看表 .schema 查看表的结构 2&#xff09;sql语句&…

掌握Vim编辑器,轻松提升编程效率

1. 什么是VIM Vim (Vi improved)是从 Vi 发展出来的一个文本编辑器&#xff0c;简单的来说&#xff0c;Vi 是老式的文本处理器&#xff0c;功能已经很齐全了&#xff0c;但还是有可以进步的地方。 之后&#xff0c;Vim 之父 Bram Moolenaar 在 Vi 的源代码基础上进行了修改&a…

常识判断 --- 科技常识

目录 力与热 光和声 航空成就 垃圾分类 百科知识 血型 二十四节气歌 春雨惊春清谷天 夏满忙夏暑相连 秋处露秋寒霜降 冬雪雪冬小大寒 力与热 光和声 航空成就 垃圾分类 百科知识 血型