将TCP上的RTSP交错到av_decode_video2

时间:2018-06-13 13:01:56

标签: tcp rtsp rtp libav

我正在尝试使用libav decode_video2和custom io成功解码我的ip camera流。

我放弃了udp(现在),现在在setup命令中指定tcp interleave选项。

使用rtsp服务器授权并指定tcp后,我开始通过与之连接的同一客户端套接字读取字节。

我可以成功解析rtp_length和通道长度,并在read_buffer函数中读取下一个量(rtp_length),知道下一个数据量与通道有关。一切看起来都不错,解析后的视频数据(ch 0)总是1448大小和音频(ch 20通常总是700大小,在过去解码流时看起来很熟悉。

目前我的问题是av_read_frame永远不会使用我的自定义读取函数返回,但我的读取函数被多次调用。我已经尝试返回从套接字读取的所有数据(ch 0,1,2和3)或只是通道0数据(视频数据),还尝试了通道0和通道2(视频和音频)数据,我认为这些数据剥离了rdt的东西无济于事。

我的问题基本上与频道有关,avcodec需要从这些数据中解码帧 - 数据来自频道,0,1,2,3这些我知道这些与视频和音频有关但是我认为只有0和2是实际的视频和音频数据,因为通道1和3具有小的rtp_length(<100)。

当我在终端ffmpeg -rtsp_transport tcp -i rtsp://中调用时,流似乎是h264本机 - 我的视频流被描述为流映射:   流#0:0 - &gt; #0:0(h264(原生) - &gt; mpeg2video(原生))但我不知道它是h264还是mpeg2video?

我会发布我的read_buffer代码,但我想我只需要了解在使用interleaved tcp for rtsp和custom io read_buffer函数时要发回的内容。

任何指导都非常感谢。下面是我调用av_read_frame ...

时调用的自定义读取函数
int read_buffer(void *opaque, uint8_t *buf, int buf_size){
while(true)
{
    size_t read = tcp_socket_->Read((char*)buf, 4, pp::BlockUntilComplete());
    if( (read == 4 && buf[0] == 0x24))
    {

        unsigned int raw_length;
        unsigned int raw_offset = 0;
        int channel;

        if (buf[0] == 0x24) {
            channel = buf[0 + 1];
            rtp_length  = (buf[0 + 2] << 8 | buf[0 + 3]);
            }
        else
            break;

        read = tcp_socket_->Read((char*)buf, rtp_length, pp::BlockUntilComplete());
        if(channel == 0 || channel == 2)
        {

            return read;
        }
        else
            channel = -1;
    }
    else {
        break;
    }

}
return 0;

}

0 个答案:

没有答案