|
板凳
楼主 |
发表于 2020-8-4 16:53:27
|
只看该作者
本帖最后由 appleUncle 于 2020-8-5 09:13 编辑
自己解决了,给后人参考下:
看了好久的live555源码,最后发现live555只需要改下bank_size就差不多完美了,没啥问题
bug在于RK3399Pro入门教程(10)RTSP推流介绍给的例子StreamEncoder.cpp里面有坑啊。- unsigned StreamEncoder::maxFrameSize() const {
- return 80 * 1024;
- }
这段代码限制了单帧最大为80k,往fOutBuffer里面填充帧的时候进来的帧大于80K且fOutBufferSize又大于80k但是小余进来的帧size的时候神奇的一幕出现了,码流大到一定值时客户端卡死,直到码流变小。- void StreamEncoder::copy_to_outputbuffer(void)
- {
- memmove(fOutputBuffer, dstbuf, dstsize);
- fNumValidDataBytes += dstsize;
- fOutputBuffer += dstsize;
- fTotOfFrameToSend++;
- if(dstbuf != NULL)
- free(dstbuf);
- }
- void StreamEncoder::continueReadProcessing1(unsigned frameSize,unsigned numTruncatedBytes,
- struct timeval presentationTime,
- unsigned durationInMicroseconds){
- fNumTruncatedBytes = numTruncatedBytes;
- fPresentationTime = presentationTime;
- fDurationInMicroseconds = durationInMicroseconds;
- encoder_to_h264();
- if(fNumValidDataBytes+dstsize<fOutputBufferSize && fTotOfFrameToSend<fMaxOfFrameToSend)
- {
- copy_to_outputbuffer();
- }
-
- fFrameSize = fNumValidDataBytes;
- gettimeofday(&fPresentationTime, NULL);
- reset();
- FramedSource::afterGetting(this);
- }
上面的代码可以看到,这种情况出现的时候fOutBuffer一直不会更新,live555那边一直没有读到新的帧,vlc播放器就一直卡住!!直到进来了一帧小余80k的,并且fOutBufferSize也小余了80k,才会恢复播放!!
我就震惊了。
live555源码有些看不懂,但是我猜它里面是设置了2个buffer做pingpong的,要把其中一个buffer里面塞帧直到塞不下为止才会叫sink把这个buffer里的帧全部发送出去,然后去填另一个buffer。
而码流是不均匀的,live555判断啥时候是塞不下了,就是靠判断fOutBufferSize是否小余maxFrameSize() 。
解决方法是把最大帧size改大点
- unsigned StreamEncoder::maxFrameSize() const {
- return 180 * 1024;
- }
|
|