如题,最近公司遇到了一个关于流媒体解码的问题:
平板电脑(安卓5.0以上)将本身的屏幕数据(H264)发送至PC端,PC端将接收到的数据转发给一个班级(60人)的所有平板电脑上,让电脑与所有的平板电脑都同步显示播放发送端平板的桌面,简称“屏幕广播”。
遇到的问题是,在特定的PC机上,会出现PC播放数据黑屏,但是所有的平板(60个)都正常播放屏幕数据。
先粗略分析一下,PC使用的数据与平板使用的数据是完全一样的,因为平板的数据是PC发送出去的,因此先判断数据层面上没有问题,那就只能是PC端的代码有问题。
然后我开始查PC端的代码,PC的播放客户端是用c#开发的,核心是用C++调用了FFMPEG中的avcodec工具类,然后封装成了DLL给c#使用,工具类中主要使用其中的av_parser_parse2函数来获取流媒体数据中的图片,然后传递给c#写的UI层用于显示。
代码逻辑很简单,那就着手找是哪里出的问题吧:
首先先看一下c#写的UI层有没有问题,打了断点,跟踪了数据,发现问题出现在c#在调用中间层的工具类时,一直都没有接收到图片数据,所以就一直处于黑屏状态,那也就是说,问题精确到了工具类里面。
继续查找问题,既然没有返回图片数据,那就看看解码器在解码数据的时候是不是出现了什么问题,我先跟踪到解码出图片的代码:
ret = avcodec_de