基于RtspServer的流媒体代理转发

由于项目中需要用到将其他协议转换到rtsp服务中,进行代理转发

基于RtspServer的流媒体代理转发_第1张图片

其中实现了,媒体文件和网络流的RTSP传输。

主要问题,媒体文件的解析,需要进行h264裸流的NALU处理

pushFrame()需要确保RFC6184进行预处理

int find_h264_iframe(unsigned char *data,unsigned int length)
{
    int have_next_nal = 0;
    int ret  = 0;
    int k = 0;
    int find_iframe_exit = 0;
    
    while(find_iframe_exit == 0)
    {
        if((k + 4) > length)
        {
            break;
        }
        if((*(data + k) == 0) && (*(data + 1 + k) == 0) && (*(data + 2 + k) == 0) && (*(data + 3 + k) == 1))
        {
            have_next_nal = 0;
            if(((*(data + 4 + k) & 0x1f) == 0x05) ||((*(data + 4 + k) & 0x1f) == 0x01)
                    ||((*(data + 4 + k) & 0x1f) == 0x02))
            {
                int slice_type = 0;
                slice_type = get_h264_slice_type((data+5+k),length);
                if((slice_type == 2) ||(slice_type == 4) ||(slice_type == 7) ||(slice_type == 9))
                {
                    find_iframe_exit = 1;
                    ret  = 1;
                }
                else
                {
                    find_iframe_exit = 1;
                    ret  = 0;
                }
            }
            else if(((*(data + 4 + k) & 0x1f) == 0x06) || ((*(data + 4 + k) & 0x1f) == 0x07)
                || ((*(data + 4 + k)  & 0x1f) == 0x08) ||((*(data + 4 + k)  & 0x1f) == 0x09))
            {
                have_next_nal = 1;
            }
            else
            {
                find_iframe_exit = 1;
                ret = 0;
            }
            k++;
        }
        else
        {
            if(have_next_nal == 1)
            {
                k++;
            }
            else
            {
                find_iframe_exit = 1;
                ret  = 0;
            }
        }
    }
    //printf("ret = %d\n", ret);
    return ret;  // can't find I frame return 0, fiand I frame return 1
}

你可能感兴趣的:(多媒体)