live555保存文件的问题

小菜_默 2010-01-05 03:53:34
各位大哥,小菜现在遇到问题了:
用live555保存的文件不可以用vlc播放,在网上查找到了很多的这种问题,就是没有一个完整的答案。
通过查找,说在每个包的前面加上00 00 00 01 但是我在liveMedia/H264VideoFileSink.cpp的 void afterGettingFrame1函数中发现了unsigned char start_code[4] = {0x00, 0x00, 0x00, 0x01}; addData(start_code, 4, presentationTime);这两句,我的理解是在包里面live555自己已经加上了,有的说在保存文件的时候把sps和pps通过Base64解码写到文件中,这种说法也都不一样,有些人说只在文件的开头写上就行,有的说在每个I帧前面加上,有的说只写sps,有的说全都写。
虽然说的方法是很多,但是只有这样冷统的说法,对于初学者来说,根本就不会理解的,比如,sps和pps是怎么得到的?解答的人说在SDP中,SDP从RTSP流中提取,还要通过Base64进行解码,如果你是初学者,你会吗?我不会。在解出sps和pps后怎么和addData的写文件结合?牛X的人会说,自己看,代码写的很清楚。live555不是个小的东西把,它的结构很大,类继承的也很深,不是一朝一夕就可以看会的,也许真的很简单,初学者也会钻牛角尖,不是吗?
希望有经验的人可以指点一下小菜,谢谢!我的问题有这么几个:
1、我知道调用MediaSubsession类中的fmtp_spropparametersets方法可以得到SDP中的sps和pps,但是在什么地方得到才是最好的?就是说在什么地方得到sps和pps与文件结合最方便。
2、在什么地方调用Base64去对sps和pps解码?
3、是在文件的开头些sps和pps还是在每一个I帧前面写?如果在每个I帧前面写怎样判断是I帧?
4、在代码的什么地方保存文件好?还是在addData中?
5、在什么地方sps和pps与文件结合?
6、或者有什么更好的方法呢?

谢谢各位大哥的讲解,当问题解决后我会总结出一个详细的方案更大家一起学习,谢谢!(该贴会继续加分)

...全文
2291 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
小菜_默 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 tairikun01 的回复:]
引用 29 楼 ct200901 的回复:
~~现在已经解决了~~解决方式就是在保存文件时从第一个sps处开始保存,保存的文件就可以被VLC播放!


直接保存的文件播放时帧率正常么?怎么控制帧率啊?
[/Quote]

额,,,这个我没有控制,,只是保存起来而已~~~
tairikun01 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 ct200901 的回复:]
~~现在已经解决了~~解决方式就是在保存文件时从第一个sps处开始保存,保存的文件就可以被VLC播放!
[/Quote]

直接保存的文件播放时帧率正常么?怎么控制帧率啊?
fixdot 2010-12-20
  • 打赏
  • 举报
回复
偶实现了live555+ffmpeg+sdl显示,需要的q我:一一五六九九四二八一
大龄代码农民 2010-06-09
  • 打赏
  • 举报
回复
就是没有pps 和sps 头
大龄代码农民 2010-06-09
  • 打赏
  • 举报
回复
asdfsadfsdafsafsdf
yxcumt6 2010-04-17
  • 打赏
  • 举报
回复
学习.......
小菜_默 2010-03-24
  • 打赏
  • 举报
回复
~~现在已经解决了~~解决方式就是在保存文件时从第一个sps处开始保存,保存的文件就可以被VLC播放!
lyg1761983 2010-03-09
  • 打赏
  • 举报
回复
遇到了同样的问题,你最后生成的本地264文件能用vlc 播放了吗?
小菜_默 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 kensp1 的回复:]
请问有没有答案啊

[/Quote]
呵呵,没有阿,有的话我早就总结了阿~~
kensp1 2010-02-03
  • 打赏
  • 举报
回复
请问有没有答案啊
小菜_默 2010-01-12
  • 打赏
  • 举报
