java spring 实现 下载hls(m3u8+ts)实时流并进行合并mp4和压缩

参考连接

链接: java下载m3u8视频,解密并合并ts(三)

链接: Java 下载 HLS (m3u8) 视频

首先需要了解什么是HLS

链接: HTTP Live Streaming (HLS) - 概念

链接: M3U8是什么

简单理解就是, m3u8文件存放着可供客户端播放TS 片段

简单一点说m3u8加密技术就是将原视频分割成n个.ts文件,并用一个key文件对每一个.ts文件加密,其中m3u8文件里面存储了key文件和所有的.ts文件的地址,所以我们要解密这个视频就需要以上三种文件,最后可以利用ffmpeg来合并并解压;

M3U8编码格式

m3u8基本上可以认为就是.m3u格式文件,区别在于,m3u8文件使用UTF-8字符编码。

// m3u文件头,必须放在第一行
#EXTM3U  
// 定义当前m3u8文件中第一个文件的序列号,每个ts文件在m3u8文件中都有固定唯一的序列号
// 该序列号用于在MBR时切换码率进行对齐
#EXT-X-MEDIA-SEQUENCE 
// 每个分片TS的最大的时长
#EXT-X-TARGETDURATION 
// 是否允许cache
#EXT-X-ALLOW-CACHE
// m3u8文件结束符
#EXT-X-ENDLIST 
// 分片TS的信息,如时长,带宽等
#EXTINF 
// 定义加密方式和key文件的url,用于取得16bytes的key文件解码ts文件
#EXT-X-KEY
// 提供关于PlayList的可变性的信息,对整个PlayList文件有效,是可选项。
// 格式如下:#EXT-X-PLAYLIST-TYPE:VOD(或者EVENT)。VOD表示服务器不能改变PlayList 文件;
// EVENT则表示服务器不能改变或是删除PlayList文件中的任何部分,但是可以向该文件中增加新的一行内容。
#EXT-X-PLAYLIST-TYPE 

下载hls(m3u8+ts)流程

首先下载m3u8文件

判断是否需要解密

如果内容含有#EXT-X-KEY标签,则说明这个链接是需要进行ts文件解密的,然后通过下面的.m3u8的if语句获取含有密钥以及ts片段的链接。

依次下载ts文件

注意:
如果是下载已存在的视频可以使用多线程的方式下载ts文件,但是下载的是当前正在直播实时流的时候,单线程即可

将下载的ts文件合并为mp4格式

注意:合并时保证ts文件为连续的
通过 #EXT-X-MEDIA-SEQUENCE 当前第一个TS分片的序列号 来判断下载的ts文件的连续性

代码


