qq364530507

qq364530507

0个粉丝

23

问答

0

专栏

0

资料

qq364530507  发布于  2016-04-14 15:20:31
采纳率 0%
23个问答
6114

利用live555实现RTSP客户端,有些地方不是很明白,求教

 
各位大神,我在看别人写的liv555客户端代码的时候,遇到点问题不是太明白,想请教一下:
1.在客户端向服务器发送完DESCRIBE之后,接受到服务器返回的SDP信息之后,不是应该利用这个SDP信息完成SESSION会话的建立嘛?
我的理解是之后只要发送”SETUP,PALY“就可以开始通过UDP接收流数据啦,但是我发现客户端源码内多了一个步骤:


从上面的截图可以看到,首先是通过返回的SDP信息,sdpDescription来完成MediaSession的创建,返回值为scs.session,函数声明如下:

我觉得此时这个会话不是创建好了吗,然后就应该发送SETUP PLAY开始接受数据啦,但是实际上还要创建MediaSubsession,并且注释这么说得:
“然后,为这个会话创建source object(??源对象??),我们通过遍历这个会话的每一个subsession来完成,然后在每个subsession来完成”SETUP“的发送,
我不懂这里subsession什么意思啊,是不是这个会话中的每一个图像帧就是一个subsession?
小弟才学习这个,各位见笑了,
我在网上没查到这方面的解释,只看到一句话”ServerMediaSession原先说代表一个流,其实是不准确的。它代表的是server端的一个媒体的名字,而说ServerMediaSubsession代表一个Track是准确的。以后流指的是那些有数据流动的组合。 “
我来回答
回答14个
时间排序
认可量排序

qq364530507

0个粉丝

23

问答

0

专栏

0

资料

qq364530507 2016-04-14 20:29:23
认可0
看都没人理我,说下现在自己的理解,又百度了别人的代码:

可以看到,一个session,里面可能包含很多种格式的数据,.264  .acc等等,这里的subsession是不是就是为每一个格式的数据都创建一个subsession来进行数据的接收呢?

qq364530507

0个粉丝

23

问答

0

专栏

0

资料

qq364530507 2016-04-15 14:08:48
认可0
我看这个论坛也是完了

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-15 15:27:02
认可0
一次基本的RTSP操作过程是:首先,客户端连接到流服务器并发送一个RTSP描述命令(DESCRIBE)。流服务器通过一个SDP描述来进行反馈,反馈信息包括流数量、媒体类型等信息。
客户端再分析该SDP描述,并为会话中的每一个流发送一个RTSP建立命令(SETUP),RTSP建立命令告诉服务器客户端用于接收媒体数据的端口。

服务器的返回信息例子:
...
m=audio 3456 RTP/AVP 0
m=video 2232 RTP/AVP 31
m=whiteboard 32416 UDP WB
...

意味着要为3个流发送SETUP, 即便只有一个流, 那么也是要创建MediaSubsession来发送SETUP

qq364530507

0个粉丝

23

问答

0

专栏

0

资料

qq364530507 2016-04-18 11:22:33
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28505&ptid=10978]zhuangweiye 发表于 2016-4-15 15:27[/url]
一次基本的RTSP操作过程是:首先,客户端连接到流服务器并发送一个RTSP描述命令(DESCRIBE)。流服务器通过 ...[/quote]

谢谢你,和我后来分析的是一样的,听你这么一说更加肯定了,感觉每次都是你能帮助回答啊,谢谢大神

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-18 11:27:20
认可0
既不大,也不神,所以不用谢

网上搜来的资料,希望对楼主有帮助

qq364530507

0个粉丝

23

问答

0

专栏

0

资料

qq364530507 2016-04-18 11:32:23
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28505&ptid=10978]zhuangweiye 发表于 2016-4-15 15:27[/url]
一次基本的RTSP操作过程是:首先,客户端连接到流服务器并发送一个RTSP描述命令(DESCRIBE)。流服务器通过 ...[/quote]

那个,大神,我还有个向请教的,还望您指教一下:
就是我现在利用live555完成客户端的编写,我参考别人的代码,在afterGettingFrame()这个函数里面,其步骤我理解大概是这样:
1.首先判断是否是视频流的第一帧数据,如果是的话,利用parseSPropParameterSets()函数获取H264编码的SPS,PPS信息,用来在视频数据前添加起始码等信息的视频数据,方便解码
2.如果不是第一帧视频数据,即已经添加了起始码等信息,则处理如下:

可以看到首先对一个timeval类型对的结构体进行判断,我看到这个presentationTime(也是timeval类型结构体)是在afterGettingFrame()函数调用的,但是这个函数是以回调函数的形式被getNextFrame()函数调用了,所以不晓得传入的这个presentationTime是什么,这里进行时间戳的比对是什么意义呢

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-18 11:59:09
认可0
live555没玩过, 不过H.264还是知道点

可能是发送端是按NAL来发送,而不是按帧(这里的帧是指I/P/B)
比如 I frame 可能有多个NAL, 发送端分别发送, 这里就需要客户端自己组成完整的帧, 注意这里和RTP组包不是一个概念

qq364530507

0个粉丝

23

问答

0

专栏

0

资料

qq364530507 2016-04-19 15:35:52
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28604&ptid=10978]zhuangweiye 发表于 2016-4-18 11:59[/url]
live555没玩过, 不过H.264还是知道点

