OBS SRS RTMP 关于对于Hevc支持的介绍

OBS 29.1支持RTMP的HEVC,所以你现在可以用OBS和SRS做HEVC的直播了。

现在,RTMP支持HEVC出新标准了,详见Enhanced RTMP。这个标准定义了一个新的codec ID,用于HEVC,即fourCC hvc1, OBS和SRS都支持这个标准。

Enhanced RTMP 协议的具体内容和样例如下:

在 Enhanced RTMP 中,使用了新的 AMF 数据类型和协议格式,以支持更多的音视频编码方式和标识符。其中,对于 HEVC/H.265 编码,使用 fourCC hvc1 作为其 codec ID。

在建立连接时,可以使用“connect”命令设置与 RTMP 服务器的连接参数,包括 URL、流名称、音视频编码方式、标识符等。例如:

connect {
    app: "live",
    tcurl: "rtmp://example.com/live",
    swfUrl: "http://example.com/player.swf",
    pageUrl: "http://example.com/page.html",
    flashVer: "LNX 11,2,202,577",
    type: "nonprivate",
    authKey: "your-auth-key",
    username: "your-username",
    password: "your-password",
    audioCodec: "AAC",
    audioSampleRate: 44100,
    audioChannels: 2,
    videoCodec: "H.265",
    videoFourCC: "hvc1",
    videoBitrate: 2000,
    width: 1280,
    height: 720,
}

在传输数据时,可以使用“publish”命令将音视频数据流发送给 RTMP 服务器。例如:

publish {
    name: "stream",
    type: "live",
    audioTime: 0,
    videoTime: 0,
    audioData: [0x12, 0x34, 0x56, ...],
    videoData: [0xab, 0xcd, 0xef, ...],
}

需要注意的是,Enhanced RTMP 是一种增强型 RTMP 协议,与传统的 RTMP 协议存在一些差异。因此,在实际使用 Enhanced RTMP 进行音视频传输时,需要根据具体的协议格式和参数进行相应的设置和调整,以确保数据流的正确传输和解析。

Packet 1
RTMP message type: AMF0 Command Message (20)
Payload length: 148

RTMP body
connect (command)
{
  app: <"live">
  tcUrl: <"rtmp://example.com:1935/live">
  swfUrl: <"http://example.com/player.swf">
  flashVer: <"WIN 19,0,0,226">
  capabilities: 15.0
  audioCodecs: 10.0
  videoCodecs: 7.0
  videoFunction: 1.0
  pageUrl: <"http://example.com/page.html">
  type: <"nonprivate">
}

User Datagram Protocol, Src Port: 49196, Dst Port: 1935
RTMP message type: AMF0 Command Message (20)
Payload length: 53

RTMP body
createStream (command)
{
}

RTMP message type: AMF0 Command Message (20)
Payload length: 186

RTMP body
publish (command)
{
  streamId: 1
  streamName: <"stream">
  type: <"live">
  videoCodecId: <"hvc1">
  videoWidth: 640
  videoHeight: 360
  audioCodecId: <"mp4a">
  audioSampleRate: 44100
  audioChannels: 2
}

RTMP VIDEO 数据消息:

Packet 235
RTMP message type: Video Data Message (9)
Payload length: 738

FLV Tag
Tag header
  Type: Video (0x09), Size: 738, Timestamp: 0
  StreamID: 1
Video tag data
  Frame Type: Inter frame, CodecID: hvc1
  AVC NALU Payload: 0000000164012ac02fa001000381e70451c1f000005f90588c0

上面的数据包中,第一部分是 RTMP CONNECT、createStream、publish 等消息,可以看到其中声明了音视频编码方式、标识符、流名称、帧宽高等参数。第二部分是 RTMP VIDEO 数据消息,其中声明了帧类型、CodecID、AVC NALU Payload 等信息,用于表示具体的视频数据。

需要注意的是,在实际的 Enhanced RTMP 数据包中,还会存在其他的消息类型和字段。为了完成特定的任务,Enhanced RTMP 协议支持众多的命令、状态、事件等,需要根据具体的使用场景进行相应的设置和调整。

对于 RTMP 协议传输 H.264 视频数据而言,与传输 HEVC 视频数据相比,主要有以下几个标记性的区别点:

  1. CodecID 不同:H.264 使用的 CodecID 是 7,而 HEVC 使用的 CodecID 是 hvc1。

  2. NALU 头部长度不同:H.264 的 NALU 头部长度为 4 字节,而 HEVC 的 NALU 头部长度为 2 字节。在 Enhanced RTMP 中,使用“videoCodecId”字段来指定视频编码方式,如果是 H.264,则需要将该字段设置为“avc1”。

  3. SPS、PPS 数据结构不同:H.264 和 HEVC 在 SPS、PPS 数据结构上存在差异。因此,在发送 H.264 视频数据时,需要在第一个关键帧之前先发送 SPS、PPS 数据,并在每个关键帧前发送 PPS 数据。在 Enhanced RTMP 中,可以使用“videoSPS”和“videoPPS”字段来设置 SPS 和 PPS 数据。具体的数据格式和字段解析方式,可以参考 H.264 的相关文档和 ISO/IEC 14496-10 标准。

  4. 显示模式(display mode)设置不同:在 H.264 中,需要设置 NALU 的“seq_parameter_set_id”字段和“pic_parameter_set_id”字段,以及每个帧的“frame_num”和“display_order”。而在 HEVC 中,需要设置“temporal_id”和“decode_order”。在 Enhanced RTMP 中,可以使用“videoDisplayMode”字段来设置显示模式。具体的设置方式和参数说明,可以参考 RTMP 视频数据的相关文档和工具。

总体来说,传输 H.264 视频数据的流程比传输 HEVC 要简单,但需要注意各个字段的设置和格式要求,确保视频数据能够正确地解码和播放。

猜你喜欢

转载自blog.csdn.net/huapeng_guo/article/details/130123950