springboot 处理编码的格式为opus的音频数据解决方案【java8】
opus编码的格式概念:
Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由IETF(互联网工程任务组)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的即时声音传输,标准格式定义于RFC 6716文件。Opus格式是一个开放格式,使用上没有任何专利或限制。
Opus集成了两种声音编码的技术:以语音编码为导向的SILK和低延迟的CELT。Opus可以无缝调节高低比特率。在编码器内部它在较低比特率时使用线性预测编码在高比特率时候使用变换编码(在高低比特率交界处也使用两者结合的编码方式)。Opus具有非常低的算法延迟(默认为22.5 ms),非常适合用于低延迟语音通话的编码,像是网上上的即时声音流、即时同步声音旁白等等,此外Opus也可以透过降低编码码率,达成更低的算法延迟,最低可以到5 ms。在多个听觉盲测中,Opus都比MP3、AAC、HE-AAC等常见格式,有更低的延迟和更好的声音压缩率。
需求场景:
最近我在对接一个可以接收声音的 硬件设备,通信模式为 websocket。
通过测试 ,接收到的音频格式为 :opus 格式。
我接收到这个格式的 音频后,首先需要给这个格式的音频进行解码,然后得到PCM编码格式的数据。
解码后的 PCM 数据则是还原后的音频信号,是原始音频的近似表示,可以直接输出音频信号。
PCM解释:
PCM(脉冲编码调制,Pulse Code Modulation)编码是一种将模拟信号转换为数字信号的方法,广泛用于音频、视频和通信系统中。PCM编码的主要目的是将模拟信号的幅度表示为一系列的数字值,这样可以在数字系统中更容易地存储、处理和传输。
PCM编码的基本过程:
采样:首先,将模拟信号按一定的时间间隔进行采样。每次采样得到的值称为“采样点”。
量化:将每个采样点的模拟信号值转换成最接近的数字值。量化的精度由量化位数(通常是8位、16位或更高)决定,位数越高,表示的数字精度越高,信号的失真越小。
编码:将量化后的数字信号进行二进制编码,即将每个采样点的数字值转化为二进制形式,形成一串二进制代码。
PCM的常见应用:
音频:例如CD音质的音频数据就是使用PCM编码的,通常采用44.1kHz的采样率和16位的量化深度。
通信:PCM也用于电话通信和其他语音传输领域。
视频:PCM有时也用于视频信号的音频部分编码。
对于做网站开发的我,也是第一次处理关于音频的数据,这篇文章就把我遇到的一些问题做一个分享,希望能帮助看到这篇文章的你。
这个设备提供的代码是python版本的。
但是我是使用 java语言,springboot 框架 来处理数据的。
在调试的过程中 遇到了一个问题:opus格式的音频解码的问题?
对于python来说 这个语言 有现成的包 opuslib 还是比较好处理的
# Opus音频解码
import opuslib
import opuslib.api.encoder
import opuslib.api.decoderclass OpusDecoder():def __init__(self, samplerate: int, channels: int, seq_time: float) -> None:self.samplerate = samplerate# 创建解码器self.decoder = opuslib.Decoder(fs=self.samplerate, channels=channels)self.seq_length = int(seq_time*self.samplerate*2)def decode(self, input_bytes: bytes):# 直接解码opus数据dec_output = self.decoder.decode(bytes(input_bytes), self.seq_length)# print('decode seq len: {}'.format(len(dec_output))) return dec_output
当我来使用java的时候 发现 网上java对于这个格式音频处理的相关文章非常的少,相关依赖也非常的少,至于找到的可以用的依赖,也没找到相关文档怎么使用。
通过我在 github上的搜索和 maven仓库里的寻找,终于找到了java对于 opus格式的音频的解决方案。
下面就直接上代码了:
第一步引入依赖:
<dependency><groupId>club.minnced</groupId><artifactId>opus-java</artifactId><version>1.1.1</version></dependency><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>4.1.0</version></dependency>
第二步封装 工具类:
package com.agentai.base.utils;/**** opus 解码器工具类* User: Json* Date: 2025/4/11**/
import club.minnced.opus.util.OpusLibrary;
import com.sun.jna.ptr.PointerByReference;
import tomp2p.opuswrapper.Opus;import java.io.IOException;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import java.util.Base64;public class OpusDecoder {private int samplerate;private int seqLength;private PointerByReference opusDecoder;// 加载 Opus 库 对于这个加载 opus库的 写法 文章下方 有截图的解释。static {try {// 尝试通过 OpusLibrary 加载 JAR 内的本地库if (!OpusLibrary.loadFromJar()) {throw new UnsatisfiedLinkError("未加载到 opus处理文件!");}} catch (IOException e1) {try {// 如果失败,尝试通过默认的 System.loadLibrary() 加载 找本地系统的System.loadLibrary("opus");} catch (UnsatisfiedLinkError e2) {e1.printStackTrace();}}}public OpusDecoder(int samplerate, int channels, float seqTime) {this.samplerate = samplerate;// 创建 Opus 解码器IntBuffer error = IntBuffer.allocate(4);this.opusDecoder = Opus.INSTANCE.opus_decoder_create(samplerate, channels, error);this.seqLength = (int) (seqTime * this.samplerate * 2);}public short[] decode(String base64Audio) {// 1. 解码 Base64 音频数据byte[] audioBytes = Base64.getDecoder().decode(base64Audio);// 2. 创建用于存储解码后的数据的 ShortBufferShortBuffer decodedData = ShortBuffer.allocate(1024 * 1024);// 3. 解码 Opus 数据int decoded = Opus.INSTANCE.opus_decode(opusDecoder, audioBytes, audioBytes.length, decodedData, seqLength, 0);// 4. 返回解码后的短音频数据short[] result = new short[decoded];decodedData.get(result, 0, decoded);return result;}public byte[] decodeToBytes(String base64Audio) {// 1. 解码 Base64 音频数据byte[] audioBytes = Base64.getDecoder().decode(base64Audio);// 2. 创建用于存储解码后的数据的 ShortBufferShortBuffer decodedData = ShortBuffer.allocate(1024 * 1024);// 3. 解码 Opus 数据int decoded = Opus.INSTANCE.opus_decode(opusDecoder, audioBytes, audioBytes.length, decodedData, seqLength, 0);// 4. 转换 short[] 为 byte[]short[] shortData = new short[decoded];decodedData.get(shortData, 0, decoded);byte[] byteData = convertShortToByte(shortData);return byteData; // 返回 byte[] 类型的音频数据}private byte[] convertShortToByte(short[] shortArray) {byte[] byteArray = new byte[shortArray.length * 2];for (int i = 0; i < shortArray.length; i++) {byteArray[i * 2] = (byte) (shortArray[i] & 0xFF); // 低字节byteArray[i * 2 + 1] = (byte) ((shortArray[i] >> 8) & 0xFF); // 高字节}return byteArray;}// 销毁解码器,释放资源public void close() {Opus.INSTANCE.opus_decoder_destroy(opusDecoder);}// 测试解码功能public static void main(String[] args) {// 假设这是接收到的 Base64 编码的音频数据 // 因为我的音频是先base了一下 所以我需要先用base64 解码,//如果你的音频没有 base64 这个步骤跳过即可String base64Audio = ""; // 你的音频数据流// 创建解码器对象OpusDecoder decoder = new OpusDecoder(16000, 1, 0.02f);// 解码音频byte[] decodedAudio = decoder.decodeToBytes(base64Audio);// 打印解码结果长度System.out.println("Decoded audio length: " + decodedAudio.length);// 关闭解码器decoder.close();}
}
这个工具类的封装 也是我找的依赖 看他们的源码 自己封装的,
因为 开源的相关依赖没有提供非常完整的 使用文档,所以只能自己看源码 。
下面就是我在源码里看到的:
我的理解:
java 没有现成处理这种opus格式音频的能力,也许这就是为啥网上关于java处理这个音频的的文章比较少的原因。
看到源码后,这个依赖的解决方案就是,把可以处理 opus格式的 扩展打包到 java的jar里,然后通过java 来加载 这些 扩展,然后通过java调用这些扩展里的方法从来 实现 opus格式的音频解码。
相关文章:
springboot 处理编码的格式为opus的音频数据解决方案【java8】
opus编码的格式概念: Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由IETF(互联网工程任务组)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用…...
【AI提示词】创业导师提供个性化创业指导
提示说明 以丰富的行业经验和专业的知识为学员提供创业指导,帮助其解决实际问题并实现商业成功 提示词 # Role: 创业导师## Profile - language: 中英文 - description: 以丰富的行业经验和专业的知识为学员提供创业指导,帮助其解决实际问题并实现商业…...
STM32 模块化开发实战指南:系列介绍
本文是《STM32 模块化开发实战指南》系列的导读篇,旨在介绍整个系列的写作目的、适用读者、技术路径和每一篇的主题规划。适合从事 STM32、裸机或 RTOS 嵌入式开发的个人开发者、初创工程师或企业项目团队。 为什么要写这个系列? 在嵌入式开发中,很多人刚开始都是从点亮一个…...
在 Dev-C++中编译运行GUI 程序介绍(三)有趣示例一组
在 Dev-C中编译运行GUI程序介绍(三)有趣示例一组 前期见 在 Dev-C中编译运行GUI 程序介绍(一)基础 https://blog.csdn.net/cnds123/article/details/147019078 在 Dev-C中编译运行GUI 程序介绍(二)示例&a…...
功能安全时间参数FTTI
FTTI:fault tolerant time interval故障容错时间间隔; FHTI:Fault Handling Time Interval故障处理时间间隔; FRTI:Fault Reaction Time Interval故障反应时间间隔; FDTI:Fault Detectlon Ti…...
docker镜像制作
🧱 如何将任意 Linux 系统打包为 Docker 镜像 适用场景: 本地物理机 / 虚拟机上的 Linux(如 Ubuntu、Debian、CentOS、openEuler 等);想将当前系统环境完整打包成 Docker 镜像;系统内已安装了运行环境,如 Java、Python、Nginx 等,想保留它们。✅ 步骤概览: 准备文件…...
【Pandas】pandas DataFrame iat
Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法 pandas.DataFrame.iat pandas.DataFrame.iat 是一个快速访…...
【图像分类】【深度学习】系列学习文章目录
图像分类简介 图像分类是计算机视觉领域中的一个核心问题,它涉及到将图像数据分配到一个或多个预定义类别中的过程。这项技术的目标是让机器模拟人类能够自动识别并分类图像内容。近年来,随着深度学习的发展,尤其是卷积神经网络(CNNs)的应用…...
MyBatisPlus 学习笔记
文章目录 MyBatisPlus 快速入门第一步:引入 MyBaitsPlus 起步依赖第二步:自定义的 Mapper 继承 BaseMapper 接口新增相关修改相关删除相关查询相关 Mp 使用示例 MyBaitsPlus 常见注解MP 实体类与数据库信息约定Mp 实体类与数据库信息约定不符合解决方法…...
Profibus DP主站如何转Modbus TCP?
Profibus DP主站如何转Modbus TCP? 在现代工业自动化系统中,设备之间的互联互通至关重要。Profibus DP 和 Modbus TCP 是两种常见的通信协议,分别应用于不同的场景。为了实现这两种协议的相互转换,Profibus DP主站转Modbus TCP网…...
尚硅谷Java第 4、5 章IDEA,数组
第 4 章:IDEA的使用 第 5 章:数组 5.1 数组的概述 数组(Array):就可以理解为多个数据的组合。 程序中的容器:数组、集合框架(List、Set、Map)。 数组中的概念: 数组名 下标(或索…...
一些简单但常用的算法记录(python)
1、计算1-2020间的素数个数 def is_composite(num):if num < 1:return False# 从 2 开始到 num 的平方根进行遍历for i in range(2, int(num**0.5) 1):if num % i 0:return Truereturn Falsecnt 0 for num in range(1, 2021):if is_composite(num):cnt 1print(cnt)2、 …...
基于Docker容器的CICD项目Jenkins/gitlab/harbor/Maven实战
一、企业业务代码发布方式 1.1 传统方式 以物理机或虚拟机为颗粒度部署部署环境比较复杂,需要有先进的自动化运维手段出现问题后重新部署成本大,一般采用集群方式部署部署后以静态方式展现 1.2 容器化方式 以容器为颗粒度部署部署方式简单࿰…...
高并发秒杀系统设计:关键技术解析与典型陷阱规避
电商、在线票务等众多互联网业务场景中,高并发秒杀活动屡见不鲜。这类活动往往在短时间内会涌入海量的用户请求,对系统架构的性能、稳定性和可用性提出了极高的挑战。曾经,高并发秒杀架构设计让许多开发者望而生畏,然而࿰…...
(十四)安卓开发中的RecyclerView详解
在安卓开发中,RecyclerView 是一个功能强大且灵活的 UI 组件,用于高效地显示大量数据集合,如列表、网格或瀑布流。它是传统 ListView 和 GridView 的现代替代品,提供了更高的性能优化和自定义能力。RecyclerView 的核心优势在于其…...
如何设置Ubuntu服务器版防火墙
在Ubuntu服务器中,默认使用 ufw(Uncomplicated Firewall)作为防火墙管理工具。它是对iptables的简化封装,适合快速配置防火墙规则。以下是设置防火墙的详细步骤: 1. 安装与启用 ufw 安装(通常已预装&…...
根文件系统(rootfs) 制作方法(BusyBox、Buildroot、Yocto、Ubuntu Base)
以下是关于 根文件系统(rootfs) 制作的四种主流方法(BusyBox、Buildroot、Yocto、Ubuntu Base)的详细教程与对比分析,结合不同场景的需求提供具体实现步骤和关键要点。 1. BusyBox 制作 rootfs 核心特点 轻量级&…...
SAP软件FICO各种财务账期的功能用途介绍
FI会计账期 一般财务账期总账期间的控制是仅开启当前一个期间,如果月结期间应同时开启结账期间和下一期间两个期间,结账完成需立即关闭已完成结账的期间,避免凭证过账日期误记账。 设置事务码:OB52或 S_ALR_87003642 备注&#…...
蓝桥杯C++组部分填空题
P1508 - [蓝桥杯2020初赛] 门牌制作 - New Online Judge #include<bits/stdc.h> using namespace std;int main() {int res 0;for(int i 1; i < 2020; i){int num i;while(num){if(num % 10 2) res;num/10;}}cout<<res;return 0; } 624 P1509 - [蓝桥杯20…...
内联inline
一、什么是 inline? inline 的本意是: 建议编译器将函数调用处展开成函数体代码,省去函数调用的开销。 inline int square(int x) { return x * x; } 当你调用 square(5) 时,编译器可能会将其替换成 5 * 5,从而避免…...
【models】Transformer 之 各种 Attention 原理和实现
Transformer 之 各种 Attention 原理和实现 本文将介绍Transformer 中常见的Attention的原理和实现,其中包括: Self Attention、Spatial Attention、Temporal Attention、Cross Attention、Grouped Attention、Tensor Product Attention、FlashAttentio…...
基于JavaAPIforKml实现Kml 2.2版本的全量解析实践-以两步路网站为例
目录 前言 一、关于两步路网站 1、相关功能 2、数据结构介绍 二、JAK的集成与实现 1、JAK类图简介 2、解析最外层数据 3、解析扩展元数据和样式 4、递归循环解析Feature 5、解析具体的数据 三、结论 前言 随着地理信息技术的快速发展,地理空间数据的共享…...
Ubuntu搭建Pytorch环境
Ubuntu搭建Pytorch环境 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Ubuntu搭建Pytorch环境前言一、Anaconda二、Cuda1.安装流程2、环境变量&#…...
Kingbase逻辑备份与恢复标准化实施文档
背景 文章背景 本文结合实际运维经验,围绕 Kingbase 数据库在逻辑层面的备份与恢复方法进行系统性梳理,旨在为运维人员和数据库管理员提供一套清晰、高效、可落地的操作指引,提升数据库系统的可靠性与容灾能力。 第一部分 逻辑部分 1.1 全…...
二分查找5:852. 山脉数组的峰顶索引
链接:852. 山脉数组的峰顶索引 - 力扣(LeetCode) 题解: 事实证明,二分查找不局限于有序数组,非有序的数组也同样适用 二分查找主要思想在于二段性,即将数组分为两段。本体就可以将数组分为ar…...
解决opencv中文路径问题
见cv_imread函数和cv_imwrite函数 import cv2 import os import matplotlib.pyplot as plt from paddleocr import PaddleOCR, draw_ocr import numpy as np import urllib.parse # Add this import statementfrom txt_get import ImageTextExtractor# 初始化OCR,…...
Redis简介及其在Unity中的应用
一、什么是Redis? Redis(Remote Dictionary Server) 是一个开源的高性能 内存数据结构存储系统,常被用于 缓存、消息队列、排行榜、会话管理、实时分析 等。 ✅ Redis特点 基于内存,读写速度极快支持多种数据结构:String、List、Hash、Set、Sorted Set支持持久化,可将…...
Python实现批量插入PostgreSQL数据库的脚本分享
背景 上个月排查一个 Bug ,需要采集一张 PostgreSQL 的大表,测试时需要造数据。Python 比 Java 方便多了,所以用 Python写了一个批量插入 PostgreSQL 表的简单脚本。本文分享这个脚本,很简单的,就是利用 psycopg2 的 …...
一键精准采集单网页,告别手动复制粘贴
浏览某个网页时,想抓取其内容,有没有工具能避免自己手动逐个复制粘贴? 推荐使用单网页一键采集功能,可自动提取网页内容并整理成结构化数据(包括标题、正文、作者、日期、分类、标签、描述和原文网址链接等关键信息&am…...
vue入门:单文件组件数据双向绑定
文章目录 单文件组件介绍安装创建项目构建单文件组件 数据双向绑定Vue虚拟DOM的作用Vue中key属性的作用 单文件组件 介绍 单文件组件API使用文件扩展名为 .vue 的来构建组件ECMAScript 6 API 安装 Vue CLI 构建Vue -- 安装vue/cli npm install -g vue/cli-- 升级Vue CLI 包…...
接听电话,手机靠近耳朵后拿开,挂断电话,设备自动锁屏
目录 一、问题分析/需求分析 二、解决方案 一、问题分析/需求分析 先说一下大致流程: 首先是打电话过程会启动PROXIMITY(接近光传感器)用于监听手机是否到耳边,当手机到耳边时进行灭屏处理,灭屏过程中会调用到锁屏,所以最终会导致锁屏 详细流程分析: 首先根据日志看…...
代码随想录第15天:(二叉树)
一、二叉搜索树的最小绝对差(Leetcode 530) 思路1 :中序遍历将二叉树转化为有序数组,然后暴力求解。 class Solution:def __init__(self):# 初始化一个空的列表,用于保存树的节点值self.vec []def traversal(self, r…...
Matlab 汽车ABS的PID控制
1、内容简介 Matlab 199-汽车ABS的PID控制 可以交流、咨询、答疑 2、内容说明 略 摘 要 : 在 simulink 环境下对汽车防抱死制动系统进行数学建模 , 采用基于…...
若依前后端分离版之使用Swagger
记录一下使用若依前后端分离版本中,怎么使用Swagger,以帮助初学者快速入手。 1.运行项目并查看Swagger 这里自己下载项目代码,在编译器中打开运行。这个过程跳过,我们进入系统后台界面。 在系统工具、系统接口中打开Swagger页面 点击test-controller和Schemas,可展开相…...
入侵检测snort功能概述
1. 数据包嗅探与日志记录 网络流量监控:实时捕获和分析网络数据包(支持以太网、无线等)。 日志记录:将数据包以二进制格式(pcap)或文本格式存储,供后续分析。 2. 协议分析与解码 深度协议解析…...
Notepad++安装Markdown实时预览插件
具体操作 打开notepad -> 插件 -> 插件管理 -> 可用 -> “Markdown Panel” -> 安装,安装完成后工具栏点击"Markdown Panel"按钮。 注意:由于网络等原因可能安装失败 导致工具栏没出现""Markdown Panel"按钮&am…...
Swift 实现 LeetCode 254:因子组合问题的递归解法全解析
文章目录 摘要描述示例: 题解答案(Swift 实现)题解代码分析核心思路:举个例子: 示例测试及结果时间复杂度分析空间复杂度分析现实应用场景结合总结 摘要 这篇文章我们来聊聊 LeetCode 第 254 题 ——「因子的组合」。…...
Matlab 传感器加速度数据计算位移
1、内容简介 Matlab 195-传感器加速度数据计算位移 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
Ubuntu虚拟机连不上网
桥接 虚拟机Ubuntu系统必须能连接到外网,不然不能更新软件安装包 配置虚拟机网络(关机或者挂起状态) 第一步1.重启虚拟机网络编辑器(还原配置) 第二步2.重启虚拟机网络适配器(移除再添加) 启…...
大模型论文:Language Models are Unsupervised Multitask Learners(GPT2)
大模型论文:Language Models are Unsupervised Multitask Learners(GPT2) 文章地址:https://storage.prod.researchhub.com/uploads/papers/2020/06/01/language-models.pdf 摘要 自然语言处理任务,例如问答、机器翻译、阅读理解和摘要&am…...
大模型本地部署系列(3) Ollama部署QwQ[阿里云通义千问]
大家好,我是AI研究者, 今天教大家部署 一个阿里云通义千问大模型。 QwQ大模型简介 QwQ是由阿里云通义千问(Qwen)团队推出的开源推理大模型,专注于提升AI在数学、编程和复杂逻辑推理方面的能力。其核心特点包括&#x…...
WPF ObjectDataProvider
在 WPF(Windows Presentation Foundation)中,ObjectDataProvider 是一个非常有用的类,用于将非 UI 数据对象(如业务逻辑类或服务类)与 XAML 绑定集成。它允许在 XAML 中直接调用方法、访问属性或实例化对象,而无需编写额外的代码。以下是关于 ObjectDataProvider 的详细…...
《Vue Router实战教程》12.不同的历史记录模式
欢迎观看《Vue Router 实战(第4版)》视频课程 不同的历史记录模式 在创建路由器实例时,history 配置允许我们在不同的历史模式中进行选择。 Hash 模式 hash 模式是用 createWebHashHistory() 创建的: import { createRouter,…...
Dify什么?Dify 零门槛打造专属 AI 应用
Dify 是一个专注于简化大语言模型(LLM)应用开发的开源平台,旨在帮助用户通过可视化界面和模块化工具快速构建、部署和管理 AI 驱动的应用程序。以下是其核心特点: 主要功能 可视化编排 提供直观的界面,无需深入编码即…...
【Javascript】在canvas中加载shader着色器的方法(开箱即用)
功能简介 可以播放,暂停shader代码,可以在js中配置shader参数(下面案例列举了所有可用参数形式)缺点 这个是固定机位,没有自定义顶点着色器部分的功能,有需要可直接在class中改,或者修改后调用…...
华为华三模拟器解决兼容问题Win11 24H2 现在使用ENSP的问题解决了
一、Win11 24H2 现在使用ENSP的问题解决了 这个Win11 的 24H2不能使用ENSP的问题已经困扰我们很久了,在之前的文章中,我们也有说明这个问题 之前ENSP肯定启动会报错40 当时还建议大家先不要更新到win11的24H2版本,现在终于迎来了更新&#…...
五、用例篇
Bug等级:崩溃、严重、一般、次要 bug的生命周期 面试高频考题:跟开发产生争执怎么办? (1)反思自己,是不是bug描述写的不清楚 (2)站在用户思考问题,反问开发人员:“如果你是用户,你能接受这样…...
Mysql中的数据类型和语句概述
Mysql中的数据类型 数值类 整数:int,四个字节构成 浮点型:float单精度浮点数,四个字节,double双精度浮点数,八个字节,decimal用于高精度计算,尤其是在金融领域。decimalÿ…...
Vue3连接MQTT作为客户端
先下载依赖 npx --yes --registry https://registry.npmmirror.com npm install mqtt 在src的api创建 mes.js // 导入axios import axios from axios;// 定义一个变量,记录公共的前缀, baseURL const baseURL http://localhost:8080; const instance axios.create({ base…...
VLC快速制作rtsp流媒体服务器
1.安装vlc media player工具 2.打开后点击菜单 媒体->流 3.添加mp4视频,选择串流 4.选择 下一个 5.新目标选择 RTSP,点击添加按钮 6.端口和路径随便填写,如果推流失败就换个端口。一路操作下去 7.点击 流 按钮后,就可以看到下图…...