rtmp信令交互过程分析六-元数据(onMetaData)

概述

在publish或者play之后就是开始传输媒体数据了,媒体数据分为3种,script脚本数据、video视频数据、audio音频数据。首先需要传输的是脚本数据onMetaData,也称为元数据。onMetaData主要描述音视频的编码格式的相关参数。

如果是发布端向服务器推流,则onMetaData的方向是C->S,如果是播放器向服务器拉流,则onMetaData的方向是S->C。

  • videocodecid=7对应的视频编码是H.264
  • audiocodecid=7对应的音频编码是G711A
  • audiocodecid=8对应的音频编码是G711U
  • audiocodecid=10对应的音频编码是AAC

举例

发布端向服务器推流 C->S

AMF0 Data onMetaData()

RTMP Header
    01.. .... = Format: 1
    ..00 0011 = Chunk Stream ID: 3
    Timestamp delta: 0
    Timestamp: 0 (calculated)
    Body size: 219
    Type ID: AMF0 Data (0x12)
RTMP Body
    String 'onMetaData'
    ECMA array (10 items)
        AMF0 type: ECMA array (0x08)
        Array length: 10
        Property 'title' String 'ipc'
        Property 'width' Number 640
        Property 'height' Number 480
        Property 'framerate' Number 25
        Property 'videocodecid' Number 7
        Property 'audiocodecid' Number 8
        Property 'audiodatarate' Number 64
        Property 'audiosamplerate' Number 8000
        Property 'audiosamplesize' Number 16
        Property 'stereo' Boolean true
        End Of Object Marker
播放器向服务器拉流 S->C

AMF0 Data onMetaData()

RTMP Header
    00.. .... = Format: 0
    ..00 0101 = Chunk Stream ID: 5
    Timestamp: 0
    Body size: 387
    Type ID: AMF0 Data (0x12)
    Stream ID: 1
RTMP Body
    String 'onMetaData'
    Object (14 items)
        AMF0 type: Object (0x03)
        Property 'Server' String 'NGINX RTMP (github.com/arut/nginx-rtmp-module)'
        Property 'width' Number 640
        Property 'height' Number 480
        Property 'displayWidth' Number 640
        Property 'displayHeight' Number 480
        Property 'duration' Number 0
        Property 'framerate' Number 25
        Property 'fps' Number 25
        Property 'videodatarate' Number 0
        Property 'videocodecid' Number 7
        Property 'audiodatarate' Number 64
        Property 'audiocodecid' Number 8
        Property 'profile' String ''
        Property 'level' String ''
        End Of Object Marker