hls协议分析

目录

  • 1、简介
    • 1.1、 综述
    • 1.2 、HLS 协议编码格式要求
    • 1.3 、HLS 协议优势
    • 1.4 、HLS 协议劣势
    • 1.5 、框架图
  • 2、m3u8文件
    • 2.1 、单码率适配流m3u8文件
    • 2.2 、多码率适配流m3u8文件
    • 2.3 、Playlist file
    • 2.4 、Tags
  • 3、ts文件
    • 3.1 、ts文件结构
    • 3.2、ts文件结构部分截图
    • 3.3、ts层(ts header)
    • 3.4、ts层(adaptation field)
      • 3.4.1、视频流和音频流加 adaptation field 情况部分截图
    • 3.5、ts层(PAT)
      • 3.5.1、PAT情况截图
    • 3.6、ts层(PMT)
      • 3.6.1、PMT情况截图
    • 3.7、pes层
    • 3.8、es层
      • 3.8.1、es层 (h264视频)
      • 3.8.2、es层 (aac音频)

1、简介

1.1、 综述

作为 Apple 提出的一种基于 HTTP 的协议,HLS(HTTP Live Streaming)用于解决实时音视频流的传
输。尤其是在移动端,由于 iOS /H5 不支持 flash,使得 HLS 成了移动端实时视频流传输的首选。HLS
经常用在直播领域,一些国内的直播云通常用 HLS 拉流(将视频流从服务器拉到客户端)。 HLS 值得诟
病之处就是其延迟严重,延迟通常在 10-30s 之间。

HLS(HTTP Live Streaming) 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。
HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS
是音视频的媒体信息。

1.2 、HLS 协议编码格式要求

视频的编码格式:H264
音频的编码格式:AAC、MP3、AC-3
视频的封装格式:ts
保存 ts 索引的 m3u8 文件

1.3 、HLS 协议优势

1、HLS 相对于 RTMP 来讲使用了标准的 HTTP 协议来传输数据,可以避免在一些特殊的网络环境下被屏蔽。

2、HLS 相对 RTMP 在服务器端做负载均衡要简单得多。因为 HLS 是基于无状态协议 HTTP 实现的,客户端只需要按照顺序使用下载存储在服务器的普通 ts 文件进行播放就可以。而 RTMP 是一种有状态协议,很难对视频服务器进行平滑扩展,因为需要为每一个播放视频流的客户端维护状态。

3、HLS 协议本身实现了码率自适应,在不同带宽情况下,设备可以自动切换到最适合自己码率的视频播放。

1.4 、HLS 协议劣势

1、HLS 协议在直播的视频延迟时间很难做到 10 s 以下延时,而 RTMP 协议的延时可以降到 1s 左右。

1.5 、框架图

在这里插入图片描述
在这里插入图片描述

2、m3u8文件

m3u8 文件是用文件方式对媒体文件进行描述,由一些列标签组成。

2.1 、单码率适配流m3u8文件

 #EXTM3U#EXT-X-VERSION:3#EXT-X-ALLOW-CACHE:YES#EXT-X-MEDIA-SEQUENCE:2#EXT-X-TARGETDURATION:16#EXTINF:14.357, no desclivestream-2.ts#EXTINF:15.617, no desclivestream-3.ts#EXTINF:14.358, no desclivestream-4.ts#EXTINF:15.618, no desclivestream-5.ts#EXTINF:11.130, no desclivestream-6.ts

2.2 、多码率适配流m3u8文件

 #EXTM3U#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000http://example.com/low.m3u8#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000http://example.com/mid.m3u8#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000http://example.com/hi.m3u8#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"http://example.com/audio-only.m3u8

包含多种比特率的 Master Playlist。该文件是一个实际使用中的顶级 m3u8 文件,该文件中又定义了
http://example.com/low.m3u8 、 http://example.com/mid.m3u8 等 几 个 二 级文件 。 顶 级m3u8 文件主要是做码率适配的,二级 m3u8 才是真正的切片文件,客户端会默认选择码率最高的请求,如果发现码率达不到,会请求降低码率的流。客户端拿到二级 m3u8 文件后,会继续请求里面的文件,这时就可以进行播放了。

2.3 、Playlist file

