OBS-rtmp源码剖析之rtmp发送元数据和音视频包头(六)

这里主要讲解rtmp_stream是怎样调用rtmp.c中的函数进行发送元数据、音频包头和视频包头。包括函数send_meta_data()、send_audio_header()、send_video_header()、send_headers()

static bool send_meta_data(struct rtmp_stream *stream, size_t idx, bool *next)
{
    uint8_t *meta_data;
    size_t  meta_data_size;
    bool    success = true;

    *next = flv_meta_data(stream->output, &meta_data,
            &meta_data_size, false, idx);

    if (*next) {
        success = RTMP_Write(&stream->rtmp, (char*)meta_data,
                (int)meta_data_size, (int)idx) >= 0;
        bfree(meta_data);
    }

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

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

猜你喜欢

转载自blog.csdn.net/tong5956/article/details/81502846