
const RESULT_COMMAND_MESSAGE = (streamCount: number) => {
return {
cmd: '_result',
transId: 4,
cmdObj: null,
info: {
streamCount,
},
};
};
function createStream(socket: net.Socket, streamCount: number) {
const responsePayload = encodeAmf0Cmd(RESULT_COMMAND_MESSAGE(streamCount));
writeType0Packet(socket, 4, 20, responsePayload);
return true;
}
createStream 명령이 오면 Command Message Result Response Message를 보낸다.const RESULT_COMMAND_MESSAGE = {
cmd: 'onStatus',
transId: 0,
cmdObj: null,
info: {
level: 'status',
code: 'NetStream.Publish.Start',
description: 'Publish succeeded.',
objectEncoding: 0,
},
};
function publish(socket: net.Socket) {
const streamBeginPayload = Buffer.alloc(2);
streamBeginPayload.writeIntBE(0, 0, 2);
writeType0Packet(socket, 2, 4, streamBeginPayload);
const responsePayload = encodeAmf0Cmd(RESULT_COMMAND_MESSAGE);
writeType0Packet(socket, 4, 20, responsePayload);
return true;
}
Command Message 가 publish 요청이라면 Command Message streamBegin 을 보낸다.publish 명령이 오면 Command Message onStatus Response Message를 보낸다.이전까지의 연결 과정에서 Command Message를 보낼 때 info의 code에서 Success라는 문구를 포함해 전송해서 연결을 수행했기 때문에 Publish 과정에서도 NetStream.Publish.Success를 보냈는데 연결이 정상적으로 되지 않음을 확인했다.
해결 과정에서 RTMP SPEC을 확인했을 때 Info Object의 값으로 NetStream.Play.Start를 보내는 예시를 확인해 Publish도 똑같이 NetStream.Publish.Success 대신 NetStream.Publish.Start을 보내니까 클라이언트에서 미디어 데이터를 보내기 시작했다.