可能是发送端是按NAL来发送,而不是按帧(这里的帧是指I/P/B)
[/quote]

你好,我看了你的回答又上网查了相关信息,知道了H.264编码之后,将一个frame变成多个slilce,然后组成NALU在发送,我想问下,再RTP发送的时候,是否一个frame的多个slilce的时间戳是相同的呢,就是我图中的程序,当发现时间戳和上次相同的时候,继续将数据存入p_nalu_tail,认为一个frame没有结束,而当时间不同的时候,认为此时的slilce已经和上一个不是一个frame内的内,则将完成的一个frame放入队列,不知道我的理解对不对

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-19 16:07:54
认可0
举个例子:
比如编码I frame, 产生3个包分别是SPS, PPS, 实际编码数据包,发送端分别发出, 接收端当然要把这些数据接收下放在一起表示完整的一帧

简单的说, 楼上代码的意思就是重新组数据包, 从每次要先添start code可以看出, 这个数据包都是一个NAL, 比如SPS/PPS等等, 这样可以把一个帧完整的数据都放在一起

这里不是slice的概念,也不是RTP包的概念

举个例子:
比如编码I frame, 产生3个包分别是SPS, PPS, 实际编码数据包,发送端分别发出, 接收端当然要把这些数据接收下放在一起表示完整的一帧, 当然也有可能发送端本来就是一个包处理
但是接收端就要对两种情况都要能处理,所以就有上面的判断了

qq364530507

0个粉丝

23

问答

0

专栏

0

资料

qq364530507 2016-04-19 18:16:16
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28721&ptid=10978]zhuangweiye 发表于 2016-4-19 16:07[/url]
举个例子:
比如编码I frame, 产生3个包分别是SPS, PPS, 实际编码数据包,发送端分别发出, 接收端当然要把这 ...[/quote]

哦哦,原来是这样我看到start code 其实就是“0X00000001”,H264码流一般都是以这个开头的,然后对于每一个NAL包,通过观察start code的下一个字节
NALU 头由一个字节组成, 它的语法如下:
      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+
F: 1 个比特.
  forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.
NRI: 2 个比特.
  nal_ref_idc. 取 00 ~ 11, 似乎指示这个 NALU 的重要性, 如 00 的 NALU 解码器可以丢弃它而不影响图像的回放. 不过一般情况下不太关心
这个属性.
Type: 5 个比特.
  nal_unit_type. 这个 NALU 单元的类型. 简述如下:
  0     没有定义
  1-23  NAL单元  单个 NAL 单元包.
  24    STAP-A   单一时间的组合包
  25    STAP-B   单一时间的组合包
  26    MTAP16   多个时间的组合包
  27    MTAP24   多个时间的组合包
  28    FU-A     分片的单元
  29    FU-B     分片的单元
  30-31 没有定义
1~23之间:

其中:
7代表序列参数集(SPS)
8代表图像参数集(PPS)
而SPS,PPS都“序列参数集NAL单元必须在传送所有以此参数集为参考的其他NAL单元之前传送”,“图像参数集NAL单元必须在所有以此参数集为参考的其他NAL单元之先,”

?????????????????
??这里的参考集市是指的什么哇??
?????????????????


因此在上面程序的最开始,当第一次接受到数据的时候,首先将SPS,PPS提取出来,放在最前面,然后加上了start code,以及fReceiveBuffer中的图像数据,之后保存了时间戳,
等到下一次数据到来的时候,则继续加上start code 以及fReceiveBuffer,一直到时间戳和上次保存的不同,人为一个frame已经发送完成了,将完整的数据发送到队列中,也就是说此时发送的就是
SPS+PPS+start+fReceiveBuffer+start+fReceiveBuffer+start+fReceiveBuffer+start+fReceiveBuffer这样的吗?
这样不是把一个frame分成了多个sliilce的感觉吗?
谢谢你回答了我这么多问题啊,真的很感谢

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-20 08:18:55
认可0
SPS+PPS+start+fReceiveBuffer+start+fReceiveBuffer+start+fReceiveBuffer+start+fReceiveBuffer这样的吗?

正解
原因是:server可以只实现一种发送方式即可, 而client就要把所有可能性都要处理到位

qq364530507

0个粉丝

23

问答

0

专栏

0

资料

qq364530507 2016-04-20 09:33:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28759&ptid=10978]zhuangweiye 发表于 2016-4-20 08:18[/url]
SPS+PPS+start+fReceiveBuffer+start+fReceiveBuffer+start+fReceiveBuffer+start+fReceiveBuffer这样的吗 ...[/quote]

非常感谢您

qq364530507

0个粉丝

23

问答

0

专栏

0

资料

qq364530507 2016-04-20 09:35:19
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28759&ptid=10978]zhuangweiye 发表于 2016-4-20 08:18[/url]
SPS+PPS+start+fReceiveBuffer+start+fReceiveBuffer+start+fReceiveBuffer+start+fReceiveBuffer这样的吗 ...[/quote]

通过时间戳可以判断此时到达的NALU是不是和上一个NALU属于同一个frame吗?

18823762523

1个粉丝

8

问答

0

专栏

2

资料

18823762523 2017-11-22 11:23:13
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28498&ptid=10978]qq364530507 发表于 2016-4-15 14:08[/url]
我看这个论坛也是完了[/quote]

楼主能不能分享一下live555客户端工程,谢谢
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区