参考文章:树莓派使用mjpg-streamer不显示图像-CSDN社区
其中,用户“神说要有光o ”的回复能够成功解决,这是目前我全网搜到的唯一给出的解决方案,很感谢这位大神!大大减少了我单独再去阅读源码的时间,随后发了个提问,以寻求解决思路,借鉴牛人是如何解决问题的。
提问地址:(46条消息) mjpg-streamer的mjpeg格式下不显示图片,yuy可以。-服务器-CSDN问答
用户"IT论之程序员 "给出了详细的回答,收益匪浅,捋清了很多流程,再次感谢!!
以下是用户"IT论之程序员 "具体的回答:
您好,非常感谢您的赞美,我当时解决这个问题的思路是:
- 根据报错信息mjpeg格式下不显示图片,yuy可以。可以判断出是mjpeg格式的视频流解析出问题了,首先想到的是解析mjpeg格式的地方可能有bug。
- mjpg-streamer是一个开源的mjpeg视频流服务器,所以首先去翻阅它的源码,定位到解析mjpeg格式视频的地方。
- 在mjpg-streamer的源码中,找到input_uvc.c这个文件,里面有解析usb视频设备获得的mjpeg格式视频流的代码。
- 仔细阅读其中的uvc_mjpeg_decode函数,发现里面有这么一段代码:
c
pglobal->inlpcontext->id.size =
memcpy(pglobal->inpcontext->id.buf, pcontext->videoln->tmpbuffer,
pcontext->videoln->buf.bytesused); - 这段代码貌似对mjpeg视频流的解析出现了问题,tmpbuffer保存了一帧mjpeg图片的数据,bytesused表示这一帧图片的大小。但是id.size直接等于bytesused,这似乎不太正确。mjpeg图片的size应该根据mjpeg图片的数据内容得到。
- 所以将这段代码修改为正确解析mjpeg图片size的代码:
c
pglobal->inlpcontext->id.size =
memcpy(pglobal->inpcontext->id.buf, pcontext->videoln->tmpbuffer,
pcontext->videoln->framesizeln);
framesizeln表示解析出的这一帧mjpeg图片的真实大小。 - 修改并重新编译mjpg-streamer后,问题得以解决。
所以总体来说,解决这个问题的关键在于仔细阅读源代码,理解mjpeg格式的解析过程,找出解析出现的问题,并作出正确的修改。希望这个思路能给您一定的帮助。如果有任何其他问题,欢迎您提出,我很乐意进行交流与解答。