正在上传图片(0/1)

【PSDK】官方视频流检测工具使用记录

 1
手机看帖 0 2553
前面一段时间玩了一下DJI PSDK,记录了下入门开发点。PSDK用来传输视频到DJI APP端也是挺有意思的,但是接入PSDK的视频流相应的标准。官方也提供了一个视频流检测工具,使用DJI官方提供的视频流检测工具时貌似遇到点小问题,发个帖记录一下,也供大佬们参考参考

有时间写篇文章就写的啰嗦点,主要记录一下遇到的问题以及检查,要是能对问题排查提供点思路,记录也就有点意义了。
看官方描述,该工具主要是用来检测用PSDK接入DJI无人机来传输到遥控端的视频流符不符合视频传输标准,以便查验出现视频问题是否为传输原始流的问题。
github链接:
https://github.com/dji-sdk/DJIPSDKVideoStreamCheckTool

首先问题发现:
在检测我们自己的视频流时,发现使用工具检测会有异常报错,但是这个报错貌似并不影响视频的解码播放。就顺便用工具检测了一下官方提供的demo裸流文件。
同样会出现报错,如下图:


换个H264解析工具试试,如下,裸流似乎并没有什么问题。



那这个问题可能就需要再仔细看看了,关注到检测工具实际就是基于ffmpeg解码的一段应用代码,是开源的,那就看看代码。
通过代码可以看到,工具检测实际检测的并不是我们直接传入的Custom-H264文件,会有一个tmp.h264中间文件生成,再解析检测的,先抛开代码,直接用H264分析软件查看这个tmp文件



这样一对比看,似乎有点头绪。再来定点查找代码:
https://github.com/dji-sdk/DJIPS ... /chk_strm_entry.cpp
switch (naluType)
{
        case 0x07: // SPS
                spsLen = len;
                break;
        case 0x08: // PPS
                ppsLen = len;
                addSlice = true;
                break;
        default:
                if (addSlice == true) {
                        sliceLen = len + spsLen + ppsLen;
                        addSlice = false;
                } else {
                        sliceLen = len;
                }
                frameInfo[packetCount].size = sliceLen;
                frameInfo[packetCount].positionInFile = position - frameInfo[packetCount].size;
                *frameCount = packetCount;

                if (packetCount >= frameInfoBufferCount) {
                        printf("frame buffer is full.");
                        goto out;
                }
                packetCount++;
                break;
}

代码中SEI帧没有做处理,仅对SPS和PPS和I帧进行了组包,也就比较明确看出SEI是单独当做帧并添加了AUD字段,导致解码失败报错,如果咱们自己接入的视频流,每个I帧前面都带有SEI帧,使用DJI 工具检测时就会规律的出现解码报,也就会看到检测通过与报错并存的检测结果。

照猫画虎,简单修改一下再来验证看看:
switch (naluType)
{
        case 0x07: // SPS
                spsLen = len;
                break;
        case 0x08: // PPS
                ppsLen = len;
                addSlice = true;
                break;
        case 0x06: // SEI
                seiLen = len;
                addSeiSlice = true;
                break;
        default:   
                if (addSlice == true && addSeiSlice == true) {
                        sliceLen = len + spsLen + ppsLen + seiLen;
                        addSlice = false;
                        addSeiSlice = false;
                }
                else if(addSlice == true && addSeiSlice == false)
                {
                        sliceLen = len + spsLen + ppsLen;
                        addSlice = false;
                }
                else
                {
                        sliceLen = len;
                }
                frameInfo[packetCount].size = sliceLen;
                frameInfo[packetCount].positionInFile = position - frameInfo[packetCount].size;
                *frameCount = packetCount;

                if (packetCount >= frameInfoBufferCount) {
                        printf("frame buffer is full.");
                        goto out;
                }
                packetCount++;
                break;
}

编译运行,问题貌似解决了。

再回过头去看看官方PSDK视频标准,Custom-H264貌似是可以携带SEI的,仅是DJI-H264会丢弃SEI信息,所以暂时看这部分修改应该是没有什么问题。放这供讨论。

评论
上传
你需要登录之后才能回帖    登录 | 注册
取消 点赞 评论
分享至:
回复:
上传
取消 评论
快速回复 返回顶部 返回列表