关于live555的总结

来源:互联网 发布:外卖软件开发 编辑:程序博客网 时间:2024/06/01 07:58

实时播放有4种形式

1. PC下 VLC 到 VLC

http://blog.csdn.net/qq_29350001/article/details/51507168


2. PC下live555 到 VLC

http://blog.csdn.net/qq_29350001/article/details/51512465


3. 虚拟机 到 VLC

http://blog.csdn.net/qq_29350001/article/details/51539479


4. 开发板 到 VLC

http://blog.csdn.net/qq_29350001/article/details/51539479

或者IPNC包里有自带

IPNC/Source/ipnc_rdk/ipnc_app/network/live  


PS:以上这些都是将已生成好的264文件,进行播放。却不是真正意义上的实时播放。


实时播放需要将RTSP服务器代码移植到encode下的writer.c文件里。

具体代码我不再一一上传了。

讲一下Makefile部分添加动态库

修改Makefile

73行  添加动态库。将LiveServiceRTSPInvoke.so放到/usr/lib文件夹下去

LD_FLAGS += -L$(LINUXLIBS_INSTALL_DIR)/lib -lpthread -lasound  -L /usr/lib -l LiveServiceRTSPInvoke

 

LiveServiceRTSPInvoke.so再放到 开发板/lib

在 /etc/profile 最后添加动态库的支持:

export LD_LIBRARY_PATH=/lib:$LD_LIBRARY_PATH



使用RTSP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Parameter Sets (SPS) Picture Parameter Set (PPS)需要用到,那么这两项从哪里获取呢?答案是从H264码流中获取.H264码流中,都是以"0x00 0x00 0x01"或者"0x00 0x00 0x00 0x01"为开始码的,找到开始码之后,使用开始码之后的第一个字节的5位判断是否为7(sps)或者8(pps), 及data[4] & 0x1f == 7 || data[4] & 0x1f == 8.然后对获取的nal去掉开始码之后进行base64编码,得到的信息就可以用于sdp. spspps需要用逗号分隔开来.

if(( 0 == *(lpDataBuf+0) ) && 

( 0 == *(lpDataBuf+1) ) && 

( 0 == *(lpDataBuf+2) ) && 

( 1 == *(lpDataBuf+3) )  )

{

fNalType = (0x01f&(*(lpDataBuf+4))); //5位判断是否为

}

if( 7 == fNalType )/*SPS*/


00 00 00 01是一个nalu的起始标志。后面的第一个字节,67,是nalu的类型,type & 0x1f == 0x7表示这个nalu是sps,== 0x8表示是pps


先理解关键知识点,不知道有没有误导,H264的帧是以 NAL单元的单位来传送的,一个NAL单元包含一帧(I帧 或 P帧 或 B帧),这三种类型的帧可以百度。所谓的NAL单元就是去掉SPS、PPS的视频帧, I帧是关键帧,所有的解析都需要靠它,两个I帧之间被称为视频序列,I帧头部需要加入SPS和PPS,这两个之间需要0x00000001来分割, 0x00 0x00 0x00 0x01 + SPS的Base64解码形式 + 0x00 0x00 0x00 0x01 + PPS的解码形式 + 0x00 0x00 0x00 0x01 视频帧(IDR帧) 这样组成的一个buffer,FFMPEG的H264解码器才能成功解码。


0 0
原创粉丝点击