使用librtmp进行推流,如果进行正常的H264推流,使用VLC等播放器,可正常播放。如果需要使用flash等播放器时,需在开始推流时,加入RTMP_PACKET_TYPE_INFO 0x12的数据包。
char* put_amf_string(char *c, const char *str)
{
uint16_t len = strlen(str);
c = AMF_EncodeInt16(c, c + 2, len);
memcpy(c, str, len);
return c + len;
}
int sendScriptData(const uint32_t videoW, const uint32_t videoH, const uint32_t frameRate)
{
const uint32_t uiPkgLen = 16 + 13 + 23 + 16 + 17 + 20 + 23 + 3;
RTMPPacket packet;
RTMPPacket_Reset(&packet);
RTMPPacket_Alloc(&packet, uiPkgLen+1);
char* p = (char*)packet.m_body;
*p++ = AMF_STRING;
p = put_amf_string(p, "@setDataFrame");
*p++ = AMF_STRING;
p = put_amf_string(p, "onMetaData");
*p++ = AMF_OBJECT;
p = put_amf_string(p, "copyright");
*p++ = AMF_STRING;
p = put_amf_string(p, "firehood");
p = put_amf_string(p, "width");
p = AMF_EncodeNumber(p, p + 9, videoW);
p = put_amf_string(p, "height");
p = AMF_EncodeNumber(p, p + 9, videoH);
p = put_amf_string(p, "framerate");
p = AMF_EncodeNumber(p, p + 9, frameRate);
p = put_amf_string(p, "videocodecid");
p = AMF_EncodeNumber(p, p + 9, 7);
p = put_amf_string(p, "");
*p++ = AMF_OBJECT_END;
packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM;
packet.m_packetType = RTMP_PACKET_TYPE_INFO;
packet.m_hasAbsTimestamp = 0;
packet.m_nTimeStamp = 0;
packet.m_nChannel = STREAM_CHANNEL_VIDEO;
packet.m_nInfoField2 = _rtmp->m_stream_id;
packet.m_nBodySize = uiPkgLen;
int iRet = sendRtmpPackage(&packet);
RTMPPacket_Free(&packet);
return iRet;
}
网友评论