2

我已经构建了一个 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,并被截断,导致您在示例图像中看到。

任何帮助将非常感激

谢谢

4

1 回答 1

1

您需要对数据进行正确的打包。Live555 已经拥有一切。通过从文件中读取,将其打包到 rtp 然后发送来查看它是如何工作的。这里唯一的区别是您从编码器而不是文件中获取它。

于 2013-12-11T08:11:29.140 回答