项目中多路RTSP流输入每路输入又有多路不同分辨率的输出 ,FFMpeg 通过RTSP拉流 经过海思转码之后 通过srs_librtmp 推送RTMP到服务器,动态增加输入输出等等 ,这部分的工作已经做得差不多了。现在项目中有个小的需求截图功能,本身海思自身是有截图的例子的,但是 海思自带的截图需要占据一个vpss 和venc通道。而且这个分辨率是得开启编码通道的时候就指定好的,项目中需求是每路输出的不同分辨率截图 ,因此通过海思自身的截图无法实现。
在网上搜了搜 可以使用FFMpeg实现 网上搜了搜也有类似代码 从网上复制了一份代码 稍微修改了之后,经过测试发现 截图的时候 隔着几秒 解出来的图片的时间OSD看基本上都是同一帧图片 ,可能几分钟之后才是一张不同的图片,而且马赛克严重 肉眼很明显的感觉,之前没怎么接触过FFMpeg,只能在网上搜不同的FFMpeg API,关于这个问题很少。后来不知道搜的什么 。意识到 马赛克的原因可能是解码出来的时候不是I帧 ,所以就按这个思路来解决,实际解决方法就是 只有碰到I帧的时候 才去解码。这样试了下 问题迎刃而解。图片延迟不更新的问题也解决了 。
现在还有 不同路的分辨率的分辨率不一样 ,需要做视频缩放,这个FFMpeg实现应该不难,
但是考虑到缩放保存图片可能会比较耗时,所以决定另开一个线程来做这块内容, 主线程 解码出来之后的AVFrame的数据直接扔给这个线程。这样 不会影响主线程的拉流解码工作。
实际上 FFMpeg截图的话 如果是在VENC编码出来之后再做截图的话就不涉及到缩放功能,
但是目前截图功能是在输入端做的,所以如果在输入端做的话就涉及到缩放的问题。
之所以没有在输出端做,是因为FFMpeg解码的时候 需要传一个根据AVPacket来解码解出来AVFrame,而目前的从队列中取出来的packet是普通的packet 中间不知道怎么把这个普通的packet转换成AVPacket,所以就放在输入端来做了 。有知道的可以给博主留言。。。。