一个 m3u 的 Playlist 就是一个由多个独立行组成的文本文件,每行由回车/换行区分。每一行可以是一个
URI、空白行或是一个 以 “#” 号开头的字符串,并且空格只能存在于一行中不同元素间的分隔。
一个 URI 表示一个媒体段或是 “variant Playlist file”(最多支持一层嵌套,即一个 m3u8 文件中嵌套另
一个 m3u8),以 “EXT” 开头的表示一个 “tag”,否则表示注释,直接忽略。

2.4 、Tags

1#EXTM3U :
每个 m3u8 文件第一行必须是这个 tag,如上面的两个示例。2#EXT-X-VERSION:
m3u8文件版本号,比如#EXT-X-VERSION:3。3#EXTINF :
指定每个媒体段(ts)的持续时间,这个仅对其后面的 URI 有效,
每两个媒体段 URI 间被这个 tag 分隔开其格式为: #EXTINF:<duration><title> 
比如#EXTINF:14.357, no desc
duration:表示持续的时间(秒),"Durations MUST be integers if the protocol version of the Playlist file is less than 3",否则可以是浮点数。4#EXT-X-BYTERANGE :
表示媒体段是一个媒体 URI 资源中的一段,只对其后的 media URI 有效,
格式: #EXT-X-BYTERANGE:<n>[@o]
n:表示这个区间的大小
o:表示在 URI 中的 offset
The EXT-X-BYTERANGE tag appeared in version 4 of the protocol5#EXT-X-TARGETDURATION :
指定当前视频流中的单个切片(即 ts)文件的最大时长(秒)。
所以
#EXTINF :
中指定的时间长度必须小于或是等于这个最大值。这个 tag 在整个 Playlist 文件中只能出现1次(在嵌套的情况下,
一般有真正ts url 的 m3u8 才会出现该 tag)。格式: #EXT-XTARGETDURATION:<s>
s:表示最大的秒数。6#EXT-X-MEDIA-SEQUENCE :
每一个 media URI 在 Playlist 中只有唯一的序号,相邻之间序号 +1。
格式:#EXT-X-MEDIA-SEQUENCE:<number> 
一个 media URI 并不是必须要包含的,如果没有,默认为 0.7#EXT-X-KEY :
表示怎么对 media segments 进行解码。其作用范围是下次该 tag 出现前的所有media URI。
格式为: #EXT-X-KEY:<attribute-list>
NONE 或者 AES-128。如果是 NONE,则 URI 以及 IV 属性必须不存在,如果是 AES-128(Advanced Encryption Standard),
则 URI 必须存在,IV 可以不存在。对于 AES-128 的情况,keytag 和 URI 属性共同表示了一个 key 文件,通过 URI 可以获得这个key,
如果没有 IV(Initialization Vector),则使用序列号作为 IV 进行编解码,将序列号的高位赋到 16 个字节的 buffer 中,
左边补 0;如果有 IV,则将该值当成 16 个字节的 16 进制数。8#EXT-X-PROGRAM-DATE-TIME :
将一个绝对时间或是日期和一个媒体段中的第一个 sample 相关
联,只对下一个 media URI 有效,
格式: #EXT-X-PROGRAM-DATE-TIME:<YYYY-MMDDThh:mm:ssZ>
例如: #EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:009#EXT-X-ALLOW-CACHE :
是否允许做 cache,这个可以在 Playlist 文件中任意地方出现,
并且最多只出现一次,作用效果是所有的媒体段。
格式: #EXT-X-ALLOW-CACHE:<YES|NO>10#EXT-X-PLAYLIST-TYPE :
提供关于 Playlist 的可变性的信息,这个对整个 Playlist 文件有效,是可选的,
格式: #EXT-X-PLAYLIST-TYPE:<EVENT|VOD>
VOD,即为点播视频,服务器不能改变 Playlist 文件,换句话说就是该视频全部的 ts 文件已经被生成好了。
EVENT,就是实时生成 m3u8 和 ts 文件。服务器不能改变或是删除 Playlist 文件中的任何部分,
但是可以向该文件中增加新的一行内容。它的索引文件一直处于动态变化中,
播放的时候需要不断下载二级index文件。11#EXT-X-ENDLIST :
表示 m3u8 文件的结束,live m3u8 没有该 tag。它可以在 Playlist 中任意位置出现,
但是只能出现一个,格式: #EXT-X-ENDLIST12#EXT-X-MEDIA :
被用来在 Playlist 中表示相同内容的不同语种/译文的版本,
比如可以通过使用 3个这种 tag 表示 3 种不同语音的音频,
或者用 2 个这个 tag 表示不同⻆度的 video。在 Playlist中,
这个标签是独立存在的,
其格式: #EXT-X-MEDIA:<attribute-list>
该属性列表中包含:URI、TYPE、GROUP-ID、LANGUAGE、NAME、DEFAULT、
AUTOSELECT。URI:如果没有,则表示这个 tag 描述的可选择版本在主 PlayList 的 EXT-X-STREAM-INF 中存在。TYPE:AUDIO and VIDEO。GROUP-ID:具有相同 ID 的 MEDIAtag,组成一组样式。LANGUAGE:identifies the primary language used in the rendition。NAME:The value is a quoted-string containing a human-readable description of the rendition.If the LANGUAGE attribute is present then this description SHOULD be in that language。DEFAULT:YES 或是 NO,默认是 No,如果是 YES,则客户端会以这种选项来播放,除非用户自己进行选择。AUTOSELECT:YES 或是 NO,默认是 No,如果是 YES,则客户端会根据当前播放环境来进行选择(用户没有根据自己偏好进行选择的前提下)。The EXT-X-MEDIA tag appeared in version 4 of the protocol。13#EXT-X-STREAM-INF :
指定一个包含多媒体信息的 media URI 作为 Playlist,
一般做 m3u8 的嵌套使用,
它只对紧跟后面的 URI 有效,
格式: #EXT-X-STREAM-INF:<attribute-list>
常用的属性如下:BANDWIDTH:带宽,必须有。PROGRAM-ID:该值是一个十进制整数,唯一地标识一个在 Playlist 文件范围内的特定的描述。一个 Playlist 文件中可能包含多个有相同 ID 的此 tag。CODECS:指定流的编码类型,不是必须的。RESOLUTION:分辨率。AUDIO:这个值必须和 AUDIO 类别的 "EXT-X-MEDIA" 标签中 "GROUP-ID" 属性值相匹配。VIDEO:同上。14#EXT-X-DISCONTINUITY :
当遇到该 tag 的时候说明以下属性发生了变化:file format :文件格式number and type of tracks :轨道encoding parameters :编码参数encoding sequence :编码序号timestamp sequence :时间戳序号15#ZEN-TOTAL-DURATION :
表示这个 m3u8 所含 ts 的总时间长度