回复
不知道是怎么回事!从我保存的文件上来看,他是带有pps和sps的,问题正在解决!
小菜_默 2010-01-09
  • 打赏
  • 举报
回复
通过大家和 kevin@liu 的指导,先把我理解到的总结一下,有任何不对的地方还请大家指出:
现在我只是在playCommon.cpp的主函数中调用的,在if (!subsession->initiate(simpleRTPoffsetArg))的else下面,fmtp_spropparametersets()返回的是sps和pps 我调用了 parseSPropParameterSets 函数,它的返回值是一个 SPropRecord 类型,参数就是fmtp_spropparametersets(),假如我定义的SPropRecord的指针是Info,那么Info[0]就是sps,长度是46,Info[1]就是pps,长度是四。
不知道我的理解是否正确。
还有一个问题,如果我10分钟就重新保存一个文件,那么,所有的sps和pps都用那一个吗?
xastra 2010-01-08
  • 打赏
  • 举报
回复
NALU中不是可以判断该单元是什么类型吗?如果是sps,pps,你就开始保存
rightorwrong 2010-01-08
  • 打赏
  • 举报
回复
你可以用抓包工具,看DESCRIBE返回的sdp description字段有没有lius1984说的sprop-parameter-sets信息,如果有就按照lius1984方法,
我们的设备sps和pps信息是发RTP时发过来的,你的应该不是
lius1984 2010-01-08
  • 打赏
  • 举报
回复
从sdp description提取出sprop-parameter-sets之后的内容然后再做base64解码。 已经足够具体了,难道还要“手把手教你流媒体开发”? 多看文档,多GOOGLE吧。

a=fmtp:96 packetization-mode=1;profile-level-id=4366376;sprop-parameter-sets=Z0KgKOcoDwBE/LgIgAAHCAABX5AwAAANWfgAAas/EXvxgAAAas/AAA1Z+IvfjQ==,aN48gA==
a=control:track1

小菜_默 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 rightorwrong 的回复:]
H264正确的应该是00 00 00 001 67 。。。68。。。。65,这样的数据。你的文件肯定有问题了。可能是还没有pps信息
[/Quote]
恩,这就是要点,我不知道怎么把sps和pps写您去,如在哪提取,在哪写入等、、、应该怎么做呢?
小菜_默 2010-01-08
  • 打赏
  • 举报
回复
谢谢lius1984 rightorwrong numen115的回答,我先试试大家提供的方法,有问题在贴出来,还有一个问题,如果我10分钟就重新保存一个文件,那么,所有的sps和pps都用那一个吗?
小菜_默 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lazyter1 的回复:]
udp:乱序,丢包,速度较快。
tcp:反之。

live555默认是rtp over UDP,符合实时性要求,所以你要下载再播放,的确叫做录播。而不是live 直播。这样就需要你在内存中进行缓存,将RTP包进行排序,并且有丢包发生的话,还需要处理容错。

不过,根据rfc标准,可以考虑rtp over TCP。这样就没问题了。
[/Quote]
您好,您的意思是说我在保存时还要在内存中进行缓存以及排序?我不太明白您的意思。
我现在了解到的是live555保存的是es流,而vlc可以播放的是ts流,这样的话要对es进行封包,这是一种方法,但是现在不会封ts包!还有个疑问就是在es流中加入sps和ppsvlc就可以播放吧!
lazyter1 2010-01-07
  • 打赏
  • 举报
回复
udp:乱序,丢包,速度较快。
tcp:反之。

live555默认是rtp over UDP,符合实时性要求,所以你要下载再播放,的确叫做录播。而不是live 直播。这样就需要你在内存中进行缓存,将RTP包进行排序,并且有丢包发生的话,还需要处理容错。

不过,根据rfc标准,可以考虑rtp over TCP。这样就没问题了。
小菜_默 2010-01-07
  • 打赏
  • 举报
回复
怎么还没有人呢?
加载更多回复(15)

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