과정

스크린샷 2024-11-05 오전 3.31.54.png

createStream

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;
}

Publish

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를 보낼 때 info의 code에서 Success라는 문구를 포함해 전송해서 연결을 수행했기 때문에 Publish 과정에서도 NetStream.Publish.Success를 보냈는데 연결이 정상적으로 되지 않음을 확인했다.

해결 과정에서 RTMP SPEC을 확인했을 때 Info Object의 값으로 NetStream.Play.Start를 보내는 예시를 확인해 Publish도 똑같이 NetStream.Publish.Success 대신 NetStream.Publish.Start을 보내니까 클라이언트에서 미디어 데이터를 보내기 시작했다.

결과