static bool send_audio_header(struct rtmp_stream *stream, size_t idx, bool *next) { obs_output_t *context = stream->output; obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, idx); uint8_t *header; struct encoder_packet packet = { .type = OBS_ENCODER_AUDIO, .timebase_den = 1 }; if (!aencoder) { *next = false; return true; } obs_encoder_get_extra_data(aencoder, &header, &packet.size); packet.data = bmemdup(header, packet.size); return send_packet(stream, &packet, true, idx) >= 0; } static bool send_video_header(struct rtmp_stream *stream) { obs_output_t *context = stream->output; obs_encoder_t *vencoder = obs_output_get_video_encoder(context); uint8_t *header; size_t size; struct encoder_packet packet = { .type = OBS_ENCODER_VIDEO, .timebase_den = 1, .keyframe = true }; obs_encoder_get_extra_data(vencoder, &header, &size); packet.size = obs_parse_avc_header(&packet.data, header, size); return send_packet(stream, &packet, true, 0) >= 0; } static inline bool send_headers(struct rtmp_stream *stream) { stream->sent_headers = true; size_t i = 0; bool next = true; bool fail = false; if (!send_audio_header(stream, i++, &next)) return false; if (!send_video_header(stream)) return false; while (next) { if (!send_audio_header(stream, i++, &next)) return false; } return true; }
static void send_audio_header(struct rtmp_stream *stream) { obs_output_t context = stream->output; obs_encoder_t aencoder = obs_output_get_audio_encoder(context); uint8_t *header; struct encoder_packet packet = { .type = OBS_ENCODER_AUDIO, .timebase_den = 1 }; obs_encoder_get_extra_data(aencoder, &header, &packet.size); packet.data = bmemdup(header, packet.size); send_packet(stream, &packet, true); } static void send_video_header(struct rtmp_stream *stream) { obs_output_t context = stream->output; obs_encoder_t vencoder = obs_output_get_video_encoder(context); uint8_t *header; size_t size; struct encoder_packet packet = { .type = OBS_ENCODER_VIDEO, .timebase_den = 1, .keyframe = true }; obs_encoder_get_extra_data(vencoder, &header, &size); packet.size = obs_parse_avc_header(&packet.data, header, size); send_packet(stream, &packet, true); } static void send_headers(struct rtmp_stream *stream) { #ifdef FILE_TEST stream->test = os_fopen("D:\\bla.flv", "wb"); #endif send_meta_data(stream); send_audio_header(stream); send_video_header(stream); }