我已经构建了一个 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
在 Iron 彩色图像中,帧大小为 212000 字节。
在彩虹色图像中,帧大小为 322000 字节,大于最大帧大小 300000,并被截断,导致您在示例图像中看到。
任何帮助将非常感激
谢谢