3、ts文件

ts 文件为传输流文件,视频编码主要格式为 H264/MPEG4,音频为 AAC/MP3。
ts 文件分为三层:
------ ts 层:Transport Stream,是在 pes 层的基础上加入数据流的识别和传输必须的信息。
------ pes 层: Packet Elemental Stream,是在音视频数据上加了时间戳等对数据帧的说明信息。
------ es 层:Elementary Stream,即音视频数据。
在这里插入图片描述

3.1 、ts文件结构

在这里插入图片描述
PAT(Program Association Table)节目关联表:主要的作用就是指明了 PMT 表的 PID 值。
PMT(Program Map Table)节目映射表:主要的作用就是指明了音视频流的 PID 值。

3.2、ts文件结构部分截图

刚开始的TS包是PAT(Program Association Table):节目关联表。
再跟的TS包是PMT(Program Map Table):节目映射表。
然后再跟视频、音频的TS包。
在这里插入图片描述
在这里插入图片描述
ts 包大小固定为 188 字节,ts 层分为三个部分:ts header、adaptation field、payload。
ts header :固定 4 个字节。
adaptation field : 可能存在也可能不存在,主要作用是给不足 188 字节的数据做填充。
payload : pes 数据。

可以根据每个ts包的偏移量判断都是188字节。
在这里插入图片描述

3.3、ts层(ts header)

在这里插入图片描述
ts 层的内容是通过 PID 值来标识的,主要内容包括:PAT 表、PMT 表、音频流、视频流。
解析 ts 流要先找到 PAT 表,只要找到 PAT 就可以找到 PMT,然后就可以找到音视频流了。
PAT 表的和 PMT 表需要定期插入 ts 流,因为用户随时可能加入 ts 流,这个间隔比较小,
通常每隔几个视频帧就要加入 PAT和 PMT。
PAT 和 PMT 表是必须的,还可以加入其它表如 SDT(业务描述表)等,不过 hls 流只要有
PAT 和 PMT 就可以播放了。

