Fix the issue of failing to push streams to FMS 3.0 server. (#3362)

[how]
1. AMF 为简单类型时填插 AMF Null (参考 OBS 以及实际测试)
2. createStream 前附加 releaseStream 和 FCPublish, 兼容旧 FMS3.0
3. 正确处理 RTMP Header fmt 为 1 和 2 的业务逻辑
This commit is contained in:
haorui wang 2024-03-16 21:58:33 +08:00 committed by GitHub
parent 69738ad24e
commit 3b7f16b755
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 44 additions and 9 deletions

View File

@ -165,7 +165,14 @@ void RtmpProtocol::sendResponse(int type, const string &str) {
void RtmpProtocol::sendInvoke(const string &cmd, const AMFValue &val) { void RtmpProtocol::sendInvoke(const string &cmd, const AMFValue &val) {
AMFEncoder enc; AMFEncoder enc;
if (val.type() == AMFType::AMF_OBJECT || val.type() == AMFType::AMF_NULL)
{
enc << cmd << ++_send_req_id << val; enc << cmd << ++_send_req_id << val;
}
else
{
enc << cmd << ++_send_req_id << AMFValue() << val;
}
sendRequest(MSG_CMD, enc.data()); sendRequest(MSG_CMD, enc.data());
} }
@ -619,12 +626,22 @@ const char* RtmpProtocol::handle_rtmp(const char *data, size_t len) {
case 12: case 12:
chunk_data.is_abs_stamp = true; chunk_data.is_abs_stamp = true;
chunk_data.stream_index = load_le32(header->stream_index); chunk_data.stream_index = load_le32(header->stream_index);
_last_stream_index = chunk_data.stream_index;
case 8: case 8:
chunk_data.body_size = load_be24(header->body_size); chunk_data.body_size = load_be24(header->body_size);
chunk_data.type_id = header->type_id; chunk_data.type_id = header->type_id;
_last_body_size = chunk_data.body_size;
_last_type_id = chunk_data.type_id;
case 4: case 4:
chunk_data.ts_field = load_be24(header->time_stamp); chunk_data.ts_field = load_be24(header->time_stamp);
} }
switch (header->fmt) {
case 2:
chunk_data.type_id = _last_type_id;
chunk_data.body_size = _last_body_size;
case 1:
chunk_data.stream_index = _last_stream_index;
}
auto time_stamp = chunk_data.ts_field; auto time_stamp = chunk_data.ts_field;
if (chunk_data.ts_field == 0xFFFFFF) { if (chunk_data.ts_field == 0xFFFFFF) {

View File

@ -11,6 +11,7 @@
#ifndef SRC_RTMP_RTMPPROTOCOL_H_ #ifndef SRC_RTMP_RTMPPROTOCOL_H_
#define SRC_RTMP_RTMPPROTOCOL_H_ #define SRC_RTMP_RTMPPROTOCOL_H_
#include <cstdint>
#include <memory> #include <memory>
#include <string> #include <string>
#include <functional> #include <functional>
@ -87,6 +88,9 @@ protected:
private: private:
bool _data_started = false; bool _data_started = false;
int _now_chunk_id = 0; int _now_chunk_id = 0;
uint32_t _last_stream_index = 0;
size_t _last_body_size = 0;
uint8_t _last_type_id = 0;
////////////ChunkSize//////////// ////////////ChunkSize////////////
size_t _chunk_size_in = DEFAULT_CHUNK_LEN; size_t _chunk_size_in = DEFAULT_CHUNK_LEN;
size_t _chunk_size_out = DEFAULT_CHUNK_LEN; size_t _chunk_size_out = DEFAULT_CHUNK_LEN;

View File

@ -163,6 +163,18 @@ void RtmpPusher::send_connect() {
} }
void RtmpPusher::send_createStream() { void RtmpPusher::send_createStream() {
// Workaround : 兼容较旧的 FMS3.0
{
{
AMFValue obj(_stream_id);
sendInvoke("releaseStream", obj);
}
{
AMFValue obj(_stream_id);
sendInvoke("FCPublish", obj);
}
}
{
AMFValue obj(AMF_NULL); AMFValue obj(AMF_NULL);
sendInvoke("createStream", obj); sendInvoke("createStream", obj);
addOnResultCB([this](AMFDecoder &dec) { addOnResultCB([this](AMFDecoder &dec) {
@ -173,6 +185,8 @@ void RtmpPusher::send_createStream() {
}); });
} }
}
#define RTMP_STREAM_LIVE "live" #define RTMP_STREAM_LIVE "live"
void RtmpPusher::send_publish() { void RtmpPusher::send_publish() {
AMFEncoder enc; AMFEncoder enc;