织梦CMS - 轻松建站从此开始!

罗索

将H.264使用RTMP打包后发送给RED5/FMS进行实时发布

jackyhwei 发布于 2011-11-03 20:32 点击:次 
落鹤生:我之前曾做过一个RTMP视频直播的小东西(http://rg4.net/easyrtmp),可支持直接从摄像头采集编码,也可直接采集视频采集卡采集视频,,然后发布到FMS/Red5。刚刚发现有人也做了类似的东西。呵呵。
TAG:

落鹤生:我之前曾做过一个RTMP视频直播(相关介绍及相关下载文件可浏览此处:http://rg4.net/easyrtmp)的小东西,可支持直接从摄像头采集编码,也可直接采集视频采集卡采集视频,,然后发布到FMS/Red5。刚刚发现有人也做了类似的东西。呵呵。以下为其文章。

需要从硬压卡上获取的NALU封装成RTMP协议格式发送给RED5/FMS进行实时发布.

RTMP中传送 H.264使用的视频封装格式既是 FLV规范 中的 VideoTag

Frame Type UB [4]

Type of video frame. The following values are defined:

  1. 1 = key frame (for AVC, a seekable frame) 
  2. 2 = inter frame (for AVC, a non-seekable frame) 
  3. 3 = disposable inter frame (H.263 only) 
  4. 4 = generated key frame (reserved for server use only) 
  5. 5 = video info/command frame 

CodecID UB [4]

Codec Identifier. The following values are defined:

  1. 2 = Sorenson H.263 
  2. 3 = Screen video 
  3. 4 = On2 VP6 
  4. 5 = On2 VP6 with alpha channel 
  5. 6 = Screen video version 2 
  6. 7 = AVC 

AVCPacketType F UI8

The following values are defined:

  1. 0 = AVC sequence header 
  2. 1 = AVC NALU 
  3. 2 = AVC end of sequence(lower level NALU sequence ender is not required or supported) 

CompositionTime SI24

  1. IF AVCPacketType == 1 
  2. Composition time offset 
  3. ELSE 

See ISO 14496-12, 8.15.3 for an explanation of composition
times. The offset in an FLV file is always in milliseconds.

在第一个RTMP Message的数据包中,需要发送 AVC sequence header , 也就是AVCDecoderConfigurationRecord

其中就包含有Profile / Level / SPS / PPS 等解码需要的信息

然后就开始发送NALU了。

NALU在一个RTMP Message可以发送1个或者多个。

根据 NALU的 reference idc 可以得出 帧类型

  1. typedef enum {  
  2.  NALU_PRIORITY_HIGHEST     = 3,  
  3.  NALU_PRIORITY_HIGH        = 2,  
  4.  NALU_PRIORITY_LOW         = 1,  
  5.  NALU_PRIORITY_DISPOSABLE  = 0  
  6. } NaluRefIdc; 
  7.  
  8. typedef enum { 
  9.  NALU_PRIORITY_HIGHEST     = 3, 
  10.  NALU_PRIORITY_HIGH        = 2, 
  11.  NALU_PRIORITY_LOW         = 1, 
  12.  NALU_PRIORITY_DISPOSABLE  = 0 
  13. } NaluRefIdc;  

如果这个 VideoTag中含有 NALU_PRIORITY_HIGHEST 的NALU, 那么它的VideoTag的 Frame Type 应该是 FrameType_KeyFrame

  1. enum FrameType  
  2. {  
  3.     FrameType_KeyFrame = 1,  
  4.     FrameType_InterFrame = 2,  
  5.     FrameType_DisposableInterFrame = 3,  
  6.     FrameType_GeneratedKeyFrame = 4,  
  7.     FrameType_VideoInfo = 5,  
  8. }; 



 

(wangjia184)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201111/15266.html]
本文出处:blog.csdn.net/wangjia184 作者:wangjia184
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容