3.4、ts层(adaptation field)

在这里插入图片描述
自适应区的长度要包含传输错误指示符标识的一个字节。pcr 是节目时钟参考,pcr、dts、pts 都是对同
一个系统时钟的采样值,pcr 是递增的,因此可以将其设置为 dts 值,音频数据不需要 pcr。如果没有字
段,ipad 是可以播放的,但 vlc 无法播放。打包 ts 流时 PAT 和 PMT 表是没有 adaptation field 的,
不够的长度直接补 0xff 即可。视频流和音频流都需要加 adaptation field,通常加在一个帧的第一个 ts
包和最后一个 ts 包中,中间的 ts 包不加。

adaptation field 详解:
flag 标志位:0x10就表示有PCR,下面视频流截图也是这个情况,0x50是random_access_indicator标志位和PCR_flag标志位都有。
在这里插入图片描述

3.4.1、视频流和音频流加 adaptation field 情况部分截图

1、视频帧:
I帧:第一个TS包和最后一个TS包有adaptation field,根据ts header 最后一个字节判断。
(第一个TS包要存PCR)
在这里插入图片描述
在这里插入图片描述
P帧:最后一个TS包有adaptation field,根据ts header 最后一个字节判断。
在这里插入图片描述
2、音频帧:
最后一个TS包有adaptation field,根据ts header 最后一个字节判断。
在这里插入图片描述

3.5、ts层(PAT)

PAT(Program Association Table)节目关联表:主要的作用就是指明了 PMT 表的 PID 值。
在这里插入图片描述

3.5.1、PAT情况截图

1、下面0x01字节表示有PMT。
2、下面0XF0 01的后13b就是PMT的PID(4097)。
(注意这个PID与ts header的pid的字节序是不同的)
在这里插入图片描述

3.6、ts层(PMT)

PMT(Program Map Table)节目映射表:主要的作用就是指明了音视频流的 PID 值。
在这里插入图片描述
在这里插入图片描述

3.6.1、PMT情况截图

1、下面0xE1 00字节后13b表示PCR的PID(256)。
2、下面0X0F 字节就是stream type AAC。
3、下面0xE1 01字节后13b就是elementary_PID (257)。
4、下面0X1B 字节就是stream type H264。
5、下面0xE1 00字节后13b就是elementary_PID (256)。
在这里插入图片描述

3.7、pes层

pes (Packet Elemental Stream)层是在每一个视频/音频帧上加上了时间戳等信息,pes 包内容项很多。

pes 层格式如下:
在这里插入图片描述
列举一些pes 包含的常用字段:
在这里插入图片描述
截图分析:
在这里插入图片描述
根据0x41字节中获取payload_unit_start_indicator 为1,表示这个TS包是有pes包头的(00 00 01 E0 01 FB 80 80 05 21 00 7F E9 B9 )然后后面才是实际的h264数据,由于后面还有两个payload_unit_start_indicator 为0的,表示这3个TS包合起来才是完整的一帧h264数据。
而且payload_unit_start_indicator 为0的TS包,是没有pes包头了,除去4个字节的ts包头就是h264数据了。如下图:
在这里插入图片描述

3.8、es层

es(Elementary Stream) 层就是音视频数据。

3.8.1、es层 (h264视频)

打包 h.264 数据时必须给视频数据加上一个 nalu(Network Abstraction Layer Unit),nalu 包括
nalu header 和 nalu type,nalu header 固定为 0x00000001(帧开始)或 0x000001(帧中)。
h.264 的数据是由 slice 组成的,slice 的内容包括:视频、sps、pps 等。nalu type 决定了后面的
h.264 数据内容。

  0 1 2 3 4 5 6 7+-+-+-+-+-+-+-+-+|F|NRI| TYPE |+-+-+-+-+-+-+-+-+

F:1bit,forbidden_zero_bit,h.264 规定必须取 0。
NRI:2bits,nal_ref_idc,取值为 0~3,指示这个 nalu 的重要性,I 帧、sps、pps 通常取 3,P 帧
常取 2,B 帧通常取 0
Type:5bits,取值如下:
在这里插入图片描述
打包 es 层数据时 pes 头和 es 数据之间要加入一个 type=9 的 nalu,关键帧 slice 前必须要加入
type=7 和 type=8 的 nalu,而且是紧邻的。
如下图所示:
在这里插入图片描述

