我已经构建了一个版本的Live555,它使用FFMPEG对视频进行编码并在RTSP上进行流。
基本上,它可以工作,但RTSP流非常紧张。
我进一步研究了它,结果发现Live555的最大缓冲区大小(fMaxSize)太小,而Live555正在截断帧,如下所示:
/* This should never happen, but check anyway.. */
if (newFrameSize > fMaxSize) {
fFrameSize = fMaxSize;
fNumTruncatedBytes = newFrameSize - fMaxSize;
} else {
fFrameSize = newFrameSize;
}现在,我几乎无法控制来自FFMPEG的数据包有多大,我可以设置较低的比特率,但是质量很高,而且数据包仍然太大!
基本上,FFMPEG决定每个帧在这里有多大:
int reti = avcodec_encode_video2(m_c, &pkt, m_frame, &got_packet);如果pkt.size > fMaxSize,那么该帧将被截断,Live555将填充视频流,这一直是这样做的。另外,FFMPEG有时决定对帧进行缓冲,这样数据包就可以大于一个帧。
我可以试着告诉Live555增加它的缓冲区大小,但是它完全忽略了它:
OutPacketBuffer::maxSize = 100000;还有其他人有办法正确地传输编码视频吗?我已经尝试过分解数据包并将它们以较小的块传递给Live555,但是它不起作用,如果我发送更多的数据包,Live555就会降低它的fMaxSize。
我的密码在这里:
https://dl.dropboxusercontent.com/u/15883001/Code.zip
在这里可以看到RTSP流正在发生的一些图像,您可以在更详细的图像中看到LIVE555很难正确发送数据包:
https://dl.dropboxusercontent.com/u/15883001/vlcsnap-2013-12-12-09h34m30s225.zip
在黑白图像中,帧大小为117000字节,小于最大帧大小300000。
在铁彩色图像中,帧大小为212000字节。
在彩虹彩色图像中,帧大小为322000字节,大于最大帧大小300000,并且被截断,从而导致在示例图像中看到的结果。
任何帮助都将不胜感激。
谢谢
发布于 2013-12-11 08:11:29
您需要对数据进行正确的打包。Live555已经拥有了一切。看看它是如何工作的,方法是从一个文件中读取,将它打包到rtp,然后发送它。这里唯一的区别是,您从编码器而不是文件中获取它。
https://stackoverflow.com/questions/20510484
复制相似问题