最近自己写一个软件,利用海康摄像机的RTSP流通过ffmpeg拉取之后解码成YUV进行相关细节处理,在用X264或者QSV编码,通过rtmp发送到fms的程序。
为了保证程序的稳定性,界面配置控制层和底层转码,图像处理,图像合成等采用了多进程的方式,就是为了方便底层可能不稳定从而易维护(其实就是为了偷懒,真内存泄漏啦啥的,直接结束进程在拉起来,图像中断不超过500ms,感觉挺划算)。
谁知道,踩了坑了。
1.librtmp推流到fms,过一段时间后(这个时间一般是若干小时),从fms拉出来的图像,播放器播放仅能播放第一个I帧,后续的帧解码不出来。不显示。查看流的信息后发现,帧确实收到了,但是没有时间戳,时间戳都是0.所以应该是哪里的时间戳出了问题。使用rtmp我没有采用他的扩展时间戳,是将毫秒级的时间%0xFFFFFF来做的,即到了24位的时间就归零。确实没看出什么问题。但是librtmp的内部其实已经针对时间戳和扩展时间戳做了处理。在 RTMP_SendPacket 中
中已经有了相关的超出0xFFFFFF时间的处理方式,所以其实直接赋值毫秒级时间戳即可。改正之后,貌似问题消失了。当然针对时间戳必须严格递增,音视频必须同一时