3.8.2、es层 (aac音频)

《AAC ADTS格式分析》

打包aac音频必须加上一个adts(Audio Data Transport Stream)头,共7Byte,adts包括
fixed_header和variable_header两部分,各28bit。

fixed_header:
在这里插入图片描述
variable_header:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL 学习笔记(1)初始化窗体

前言 学习OpenGL只是兴趣爱好&#xff0c;因为对图形比较感兴趣.将以OpenGl的红宝书(7)和蓝宝石书(4)为基础,虽然手头有红宝书书&#xff0c;但感觉没蓝宝石书写的好 准备工作 首先要下载一个工具库(GLUT) http://www.opengl.org/resources/libraries/glut/ 只要把相应文件放在…

基于云平台的家居综合监测管理系统的设计与实现

时间过得飞快&#xff0c;转眼间大四即将毕业&#xff0c;有点留恋和不舍。可能是越是到了离别的时候&#xff0c;越开始珍惜吧。大一开始&#xff0c;通过考核进入了学校院系实验室开始学习&#xff0c;这期间自学了很多东西&#xff0c;很充实&#xff0c;也参加过很多比赛&a…

小白学数据分析-----留存率分析_I[次日留存率突然下降了50%?]

最近在做留存分析时&#xff0c;遇到了不少的情况&#xff0c;也经常会有人问我&#xff0c;为什么我的游戏突然次日留存率降了一半。如果留存率是单单作为一个简单的指标的话&#xff0c;那对你价值还是蛮有限的&#xff0c;今天就和大家说说一个case&#xff0c;这是不久前解…

mysql映射mapper_SQL映射器Mapper接口(MyBatis)

SQL映射器Mapper接口MyBatis基于代理机制&#xff0c;可以让我们无需再写Dao的实现。直接把以前的dao接口定义成符合规则的Mapper。注意事项&#xff1a;1&#xff0e;接口必须以Mapper结尾,名字是DomainMapper2&#xff0e;mapper.xml文件要和Mapper接口建立关系,通过namespac…

计算机图形学画线_在计算机图形学中直接使用线方程

计算机图形学画线计算机图形学| 直接使用线方程 (Computer Graphics | Direct Use of Line Equation) The standard line equation, as we all know is used for drawing a line. It is given by: y mx c. 众所周知&#xff0c;标准线方程式用于绘制线。 由下式给出&#xff…

c/c++ 编程试题

c/c 编程试题 带*号为选作题&#xff0c;给出代码截屏和编译运算结果截屏 1.编程:选取M个最大的数 编程实现从N个无序数中选取M个最大的数(0 < M < N ) 思路&#xff1a;通过冒泡排序或者选择排序对N个数进行递减排序&#xff0c;然后输入前M个数即可。这里我想到的是通…

mysql inception web_基于Inception搭建MySQL SQL审核平台Yearing

Inception1. Inceptionj简介Inception是一款针对MySQL的SQL语句审核自动化运维工具。使用Inception&#xff0c;将会给DBA带来更大的便利性&#xff0c;将DBA从繁冗的工作中解放出来&#xff0c;做更多的自动化工作&#xff0c;或者从架构方面研究如何更大程度地保证数据库的高…

VS2010 运行库设置

如下图所示&#xff0c;当在一个EXE工程中调用lib或dll时&#xff0c;2个工程的下面选项一定要一致&#xff0c;否则会导致exe工程编译不过。 原则&#xff1a; Debug下&#xff0c;默认是MTd&#xff1b; Release下&#xff0c;默认是MT。 转载于:https://www.cnblogs.com/lgh…

零拷贝、mmap、sendfile

目录零拷贝mmapsendFile总结零拷贝 要了解零拷贝&#xff0c;首先得先了解一下传统 IO 的执行流程&#xff0c;这里举个例子&#xff0c;通过传统的 IO 进行网络传输来传输一个文件。 先上一张图&#xff0c;这张图就代表了传统 IO 传输文件的流程。 读取文件的时候&#xf…

网页服务器和mysql服务器_实现Web服务器之间使用同一个MYSQL和相同的网页配置文件的方法...

