FFmpeg进行笔记本摄像头+麦克风实现流媒体直播服务,展示在浏览器上。

本文详细介绍了如何配置和使用ffmpeg获取本地摄像头RTSP流,结合EasyDarwin搭建服务器,然后通过Node.js建立WebSocket服务进行流处理和转码,最后利用flv.js在Vue前端展示实时视频流,实现摄像头直播功能。

0、本文中所用软件下载包

1、前置工作

        1.1 下载 ffmpeg,Download FFmpeg

                1.1.1配置ffmpeg如下图

                1.1.2测试ffmpeg 安装成功:ffmpeg -version

        1.1.3 使用FFmpeg获取本地摄像头设备

ffmpeg -list_devices true -f dshow -i dummy

                     video和audio地址在1.1.4会用到

        1.1.4使用FFmpeg推送RTSP视频流

ffmpeg -f dshow -i video="Integrated Webcam":audio="麦克风 (Realtek(R) Audio)" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1/test

        1.2下载easydarwin:Releases · EasyDarwin/EasyDarwin,运行EasyDarwin.exe,

 下载解压到本地后运行 EasyDarwin.exe 程序,点击运行后会弹出一个 cmd 命令,注:不要关闭弹出的命令框;在浏览器中输入 http://127.0.0.1:10008 查看是否有显示有个 web 页面,如果显示则证明打开成功。

2、node服务搭建

package.json  依赖项

{
  "name": "ssss",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "start": "nodemon --exec babel-node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/cli": "^7.20.7",
    "@babel/core": "^7.20.12",
    "@babel/node": "^7.20.7",
    "@babel/preset-env": "^7.20.2",
    "@ffmpeg-installer/ffmpeg": "^1.1.0",
    "fluent-ffmpeg": "^2.1.2",
    "nodemon": "^2.0.20",
    "websocket-stream": "^5.5.2",
    "ws": "^8.12.0"
  }
}

index.js  websocket服务器+ffmpeg转码

import { WebSocketServer } from 'ws'
import webSocketStream from 'websocket-stream/stream.js'
import ffmpeg from 'fluent-ffmpeg'
import ffmpegInstaller from '@ffmpeg-installer/ffmpeg'
// 建立WebSocket服务
const wss = new WebSocketServer({ port: 8888, perMessageDeflate: false })
ffmpeg.setFfmpegPath(ffmpegInstaller.path);
// 监听连接
wss.on('connection', handleConnection)

// 连接时触发事件
function handleConnection(ws, req) {
    // 获取前端请求的流地址(前端websocket连接时后面带上流地址)
    const url = req.url.slice(1)
    console.log(url)
    // 传入连接的ws客户端 实例化一个流
    const stream = webSocketStream(ws, { binary: true })
    // 通过ffmpeg命令 对实时流进行格式转换 输出flv格式
    const ffmpegCommand = ffmpeg(url)
        .addInputOption("-rtsp_transport", "tcp", "-buffer_size", "102400", '-analyzeduration', '10000', '-max_delay', '1000')
        .on('start', function () { console.log('Stream started.') })
        .on('codecData', function () { console.log('Stream codecData.') })
        .on('error', function (err) {
            console.log('An error occured: ', err.message)
            stream.end()
        })
        .on('end', function () {
            console.log('Stream end!')
            stream.end()
        })
        .outputFormat('flv').videoCodec('copy')//.noAudio()

    stream.on('close', function () {
        ffmpegCommand.kill('SIGKILL')
    })

    try {
        // 执行命令 传输到实例流中返回给客户端
        ffmpegCommand.pipe(stream)
    } catch (error) {
        console.log(error)
    }
}

3.前端vue框架,使用flv.js获取视频数据并渲染

package.json  依赖项

{
  "name": "a",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "core-js": "^3.8.3",
    "flv.js": "^1.6.2",
    "vue": "^3.2.13"
  },
  "devDependencies": {
    "@babel/core": "^7.12.16",
    "@babel/eslint-parser": "^7.12.16",
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-plugin-eslint": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "eslint": "^7.32.0",
    "eslint-plugin-vue": "^8.0.3"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/vue3-essential",
      "eslint:recommended"
    ],
    "parserOptions": {
      "parser": "@babel/eslint-parser"
    },
    "rules": {}
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead",
    "not ie 11"
  ]
}

vue.config.js 配置端口

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  devServer: { port: 8787 }
})

 app.vue 通过flv.js将视频流展示到页面

<template>
  <div class="wrap">
    <div @click="sound">点击播放</div>
    <video class="video" volume="0.5" controls ref="player"></video>
  </div>
</template>

<script>
import flvjs from 'flv.js' // 引入flvjs
export default {
  data() {
    return {
      player: null
    }
  },
  mounted() {

  },
  beforeUnmount() {
    // 页面销毁前 关闭flvjs
    this.player.destroy()
  },
  methods: {
    sound() {
      // 如果浏览器支持flvjs,则执行相应的程序
      if (flvjs.isSupported()) {
        this.player = null;
        // 准备监控设备流地址
        const url = 'rtsp://192.168.31.160/test'
        //ffmpeg -f dshow -i video="Integrated Webcam":audio="麦克风 (Realtek(R) Audio)" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1/test
        // 创建一个flvjs实例
        // 下面的ws://localhost:8888换成你搭建的websocket服务地址,后面加上设备流地址
        this.player = flvjs.createPlayer({
          type: 'flv',
          isLive: true,
          hasVideo: true,
          url: 'ws://192.168.31.160:8888/' + url
        })
        this.player.on('error', () => {
          //报错重置player,不重置卡着不动。
          this.player.unload()
          this.player.destroy()
          this.player = null;
          this.sound()
        })
        // 将实例挂载到video元素上面
        this.player.attachMediaElement(this.$refs.player)
        try {
          // 开始运行加载 只要流地址正常 就可以在h5页面中播放出画面了
          this.player.load()
          this.player.play()
        } catch (error) {
          console.log(error)
        }
      }
    }
  }
}
</script>

<style  scoped>
.wrap .video {
  width: 300px;
  height: 300px;
}
</style>

4.页面效果,此图是摄像头拍摄的实时画面,带麦克风声音

本文章参考以下网址:

Windows笔记本本地摄像头提供Rtsp视频流服务

FFmpeg进行笔记本摄像头+麦克风实现流媒体直播服务
html5中播放rtsp流实现监控、直播等方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值