我正在尝试使用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;
}