实现Web服务器之间使用同一个MYSQL和相同的网页配置文件的方法发布时间&#xff1a;2020-04-15 16:42:41来源&#xff1a;亿速云阅读&#xff1a;133作者&#xff1a;三月栏目&#xff1a;数据库亿速云负载均衡(Cloud Load Balancer)是对多台云服务器进行流量分发的服务。亿速云…

传128GB版iPad4售价为799/929美元

外媒9to5mac报道&#xff0c;苹果将推出一款升级版iPad4&#xff0c;外观和iPad 4相同&#xff0c;还是黑白两色的&#xff0c;只加入了新的SKU。 据报道&#xff0c;这款升级版iPad4还有128GB版&#xff0c;随着这条消息传出&#xff0c;不久关于128GB版iPad4的售价信息也传出…

(西工程-金花)小米路由器连接哆点设置WiFi保姆式教程

小米路由器连接电源,用根网线一端插入寝室的网口处,另一端插入小米路由器的WAN口手机或者电脑连接WiFi,我这里是通过手机浏览器打开192.168.31.1进入无线路由器管理页面进行配置小米路由器&#xff0c;配置WiFi的一些基本参数,例如:WiFi名称,密码之类的信息 进入无线路由器管理…

go 声明二维数组_一篇文章了解Go语言中数组Arrays的使用内幕

概述与其他编程语言类似&#xff0c;Go语言也有数组array。Go语言中&#xff0c;数组的行为和其他语言没有什么不同.Go语言中还有一个叫做切片slice的东西&#xff0c;它就像是对数组的引用。在本文中&#xff0c;我们将只研究数组。定义数组是同一类型元素的连续集合&#xff…

ffmpeg 使用ffplay 进行 hls 拉流 分析 1

ffmpeg 使用 ffplay 进行 hls 拉流 分析 1 从使用ffplay 调用 http://192.168.1.100:8080/live/livestream.m3u8 开始&#xff0c;进入到ffmpeg 的分析使用的协议选择相应的解复用器的步骤。 其他协议或者文件方式的使用ffplay也是这个步骤流程的。 目录&#xff1a;一、流程图…

搜狗输入法输出特殊符号快捷键

https://www.petefreitag.com/cheatsheets/ascii-codes/ 参考上个编码网站大全 详细步骤为&#xff1a;alt长按 &#xff0b; 编码数字 例如&#xff1a;平方的编码为178-----长按alt178 即可&#xff0c;178是数字一个一个挨个按即可 常用的特殊符号如下&#xff1a; 平方&…

[BuildRelease Management]CC.NET架构

一 CC.NET的操作流程 1) 等待Trigger的唤醒&#xff1b; 2&#xff09;从Source Control System查询上次build以后的修改列表&#xff1b; 3&#xff09;如果任何修改被发现或是Trigger触发类型为 force the build &#xff1a; 3.1&#xff09;为build产生一个label number&a…

python 入门到实践期末考试常出现的考试内容_Python编程入门到实践—列表篇(一)...

一、列表是什么&#xff1f;列表由一系列按特定顺序排列的元素组成。可以创建包含字母表中所有字母、数字0-9或所有家庭成员姓名的列表&#xff1b;也可以将任何东西加入列表中&#xff0c;其中的元素之间可以没有任何关系。列表通常包含多个元素&#xff0c;给列表指定一个表示…

c#中将集合写入文本_在C#中将记录插入MySQL数据库

c#中将集合写入文本In the last tutorial (how to connect with MySQL database in C#?), we learned about making the connection with MySQL database in C#. Here, in this tutorial, we will learn how to insert the records in MySQL database in C#? 在上一教程( 如何…

day1-Linux操作系统基础

该专栏所有内容笔记均来自传智播客培训班 1.什么是操作系统&#xff08;operate system OS&#xff09; 小议&#xff1a;承上启下作用&#xff0c;向下可以控制硬件&#xff0c;向上能够支持软件的运行。一个可以控制硬件的软件。 小明找小红聊天&#xff0c;小明打开QQ&…

关闭浏览器 清空session_跨境网络小知识之Session

跨境小伙伴们大家好&#xff0c;上一篇为大家介绍了Cookie&#xff0c;今天就为大家介绍下连接cookie的另一端Session&#xff0c;交互过程中&#xff0c;二者缺一不可。与Cookie相对&#xff0c;Session是存储在服务端的&#xff0c;他们之间是通过一个叫做sessionID的东东建立…