import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {


    /**
     * 下载索引文件信息
     *
     * @param m3u8UrlPath
     * @return 索引文件信息
     */
    public static String getM3u8FileIndexInfo(String m3u8UrlPath) {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(new URL(m3u8UrlPath).openStream(), StandardCharsets.UTF_8))) {
            StringBuilder content = new StringBuilder();
            String line;
            while ((line = in.readLine()) != null) {
                content.append(line).append("\n");
            }
            return content.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 解析索引文件中的ts列表信息
     */
    public static List<String> analysisTsList(String m3u8FileIndexInfo) {
        Pattern pattern = Pattern.compile(".*ts");
        Matcher ma = pattern.matcher(m3u8FileIndexInfo);
        List<String> list = new ArrayList<>();
        while (ma.find()) {
            list.add(ma.group());
        }
        return list;
    }


    public static void downLoadIndexFile(List<String> tsList, String folderPath, String preUrlPath) {
        for (int i = 0; i < tsList.size(); i++) {
            String ts = tsList.get(i);
            String fileOutPath = folderPath + File.separator + ts;
            try {
                downloadTs(preUrlPath + "/" + ts, fileOutPath);
                System.out.println("下载成功:" + (i + 1) + "/" + tsList.size());
            } catch (Exception e) {
                System.err.println("下载失败:" + (i + 1) + "/" + tsList.size());
            }
        }
    }

    /**
     * 下载ts文件
     *
     * @param fullUrlPath
     * @param fileOutPath
     */
    public static void downloadTs(String fullUrlPath, String fileOutPath) {
        try (InputStream inStream = new URL(fullUrlPath).openConnection().getInputStream();
             FileOutputStream fs = new FileOutputStream(fileOutPath)) {
            int byteread;
            byte[] buffer = new byte[1204];
            while ((byteread = inStream.read(buffer)) != -1) {
                fs.write(buffer, 0, byteread);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static String composeFile(List<String> tsList, String folderPath){
        String fileOutPath = folderPath + File.separator + UUID.randomUUID() + ".mp4";
        try (FileOutputStream fileOutputStream = new FileOutputStream(new File(fileOutPath))){
            byte[] bytes = new byte[1024];
            int length;
            for (String nodePath : tsList) {
                File file = new File(nodePath);
                if (!file.exists()) {
                    continue;
                }
                try (FileInputStream fis = new FileInputStream(file);) {
                    while ((length = fis.read(bytes)) != -1) {
                        fileOutputStream.write(bytes, 0, length);
                    }
                    // 删除该临时文件

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileOutPath;
    }

    public static void main(String[] args) {
        // m3u8下載地址
        String m3u8UrlPath = "https://dh5.cntv.myalicdn.com/asp/h5e/hls/1200/0303000a/3/default/cdd3da535c12447a8cdb7c8ca949b2f6/1200.m3u8";

        // 下载索引文件信息
        String m3u8FileIndexInfo = getM3u8FileIndexInfo(m3u8UrlPath);
        System.out.println("========================");
        System.out.println(m3u8FileIndexInfo);
        System.out.println("========================");

        // 解析索引文件中的ts列表信息
        List<String> tsList = analysisTsList(m3u8FileIndexInfo);

        // 这里为了测试就先下载10个吧
        tsList = tsList.subList(0, 3);

        System.out.println(tsList);

        // 依次下载ts文件

        // 下载到本地的磁盘位置
        String folderPath = "D:/file";
        // 请求ts文件的下载地址
        String preUrlPath = "https://dh5.cntv.myalicdn.com/asp/h5e/hls/1200/0303000a/3/default/cdd3da535c12447a8cdb7c8ca949b2f6";
        downLoadIndexFile(tsList, folderPath, preUrlPath);
        String mp4Path = composeFile(tsList, folderPath);
        System.out.println(mp4Path);
    }

}



测试

可以去央视网 http://tv.cctv.com/ ,找一个视频播放,打开F12查看请求的接口,找到m3u8请求地址
在这里插入图片描述

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:15
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:11.120000,
0.ts
#EXTINF:9.680000,
1.ts
#EXTINF:9.360000,
2.ts
#EXTINF:11.640000,
3.ts
#EXTINF:10.120000,
4.ts
#EXTINF:8.520000,
5.ts
#EXTINF:10.000000,
6.ts
#EXTINF:10.600000,
7.ts
#EXTINF:12.360000,
8.ts
#EXTINF:9.640000,
9.ts
#EXTINF:8.360000,
10.ts
#EXTINF:8.760000,
11.ts
#EXTINF:13.400000,
12.ts
#EXTINF:9.200000,
13.ts
#EXTINF:9.920000,
14.ts
#EXTINF:9.560000,
15.ts
#EXTINF:8.160000,
16.ts
#EXTINF:9.720000,
17.ts
#EXTINF:13.440000,
18.ts
#EXTINF:9.640000,
19.ts
#EXTINF:8.480000,
20.ts
#EXTINF:9.880000,
21.ts
#EXTINF:9.920000,
22.ts
#EXTINF:9.160000,
23.ts
#EXTINF:10.960000,
24.ts
#EXTINF:8.720000,
25.ts
#EXTINF:10.840000,
26.ts
#EXTINF:13.080000,
27.ts
#EXTINF:6.680000,
28.ts
#EXTINF:10.000000,
29.ts
#EXTINF:12.440000,
30.ts
#EXTINF:8.440000,
31.ts
#EXTINF:9.240000,
32.ts
#EXTINF:11.040000,
33.ts
#EXTINF:8.080000,
34.ts
#EXTINF:10.080000,
35.ts
#EXTINF:11.280000,
36.ts
#EXTINF:10.000000,
37.ts
#EXTINF:8.800000,
38.ts
#EXTINF:10.160000,
39.ts
#EXTINF:13.360000,
40.ts
#EXTINF:6.840000,
41.ts
#EXTINF:13.680000,
42.ts
#EXTINF:5.760000,
43.ts
#EXTINF:10.320000,
44.ts
#EXTINF:13.200000,
45.ts
#EXTINF:7.800000,
46.ts
#EXTINF:8.680000,
47.ts
#EXTINF:12.640000,
48.ts
#EXTINF:9.600000,
49.ts
#EXTINF:8.440000,
50.ts
#EXTINF:11.360000,
51.ts
#EXTINF:7.960000,
52.ts
#EXTINF:10.840000,
53.ts
#EXTINF:9.240000,
54.ts
#EXTINF:10.800000,
55.ts
#EXTINF:11.200000,
56.ts
#EXTINF:9.640000,
57.ts
#EXTINF:9.880000,
58.ts
#EXTINF:8.840000,
59.ts
#EXTINF:10.960000,
60.ts
#EXTINF:10.440000,
61.ts
#EXTINF:10.960000,
62.ts
#EXTINF:8.160000,
63.ts
#EXTINF:9.160000,
64.ts
#EXTINF:10.600000,
65.ts
#EXTINF:13.320000,
66.ts
#EXTINF:5.880000,
67.ts
#EXTINF:10.920000,
68.ts
#EXTINF:10.200000,
69.ts
#EXTINF:8.920000,
70.ts
#EXTINF:10.800000,
71.ts
#EXTINF:10.480000,
72.ts
#EXTINF:9.160000,
73.ts
#EXTINF:9.920000,
74.ts
#EXTINF:10.760000,
75.ts
#EXTINF:11.480000,
76.ts
#EXTINF:7.480000,
77.ts
#EXTINF:11.000000,
78.ts
#EXTINF:10.280000,
79.ts
#EXTINF:9.640000,
80.ts
#EXTINF:12.480000,
81.ts
#EXTINF:8.600000,
82.ts
#EXTINF:7.840000,
83.ts
#EXTINF:13.080000,
84.ts
#EXTINF:9.120000,
85.ts
#EXTINF:8.760000,
86.ts
#EXTINF:9.160000,
87.ts
#EXTINF:11.280000,
88.ts
#EXTINF:9.000000,
89.ts
#EXTINF:10.800000,
90.ts
#EXTINF:11.200000,
91.ts
#EXTINF:9.760000,
92.ts
#EXTINF:8.880000,
93.ts
#EXTINF:9.600000,
94.ts
#EXTINF:9.960000,
95.ts
#EXTINF:11.520000,
96.ts
#EXTINF:9.480000,
97.ts
#EXTINF:9.960000,
98.ts
#EXTINF:10.960000,
99.ts
#EXTINF:11.680000,
100.ts
#EXTINF:5.800000,
101.ts
#EXTINF:12.920000,
102.ts
#EXTINF:7.560000,
103.ts
#EXTINF:10.600000,
104.ts
#EXTINF:11.400000,
105.ts
#EXTINF:7.720000,
106.ts
#EXTINF:9.880000,
107.ts
#EXTINF:11.200000,
108.ts
#EXTINF:10.440000,
109.ts
#EXTINF:8.720000,
110.ts
#EXTINF:11.400000,
111.ts
#EXTINF:9.040000,
112.ts
#EXTINF:9.320000,
113.ts
#EXTINF:10.200000,
114.ts
#EXTINF:11.120000,
115.ts
#EXTINF:11.080000,
116.ts
#EXTINF:8.240000,
117.ts
#EXTINF:9.160000,
118.ts
#EXTINF:10.480000,
119.ts
#EXTINF:9.520000,
120.ts
#EXTINF:10.480000,
121.ts
#EXTINF:11.640000,
122.ts
#EXTINF:9.080000,
123.ts
#EXTINF:9.840000,
124.ts
#EXTINF:9.280000,
125.ts
#EXTINF:12.840000,
126.ts
#EXTINF:9.600000,
127.ts
#EXTINF:7.320000,
128.ts
#EXTINF:13.200000,
129.ts
#EXTINF:7.240000,
130.ts
#EXTINF:10.160000,
131.ts
#EXTINF:11.680000,
132.ts
#EXTINF:9.760000,
133.ts
#EXTINF:8.960000,
134.ts
#EXTINF:12.520000,
135.ts
#EXTINF:8.160000,
136.ts
#EXTINF:8.680000,
137.ts
#EXTINF:11.360000,
138.ts
#EXTINF:11.360000,
139.ts
#EXTINF:9.600000,
140.ts
#EXTINF:7.320000,
141.ts
#EXTINF:11.320000,
142.ts
#EXTINF:9.480000,
143.ts
#EXTINF:11.520000,
144.ts
#EXTINF:7.960000,
145.ts
#EXTINF:12.080000,
146.ts
#EXTINF:10.120000,
147.ts
#EXTINF:7.440000,
148.ts
#EXTINF:10.000000,
149.ts
#EXTINF:10.360000,
150.ts
#EXTINF:13.800000,
151.ts
#EXTINF:9.440000,
152.ts
#EXTINF:7.080000,
153.ts
#EXTINF:11.600000,
154.ts
#EXTINF:8.040000,
155.ts
#EXTINF:9.720000,
156.ts
#EXTINF:9.960000,
157.ts
#EXTINF:11.240000,
158.ts
#EXTINF:11.840000,
159.ts
#EXTINF:10.120000,
160.ts
#EXTINF:6.840000,
161.ts
#EXTINF:13.800000,
162.ts
#EXTINF:6.160000,
163.ts
#EXTINF:11.800000,
164.ts
#EXTINF:9.600000,
165.ts
#EXTINF:13.000000,
166.ts
#EXTINF:6.280000,
167.ts
#EXTINF:10.120000,
168.ts
#EXTINF:10.200000,
169.ts
#EXTINF:9.520000,
170.ts
#EXTINF:10.240000,
171.ts
#EXTINF:11.920000,
172.ts
#EXTINF:7.680000,
173.ts
#EXTINF:12.480000,
174.ts
#EXTINF:7.320000,
175.ts
#EXTINF:13.000000,
176.ts
#EXTINF:10.160000,
177.ts
#EXTINF:10.080000,
178.ts
#EXTINF:7.000000,
179.ts
#EXTINF:13.080000,
180.ts
#EXTINF:8.480000,
181.ts
#EXTINF:8.280000,
182.ts
#EXTINF:12.280000,
183.ts
#EXTINF:10.000000,
184.ts
#EXTINF:8.000000,
185.ts
#EXTINF:9.880000,
186.ts
#EXTINF:9.760000,
187.ts
#EXTINF:10.000000,
188.ts
#EXTINF:10.440000,
189.ts
#EXTINF:10.080000,
190.ts
#EXTINF:10.080000,
191.ts
#EXTINF:11.920000,
192.ts
#EXTINF:9.120000,
193.ts
#EXTINF:11.920000,
194.ts
#EXTINF:7.600000,
195.ts
#EXTINF:9.560000,
196.ts
#EXTINF:9.720000,
197.ts
#EXTINF:11.360000,
198.ts
#EXTINF:8.200000,
199.ts
#EXTINF:10.640000,
200.ts
#EXTINF:11.280000,
201.ts
#EXTINF:8.680000,
202.ts
#EXTINF:10.200000,
203.ts
#EXTINF:9.800000,
204.ts
#EXTINF:9.600000,
205.ts
#EXTINF:10.440000,
206.ts
#EXTINF:11.760000,
207.ts
#EXTINF:8.680000,
208.ts
#EXTINF:9.600000,
209.ts
#EXTINF:12.600000,
210.ts
#EXTINF:6.800000,
211.ts
#EXTINF:10.720000,
212.ts
#EXTINF:10.840000,
213.ts
#EXTINF:9.600000,
214.ts
#EXTINF:8.840000,
215.ts
#EXTINF:11.680000,
216.ts
#EXTINF:9.840000,
217.ts
#EXTINF:9.240000,
218.ts
#EXTINF:9.600000,
219.ts
#EXTINF:9.440000,
220.ts
#EXTINF:9.960000,
221.ts
#EXTINF:11.080000,
222.ts
#EXTINF:12.000000,
223.ts
#EXTINF:7.520000,
224.ts
#EXTINF:12.520000,
225.ts
#EXTINF:10.840000,
226.ts
#EXTINF:6.200000,
227.ts
#EXTINF:14.600000,
228.ts
#EXTINF:9.600000,
229.ts
#EXTINF:9.600000,
230.ts
#EXTINF:6.920000,
231.ts
#EXTINF:10.320000,
232.ts
#EXTINF:9.040000,
233.ts
#EXTINF:10.040000,
234.ts
#EXTINF:9.960000,
235.ts
#EXTINF:10.880000,
236.ts
#EXTINF:12.280000,
237.ts
#EXTINF:7.680000,
238.ts
#EXTINF:9.840000,
239.ts
#EXTINF:9.720000,
240.ts
#EXTINF:11.200000,
241.ts
#EXTINF:9.800000,
242.ts
#EXTINF:11.400000,
243.ts
#EXTINF:11.160000,
244.ts
#EXTINF:5.840000,
245.ts
#EXTINF:14.320000,
246.ts
#EXTINF:7.400000,
247.ts
#EXTINF:9.600000,
248.ts
#EXTINF:8.640000,
249.ts
#EXTINF:10.760000,
250.ts
#EXTINF:9.880000,
251.ts
#EXTINF:12.800000,
252.ts
#EXTINF:7.920000,
253.ts
#EXTINF:11.200000,
254.ts
#EXTINF:9.600000,
255.ts
#EXTINF:8.720000,
256.ts
#EXTINF:9.320000,
257.ts
#EXTINF:11.000000,
258.ts
#EXTINF:9.320000,
259.ts
#EXTINF:10.400000,
260.ts
#EXTINF:9.960000,
261.ts
#EXTINF:9.760000,
262.ts
#EXTINF:9.720000,
263.ts
#EXTINF:10.160000,
264.ts
#EXTINF:13.360000,
265.ts
#EXTINF:6.120000,
266.ts
#EXTINF:11.680000,
267.ts
#EXTINF:8.400000,
268.ts
#EXTINF:9.480000,
269.ts
#EXT-X-ENDLIST

ts下载下来后是花屏,应该是音视分离加密了 ,那就这样吧 ~ 既然加密了 咱就不下载了

防盗链说明

IPTV系统中防盗链是很多令人头疼的问题,现在防盗链的方式有很多,比如常见的有动态key、视频地址当盗链处理、p2p私有协议等,这些都各有利弊。其实除了这些还有就是对视频流加密,这种在视频点播中使用的比较多,但在直播中也可实现,即对版权方给的ts或者说m3u8格式的视频进行加密处理,对内容进行帧加密,加密后只能在允许的APP中播放,即使下载到其他APP中也没法播放。

整个使用流程如下:

1、部署点量流媒体系统,在对版权方给的直播视频流进行中转的时候就直接开启加密功能,自动对视频流进行加密处理,加密后直接给出频道地址。

2、将加密后的频道地址放到CMS管理后台,在APP播放器端进行技术对接,使得加密视频只能在特定的APP中使用。而且是对内容帧加密,安全性更高,不留存加密视频播放完即删除。

3、视频一次加密后可在安卓和iOS系统下的APP中使用,方便快捷,配合点量CMS后台管理系统,可实现一个后台对应多平台APP使用。

4、也可以单独对接到现有系统中使用,直接以SDK的形式快速接入,不影响现在用户的使用体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/16340.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新写了的 AOP 日志切面,方便以后直接使用。

前言 最近项目进入联调阶段&#xff0c;服务层的接口需要和协议层进行交互&#xff0c;协议层需要将入参[json字符串]组装成服务层所需的json字符串&#xff0c;组装的过程中很容易出错。入参出错导致接口调试失败问题在联调中出现很多次&#xff0c;因此就想写一个请求日志切…

二叉搜索树(BST)详解

文章目录 性质二叉搜索树的遍历遍历伪代码实现 二叉搜索树的查找伪代码实现 二叉搜索树最大元素伪代码实现 二叉搜索树最小元素伪代码实现 二叉搜索树的插入伪代码实现 二叉搜索树的删除删除叶子节点&#xff08;对应上面第一种情况&#xff09;&#xff1a;删除度为1的节点&am…

多维时序 | MATLAB实现BP神经网络多变量时间序列预测(考虑历史特征的影响,多指标、多图输出)

多维时序 | MATLAB实现BP神经网络多变量时间序列预测(考虑历史特征的影响,多指标、多图输出) 目录 多维时序 | MATLAB实现BP神经网络多变量时间序列预测(考虑历史特征的影响,多指标、多图输出)预测效果基本介绍程序设计学习总结参考资料预测效果 基本介绍 MATLAB实现BP神经网…

【Fluent】接着上一次计算的结果继续计算,利用计算过程中得到的物理场(温度、速度、压力等)插值Interpolate文件初始化模型的方法

一、问题背景 因为fluent中支持的初始化无非三种类型。 1、Standard initialization 标准初始化 2、Hybridinitialization 混合初始化 3、FMG initialization FMG初始化 另外&#xff0c;还可以用UDF通过坐标判断的方式予以初始化。 但是这些初始化方法都没办法利用以前计算过…

电子数据取证之宝塔面板

一、宝塔面板介绍 1、官网bt.com&#xff0c;是提升运维效率的服务器管理软件&#xff0c;支持一键WAMP/LAMP/LNMP等100多项服务器管理功能&#xff1b;是跨平台的软件&#xff0c;同时支持Windows和Linux。开源永久免费。提高工作效率&#xff0c;对小白比较友好。 2、怎么看服…

操作系统2(多处理器编程)

一、并发 1.操作系统是最早的并发程序之一 2.并发的基本单位&#xff1a;线程 共享内存的多个执行流 执行流拥有独立的堆栈/寄存器共享全部的内存&#xff08;指针可以互相引用&#xff09; 3.实现原子性 lock(&lk)unlock(&lk) 实现临界区(critical section)之间…

Redis监控步骤get!Google精髓的四大法则直接掌握

Redis也是对外服务&#xff0c;所以Google四个黄金指标同样适用&#xff0c;还从延迟、流量、错误、饱和度分析Redis关键指标。 1 延迟 选择Redis是想得到更快响应速度和更高吞吐量&#xff0c;所以延迟数据对使用Redis的应用程序至关重要。 1.1 如何监控延迟 ① 客户端应用…

C++之深入解析如何实现一个线程池

一、基础概念 当进行并行的任务作业操作时&#xff0c;线程的建立与销毁的开销是&#xff0c;阻碍性能进步的关键&#xff0c;因此线程池&#xff0c;由此产生。使用多个线程&#xff0c;无限制循环等待队列&#xff0c;进行计算和操作&#xff0c;帮助快速降低和减少性能损耗…

Linux安装Mysql操作步骤详解

目录 1. 检测当前系统中是否安装了MySql数据库 2. 使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux 3. 解压并解包到/usr/local/mysql&#xff08;便于区分&#xff09; 第一步&#xff1a;将包先移动到该目录下 第二步&#xff1a;解压解包 第三步&#xff1a…

springboot的创建和使用

目录 1.springboot的优点 2.springboot项目创建 2.1使用idea创建 2. 2 ⽹⻚版创建 3.项⽬⽬录介绍和运⾏ 3.1运行项目 3.2输出hello world 4.注意事项 1.路径 2.约定大于配置 spring的诞生为了简化java程序,springboot的诞生为了简化spring程序开发 1.springboot的优点…

了解标量、向量和点积

数据科学基础数学&#xff1a;线性代数简介 了解标量、向量和点积 机器只能按着算法理解和处理数据结构存储的数字. 例如创建垃圾邮件检测器&#xff0c;则首先必须将文本数据转换为数字(通过单词嵌入)。 两个句子之间的余弦相似性 两个句子之间的余弦相似性可以通过它们的向量…

Python小姿势 - Python使用Jupyter Notebook

Python使用Jupyter Notebook Jupyter Notebook是一个开源的Web应用程序&#xff0c;可以用来创建和共享包含 live code&#xff0c;公式&#xff0c;可视化和解释性文本的文档。 安装Jupyter Notebook 首先&#xff0c;确保你安装了正确的Python版本和包管理器&#xff08;pip&…

java中的\t说明

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录 阅读前请看一下&#xff1a;我是…

加载自己的图像数据集

文章目录 1 加载图像数据集2 图像预处理3 再次加载数据集4 这里还有一个问题&#xff0c;我们没有验证集5 构建DataLoader6 检查是否正确导入数据集 原文链接&#xff1a;《加载自己的图像数据集》 ​ 数据集下载链接 1 加载图像数据集 目录结构&#xff1a; 针对这种非常典型…

while语句和until语句顺便带点小实验

while语句和until语句 一、while用法二、Until循环语句三、趣味小实验猜价格的游戏&#xff08;价格是随机数&#xff09;写一个计算器脚本闲来无事去购物 一、while用法 for循环语句非常适用于列表对象无规律&#xff0c;且列表来源以固定&#xff08;如某个列表文件&#xf…

nginx配置sh脚本远程执行一键安装

背景 本地多机重复操作某些shell指令&#xff0c;分步执行&#xff0c;很耗费时间&#xff0c; 需要远程一键部署&#xff0c;傻瓜化运维&#xff0c;更为通用安装。 即参考docker通用安装 sudo curl https://get.docker.com | sh - # sudo python3 -m pip install docker-co…

Design_transformer

磁性元件设计 思路 滤波电感设计 磁芯不要饱和&#xff08;开气隙&#xff09; 考虑铜损大于铁损 谐振电感设计 磁芯不要饱和&#xff08;开气隙&#xff09; 考虑铁损大于铜损 变压器设计 磁芯不要饱和&#xff08;开气隙&#xff09; 励磁电流产生磁场 开气隙 增加了…

FreeRTOS系统学习-内核篇.01-数据结构---列表与列表项定义详解-链表节点插入实验

# 内核篇.01 列表与列表项 为什么要学列表&#xff1f;链表单向链表双向链表 FreeRTOS 中链表的实现节点节点初始化尾节点根节点链表根节点初始化将节点插入到链表的尾部将节点按照升序排列插入到链表将节点从链表删除节点带参宏小函数 链表节点插入实验实验现象 为什么要学列表…

内存优化-比glibc更快的tcmalloc

TCMalloc 是 Google 开发的内存分配器&#xff0c;在不少项目中都有使用&#xff0c;例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征&#xff1a;对抗内存碎片、在多核处理器能够 scale。据称&#xff0c;它的内存分配速度是 glibc2.3 中实…

vue3表单输入绑定

初识表单输入绑定 vue3可以帮助我们将vue定义的变量绑定到html表单元素上&#xff0c;并且监听到html表单元素修改值时&#xff0c;会将对应的vue定义的变量修改。 <!-- 将vue3定义的text绑定给inut元素, 当input元素发生input输入事件时, 将修改vue3定义的text --> <…