FMUSER更轻松地传输视频和音频!
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org ->荷兰语
sq.fmuser.org ->阿尔巴尼亚人
ar.fmuser.org ->阿拉伯语
hy.fmuser.org - >亚美尼亚
az.fmuser.org ->阿塞拜疆
eu.fmuser.org ->巴斯克
be.fmuser.org ->白俄罗斯语
bg.fmuser.org - >保加利亚
ca.fmuser.org ->加泰罗尼亚语
zh-CN.fmuser.org ->中文(简体)
zh-TW.fmuser.org - >中国(繁体)
hr.fmuser.org ->克罗地亚语
cs.fmuser.org ->捷克
da.fmuser.org ->丹麦语
nl.fmuser.org - >荷兰
et.fmuser.org ->爱沙尼亚语
tl.fmuser.org ->菲律宾
fi.fmuser.org ->芬兰语
fr.fmuser.org - >法国
gl.fmuser.org ->加利西亚语
ka.fmuser.org ->乔治亚
de.fmuser.org ->德语
el.fmuser.org - >希腊
ht.fmuser.org ->海地克里奥尔语
iw.fmuser.org ->希伯来语
hi.fmuser.org ->印地语
hu.fmuser.org - >匈牙利
is.fmuser.org ->冰岛语
id.fmuser.org ->印尼语
ga.fmuser.org ->爱尔兰
it.fmuser.org - >意大利
ja.fmuser.org ->日语
ko.fmuser.org ->韩文
lv.fmuser.org ->拉脱维亚
lt.fmuser.org - >立陶宛
mk.fmuser.org ->马其顿语
ms.fmuser.org ->马来语
mt.fmuser.org ->马耳他语
no.fmuser.org - >挪威
fa.fmuser.org ->波斯语
pl.fmuser.org ->波兰语
pt.fmuser.org ->葡萄牙语
ro.fmuser.org - >罗马尼亚
ru.fmuser.org ->俄语
sr.fmuser.org ->塞尔维亚语
sk.fmuser.org ->斯洛伐克
sl.fmuser.org - >斯洛文尼亚
es.fmuser.org ->西班牙语
sw.fmuser.org ->斯瓦希里语
sv.fmuser.org ->瑞典语
th.fmuser.org - >泰国
tr.fmuser.org ->土耳其语
uk.fmuser.org ->乌克兰语
ur.fmuser.org ->乌尔都语
vi.fmuser.org - >越南
cy.fmuser.org ->威尔士语
yi.fmuser.org - >意第绪语
HLS和Http Live Streaming是Apple定义的用于实时流传输的协议。 HLS是基于HTTP协议实现的。 传输内容包括两部分,一个是M3U8描述文件,另一个是TS媒体文件。
1. M3U8文件
媒体文件以文本形式描述,该文本由一系列标签组成。
#EXTM3U
#EXT-X-TARGETDURATION:5
#EXTINF:5,
./0.ts
#EXTINF:5,
./1.ts
#EXTM3U:每个M3U8文件的第一行必须是此标记。
#EXT-X-TARGETDURATION:指定最大媒体段时间长度(秒)。 #EXTINF中指定的时间长度必须小于或等于此最大值。 该值只能出现一次。
#EXTINF:描述单个媒体文件的长度。 随后是媒体文件,例如./0.ts
2. ts文件
ts文件是传输流文件,主要视频编码格式是h264 / mpeg4,音频是acc / MP3。
ts文件分为三层:ts层传输流,pes层包元素流,es层元素流。 es层是音频和视频数据,而pes层是数据帧描述信息,例如添加到音频和视频数据的时间戳。 ts层将添加必要的信息,以便在pes层中识别和传输数据流
注意:详细信息如下
(1)ts层ts数据包的大小固定为188个字节,并且ts层分为三部分:ts头,适配字段和有效负载。 ts标头固定为4个字节; 适应字段可以存在或不存在,其主要功能是填充小于188字节的数据; 有效负载是pes数据。
ts标头
sync_byte 8b同步字节,固定为0x47
transport_error_indicator 1b传输错误指示符,指示ts标头的Adapt字段后有一个无用的字节,通常为0,此字节计入Adapt字段的长度
payload_unit_start_indicator 1b加载单元启动指示符,在完整数据包的开始处标记为1
transport_priority 1b传输优先级,0为低优先级,1为高优先级,通常为0
pid 13b pid值
transport_scrambling_control 2b传输加扰控制,00表示未加密
adaptive_field_control 2b是否包括适配字段,保留'00'; “ 01”表示没有适应字段,只有有效负载; “ 10”仅表示自适应字段,无有效载荷; “ 11”表示还包括域和有效负载。
continuity_counter 4b从0-f递增计数器,起始值不一定取0,但必须是连续的
ts层的内容由PID值标识,主要内容包括:PAT表,PMT表,音频流和视频流。 要解析ts流,必须首先找到PAT表,只要找到PAT,就可以找到PMT,然后才能找到音频和视频流。 PAT表的PID值固定为0。PAT表和PMT表需要定期插入ts流中,因为用户可以随时加入ts流,所以间隔比较小,通常每隔几个视频帧以添加PAT和PMT。 PAT和PMT表是必需的,还可以添加其他表,例如SDT(服务描述表),但是只要有PAT和PMT,就可以播放hls流。
PAT表:其主要功能是指示PMT表的PID值。
PMT表:其主要功能是指定音频和视频流的PID值。
音频流/视频流:承载音频和视频内容。
适应性
Adapt_field_length 1B自适应字段的长度,后面的字节数
标志1B使用0x50表示PCR或0x40不包括PCR
PCR 5B程序时钟参考,程序时钟参考,用于恢复与编码器一致的系统定时时钟STC(系统时间时钟)。
stuffing_bytes xB填充字节,值为0xff
适配区的长度应包括一个由传输错误指示符标识的字节。 pcr是程序时钟参考,pcr,dts,pts都是同一系统时钟的采样值,pcr是增量的,因此可以将其设置为dts值,音频数据不需要pcr。 如果没有字段,则ipad可以播放,但vlc无法播放。 打包ts流时,PAT和PMT表没有适应字段。 如果长度不够,只需填写0xff。 视频流和音频流都需要添加适配字段,通常将其添加到帧的第一个ts数据包和最后一个ts数据包中,并且不添加中间的ts数据包。
PAT格式
table_id 8b PAT表固定为0x00
section_syntax_indicator 1b固定为1
零1b固定为0
保留2b固定为11
section_length 12b以下数据的长度
transport_stream_id 16b传输流ID,固定为0x0001
保留2b固定为11
version_number 5b版本号,固定为00000,如果PAT更改,则版本号将增加1
current_next_indicator 1b固定为1,表示可以使用该PAT表,如果为0,则等待下一个PAT表
section_number 8b固定为0x00
last_section_number 8b固定为0x00
启动循环
program_number 16b当程序号为0x0000时,表示为NIT;当程序号为0x0001时,表示为PMT。
保留3b固定为111
PID 13b PID值对应于程序编号的内容
结束循环
CRC32 32b先前数据的CRC32校验码
PMT格式
table_id 8b PMT表具有任何值0x02
section_syntax_indicator 1b固定为1
零1b固定为0
保留2b固定为11
section_length 12b以下数据的长度
program_number 16b通道号,表示与当前PMT关联的通道,值为0x0001
保留2b固定为11
version_number 5b版本号,固定为00000,如果PAT更改,则版本号将增加1
current_next_indicator 1b固定为1
section_number 8b固定为0x00
last_section_number 8b固定为0x00
保留3b固定为111
PCR_PID 13b PCR(节目参考时钟)所在的TS数据包的PID,指定为视频PID
保留4b固定为1111
program_info_length 12b程序描述信息,指定为0x000表示否
启动循环
stream_type 8b流类型,标记是视频或音频或其他数据,h.264编码对应于0x1b,aac编码对应于0x0f,mp3编码对应于0x03
保留3b固定为111
对应于stream_type的elementary_PID 13b PID
保留4b固定为1111
ES_info_length 12b描述信息,指定为0x000表示否
结束循环
CRC32 32b先前数据的CRC32校验码
(2)PE层
pes层将时间戳和其他信息添加到每个视频/音频帧。 pes软件包包含很多内容,我们只保留最常用的内容。
pes起始代码3B起始代码,固定为0x000001
流ID 1B音频值(0xc0-0xdf),通常为0xc0
视频值(0xe0-0xef),通常为0xe0
pes数据包长度2B,后面的pes数据长度,0表示无限制长度,
仅视频数据长度将超过0xffff
标志1B通常取值为0x80,这表示数据未加密,没有优先级并且正在备份数据
标志1B的值0x80仅表示pts,值0xc0表示pts和dts
pes data length 1B以下数据的长度,值为5或10
pts 5B 33bit值
dts 5B 33bit值
pts是显示时间戳,dts是解码时间戳。 视频数据需要两个时间戳。 音频数据的pts和dts相同,因此仅需要pts。 由B帧引起的时间戳有pts和dts两种。 I和P帧的pt等于dts。 如果视频没有B帧,则点数将始终与dts相同。 从文件中顺序读取视频帧,并且提取的帧的序列与dts序列相同。 dts算法相对简单,初始值+增量就足够,pts的计算更为复杂,并且需要将偏移量添加到dts中。
音频pes中只有pt(与dts相同),视频的I和P帧必须同时具有时间戳,而视频B帧仅需要pt(与dts相同)。 要打包pts和dts,您需要了解视频帧类型,但是我们无法通过容器格式来判断帧类型。 您必须解析h.264内容以获取帧类型。
例如:
IPBBBP
阅读顺序:1 2 3 4 5 6
dts顺序:1 2 3 4 5 6
点数:1 5 3 2 4 6
点播视频DTS算法:
dts =初始值+ 90000 / video_frame_rate,可以任意指定初始值,但是最好不要取0,video_frame_rate是帧速率,例如23、30。
pts和dts基于时标,1s = 90000时标,一帧应为90000 / video_frame_rate时标。
将一帧的时间标度除以采样频率可转换为一帧的播放持续时间
点播音频dts算法:
dts =初始值+(90000 * audio_samples_per_frame)/ audio_sample_rate,audio_samples_per_frame的值与编解码器相关,aac值为1024,mp3值为1158,audio_sample_rate是采样率,例如24000、41000。AAC解码一帧每个通道1024个样本,这意味着一帧的持续时间为1024 / sample_rate秒。 因此,每帧的时间戳为0、1024 / sample_rate,...,1024 * n / sample_rate秒。
实时视频的dts和pts应该直接使用实时数据流中的时间,并且不应通过公式计算。
(3)es层
es层是指音频和视频数据,我们仅介绍h.264视频和aac音频。
h.264视频:
要打包h.264数据,我们必须在视频数据中添加nalu(网络抽象层单元)。 nalu包括nalu标头和nalu类型。 nalu标头固定为0x00000001(帧的开始)或0x000001(帧内)。 h.264的数据由切片组成,切片的内容包括:视频,sps,pps等。nalu类型确定后续h.264数据的内容。
F 1b forbidden_zero_bit,h.264规定必须为0
NRI 2b nal_ref_idc,值0〜3,表示该nalu的重要性。I帧,sps,pps通常为3,P帧通常为2,B帧通常为0。
5b型参见下表
nal_unit_type说明
0未使用
1个非IDR图像,IDR指关键帧
2片分区A
3片分区B
|
输入电子邮件以获取惊喜
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org ->荷兰语
sq.fmuser.org ->阿尔巴尼亚人
ar.fmuser.org ->阿拉伯语
hy.fmuser.org - >亚美尼亚
az.fmuser.org ->阿塞拜疆
eu.fmuser.org ->巴斯克
be.fmuser.org ->白俄罗斯语
bg.fmuser.org - >保加利亚
ca.fmuser.org ->加泰罗尼亚语
zh-CN.fmuser.org ->中文(简体)
zh-TW.fmuser.org - >中国(繁体)
hr.fmuser.org ->克罗地亚语
cs.fmuser.org ->捷克
da.fmuser.org ->丹麦语
nl.fmuser.org - >荷兰
et.fmuser.org ->爱沙尼亚语
tl.fmuser.org ->菲律宾
fi.fmuser.org ->芬兰语
fr.fmuser.org - >法国
gl.fmuser.org ->加利西亚语
ka.fmuser.org ->乔治亚
de.fmuser.org ->德语
el.fmuser.org - >希腊
ht.fmuser.org ->海地克里奥尔语
iw.fmuser.org ->希伯来语
hi.fmuser.org ->印地语
hu.fmuser.org - >匈牙利
is.fmuser.org ->冰岛语
id.fmuser.org ->印尼语
ga.fmuser.org ->爱尔兰
it.fmuser.org - >意大利
ja.fmuser.org ->日语
ko.fmuser.org ->韩文
lv.fmuser.org ->拉脱维亚
lt.fmuser.org - >立陶宛
mk.fmuser.org ->马其顿语
ms.fmuser.org ->马来语
mt.fmuser.org ->马耳他语
no.fmuser.org - >挪威
fa.fmuser.org ->波斯语
pl.fmuser.org ->波兰语
pt.fmuser.org ->葡萄牙语
ro.fmuser.org - >罗马尼亚
ru.fmuser.org ->俄语
sr.fmuser.org ->塞尔维亚语
sk.fmuser.org ->斯洛伐克
sl.fmuser.org - >斯洛文尼亚
es.fmuser.org ->西班牙语
sw.fmuser.org ->斯瓦希里语
sv.fmuser.org ->瑞典语
th.fmuser.org - >泰国
tr.fmuser.org ->土耳其语
uk.fmuser.org ->乌克兰语
ur.fmuser.org ->乌尔都语
vi.fmuser.org - >越南
cy.fmuser.org ->威尔士语
yi.fmuser.org - >意第绪语
FMUSER更轻松地传输视频和音频!
联系我们
分类目录
订阅电子邮件