DJI-264图传码流,画面静止时会出现花屏,如何解决?

Comments

56 comments

  • develop

    分包推送前,保存的码流文件

    https://space.dingtalk.com/s/gwHOAvMCtgLODQRqlgPaACAyOTI3MWY4ZmM1OGE0YzVmYTBlNjA0MTZhYjdlZTg1ZQ 密码: 4Ynj

    0
    Comment actions Permalink
  • develop

    静态时,花屏截图和 pilot录屏视频如下

    视频链接

    https://space.dingtalk.com/s/gwHOAvK2cQLODQRqlgPaACBkZDM4YmMyMjlhMzQ0YTZiODg3ODY4MDAwMDFiYWNmOA 密码: xWsG

    0
    Comment actions Permalink
  • develop

    使用第三方软件测试得到的 sps 和 pps 信息

    ==================== NAL ====================

     forbidden_zero_bit : 0

     nal_ref_idc : 1

     nal_unit_type : 7 ( Sequence parameter set )

    ======= SPS =======

     profile_idc : 100

     constraint_set0_flag : 0

     constraint_set1_flag : 0

     constraint_set2_flag : 0

     constraint_set3_flag : 0

     constraint_set4_flag : 0

     constraint_set5_flag : 0

     reserved_zero_2bits : 0

     level_idc : 40

     seq_parameter_set_id : 0

     chroma_format_idc : 1

     residual_colour_transform_flag : 0

     bit_depth_luma_minus8 : 0

     bit_depth_chroma_minus8 : 0

     qpprime_y_zero_transform_bypass_flag : 0

     seq_scaling_matrix_present_flag : 0

     log2_max_frame_num_minus4 : 4

     pic_order_cnt_type : 2

       log2_max_pic_order_cnt_lsb_minus4 : 0

       delta_pic_order_always_zero_flag : 0

       offset_for_non_ref_pic : 0

       offset_for_top_to_bottom_field : 0

       num_ref_frames_in_pic_order_cnt_cycle : 0

     num_ref_frames : 1                                // max_num_ref_frames

     gaps_in_frame_num_value_allowed_flag : 0

     pic_width_in_mbs_minus1 : 79

     pic_height_in_map_units_minus1 : 44

     frame_mbs_only_flag : 1

     mb_adaptive_frame_field_flag : 0

     direct_8x8_inference_flag : 1

     frame_cropping_flag : 0

       frame_crop_left_offset : 0

       frame_crop_right_offset : 0

       frame_crop_top_offset : 0

       frame_crop_bottom_offset : 0

     vui_parameters_present_flag : 1

    === VUI ===

     aspect_ratio_info_present_flag : 0

       aspect_ratio_idc : 0

         sar_width : 0

         sar_height : 0

     overscan_info_present_flag : 0

       overscan_appropriate_flag : 0

     video_signal_type_present_flag : 0

       video_format : 0

       video_full_range_flag : 0

       colour_description_present_flag : 0

         colour_primaries : 0

       transfer_characteristics : 0

       matrix_coefficients : 0

     chroma_loc_info_present_flag : 0

       chroma_sample_loc_type_top_field : 0

       chroma_sample_loc_type_bottom_field : 0

     timing_info_present_flag : 0

       num_units_in_tick : 0

       time_scale : 0

       fixed_frame_rate_flag : 0

     nal_hrd_parameters_present_flag : 0

     vcl_hrd_parameters_present_flag : 0

       low_delay_hrd_flag : 0

     pic_struct_present_flag : 0

     bitstream_restriction_flag : 1

       motion_vectors_over_pic_boundaries_flag : 1

       max_bytes_per_pic_denom : 0

       max_bits_per_mb_denom : 0

       log2_max_mv_length_horizontal : 8

       log2_max_mv_length_vertical : 8

       num_reorder_frames : 0

       max_dec_frame_buffering : 1

    === HRD ===

     cpb_cnt_minus1 : 0

     bit_rate_scale : 0

     cpb_size_scale : 0

       bit_rate_value_minus1[0] : 0

       cpb_size_value_minus1[0] : 0

       cbr_flag[0] : 0

     initial_cpb_removal_delay_length_minus1 : 0

     cpb_removal_delay_length_minus1 : 0

     dpb_output_delay_length_minus1 : 0

     time_offset_length : 0

     

    ==================== NAL ====================

     forbidden_zero_bit : 0

     nal_ref_idc : 1

     nal_unit_type : 8 ( Picture parameter set )

    ======= PPS =======

     pic_parameter_set_id : 0

     seq_parameter_set_id : 0

     entropy_coding_mode_flag : 1

     pic_order_present_flag : 0

     num_slice_groups_minus1 : 0

     slice_group_map_type : 0

     num_ref_idx_l0_active_minus1 : 0

     num_ref_idx_l1_active_minus1 : 0

     weighted_pred_flag : 0

     weighted_bipred_idc : 0

     pic_init_qp_minus26 : 19

     pic_init_qs_minus26 : 0

     chroma_qp_index_offset : 0

     deblocking_filter_control_present_flag : 1

     constrained_intra_pred_flag : 0

     redundant_pic_cnt_present_flag : 0

     transform_8x8_mode_flag : 0

     pic_scaling_matrix_present_flag : 0

     second_chroma_qp_index_offset : 0

     

    0
    Comment actions Permalink
  • develop

    使用dji提供的码流检测工具检测视频文件的DJI-H264格式,全部通过。

    0
    Comment actions Permalink
  • develop

    我们在室外测试,静态画面会出现花屏,  画面有运动就回复正常。 

    请帮忙查排查问题出现原因,以及如何解决?

    0
    Comment actions Permalink
  • DJI Developer Support
    尊敬的客户, 您好!感谢您联系DJI大疆创新。 建议可以先按以下排查: 1、使用DJI负载看是否有同样问题,如果DJI负载没有问题,则是PSDK负载问题;及同时可以看看终端运行log是否有异常打印 。 2、如果确认是PSDK负载问题,建议您在发送接口前,插入录制视频的代码,将发送的部分录成视频,再播放此视频,看播放的视频是否也会出现卡顿现象。 3、如果将视频流录制的视频也有花屏,则是您相机采集的视频源有问题。 感谢您的理解与支持,祝您生活愉快! Best Regards, DJI大疆创新SDK技术支持
    0
    Comment actions Permalink
  • develop

    视频画面不会卡顿。

    当相机保持不动时,开机上电后,负载画面下部分基本必出现红色带状画面;当画面出现其他物体动态变化时,

    这种情况就消失了。后续相机画面中没有变化(不是卡顿),会出现带状花屏现象。如下两种截图  

    0
    Comment actions Permalink
  • develop

    在发送满足DJI-H264要求的码流数据前,将视频流数据保存为h264流文件。播放对比,见完整的视频附件。

    https://space.dingtalk.com/s/gwHOAvLWaQLODQRqlgPaACAyYjAyNzFkOWIwMTg0ZjNiYjg5OTE1ZWE3OGQ1N2FlYQ 密码: q1NZ  (视频时长2min,大小20M左右)

    由于录屏和psdk端视频同时播放,不能完整对齐,还请耐心看完。

    一个同时播放的画面对比如下

     

     

    0
    Comment actions Permalink
  • develop

    由于保存文件播放无问题,并且前述都已经提供了保存的h264文件,可以给出结论, 视频编码、发送都是满足PSDK开发视频流传输的H264-DJI格式要求的。

    动态IP下DJI-H264的图传数据会经过飞机会进行转码(相机端1M码流,在pilot上 查看实际负载图传带宽可达到10M)。

    因此我们怀疑飞机转码端、pilot解码播放端是否存在一些未知的原因导致当前问题,烦请DJI 开发团队帮助解决。谢谢!

    0
    Comment actions Permalink
  • DJI Developer Support
    尊敬的客户, 您好!感谢您联系DJI大疆创新。 建议您按以下进一步排查: 1、您是否有尝试过设置视频流格式为PSDK_CAMERA_VIDEO_STREAM_TYPE_H264_CUSTOM_FORMAT,看是否仍有一样的现象 (CUSTOM格式,飞机不会进行转码和动态调整码率 )。 ![](https://djisdksupport.zendesk.com/attachments/token/mU9m7qv1B33dxuZ7LFiJi7rjy/?name=inline-222094950.png) 2、以及使用原sample(仅更改用户信息,不改其他代码),将您录制下来的视频代替原sample中的演示视频,看是否会出现同样现象。 3、另外,是否在不同的飞机上,也会出现此问题。 感谢您的理解与支持,祝您生活愉快! Best Regards, DJI大疆创新SDK技术支持 ​
    0
    Comment actions Permalink
  • develop

    提前说下早期的测试情况:使用相同设备以及编码配置项,图传H264-CUSTOM格式,直接将原始264数据(未添加AUD)发送到飞机端,是没有上述屏幕下部分发生花屏的情况。后来因为遥控图传信号不好时,图传会卡顿、丟画面,因此才更换H264-DJI的方式。

    第一个测试中,修改H264_CUSTOM后,是否需要将动态ip调整为静态ip?是否不再需要AUD数据?  (这种测试,是否是符合官方文档开发要求?)

    第二个测试,视频是添加AUD,还是不添加? 不改代码情况,开发板ip配置动态?静态ip?

    第三个测试,更换过其他飞机,出现同样问题。

    以上问题,请表明严谨。

    0
    Comment actions Permalink
  • DJI Developer Support
    尊敬的客户, 您好!感谢您联系DJI大疆创新。 是的,H264-CUSTOM格式也可以用动态ip,不用加AUD数据。 感谢您的理解与支持,祝您生活愉快! Best Regards, DJI大疆创新SDK技术支持
    0
    Comment actions Permalink
  • develop

    将昨天保存的h264视频文件放入demo中,出现花屏的问题更严重,屏幕上部会有带状花屏。另外画面会出现时间上的错位,画面诡异。因为相机静止不动,请注意对比观看。

    原始264文件和录屏视频(2分钟,h264大小18M,录屏文件113M),打包连接

    https://space.dingtalk.com/s/gwHOAvNY6gLODQRqlgPaACBmOWVhZmEzOWEwNTA0NTkwYjY2MDUzZjc5ZjlmYzQ1OQ 密码: xe3a

    0
    Comment actions Permalink
  • DJI Developer Support
    尊敬的客户, 您好!感谢您联系DJI大疆创新。 在Linux系统使用ffplay播放您的裸流视频out_1626934224.h264,已经有花屏现象了,并且显示有解码报错,应该是您的视频源本身有问题,建议您先排查和确认裸流视频源无异常,再进行传输测试。 以下截取的为播放过程中出现的卡屏现象。 ![](https://djisdksupport.zendesk.com/attachments/token/zw2KRwLNZqudr3X729jJ8mvdF/?name=inline1010617871.png)​ ![](https://djisdksupport.zendesk.com/attachments/token/VNs59ZkO5Gs7uCf1mPqoRBxLu/?name=inline1442095331.png)​ 感谢您的理解与支持,祝您生活愉快! Best Regards, DJI大疆创新SDK技术支持
    0
    Comment actions Permalink
  • develop

    不好意思,你们的截图这个专业术语叫“马赛克”,相信你们的专业水平应该知道这个造成的原因:码率低时、高速运动造成的。

    视频裸流也通过你们提供工具检测,视频源没有问题,见前面截图。

    马赛克不是重点,目前码率1M,可以提高码率避免。请关注要解决的本质问题。

    你们说的问题而非问题中描述的现象,描述的“花屏”如下画面中带状的红色、中间带状异常画面。如下

     

    另外,前面已经给出了原始码流保存的视频播放、pilot录屏的对比,明确看出原始码流播放不会出现上述截图中的情况(马赛克只会在运动中出现),静态画面中pilot中显示会出现异常画面,这是根本问题。(这样的画面你们ffplay播放是不会出现的的)

    原始264文件和录屏视频(2分钟,h264大小18M,录屏文件113M),打包连接https://space.dingtalk.com/s/gwHOAvNY6gLODQRqlgPaACBmOWVhZmEzOWEwNTA0NTkwYjY2MDUzZjc5ZjlmYzQ1OQ 密码: xe3a

    请你们研发、技术人员,看完视频对比之后,科学严谨的在回答问题。

    0
    Comment actions Permalink
  • develop

    另外,你们可以先观看h264视频之后,再放入psdk_demo中使用pilot看图传,进行对比测试。

    对比之后,就能明显看出原始视频画面、pilot显示的图传画面的差异,pilot画面中在场景中没有任何物体运动时,突然会显示上一次运动的画面(真实画面中无该运动目标)。 直到真实画面中有新的物体出现,该异常画面才被刷新显示正常。

    0
    Comment actions Permalink
  • DJI Developer Support
    尊敬的客户, 您好!感谢您联系DJI大疆创新。 一般来说,出现花屏现象是有数据丢失导致的,不管是您提到的静止时中间花屏,还是运动时出现的马赛克。 使用DJI-H264格式时,飞机会进行转码处理,如果视频源本身是有数据丢失现象,可能会影响转码,导致传到Pilot端时,出现其他花屏现象,所以建议您在保证视频源正常的情况下(不要有马赛克现象),进行测试。 另外您提到将您的视频放到PSDK示例程序中,会出现更加严重花屏现象,这边没有复现的,在Pilot端显示的视频和使用电脑播放器效果是一样的,仅有您提到的马赛克现象,未见明显的中间花屏现象 ( 请查收附件,已录制Pilot显示效果,供您参考 )。 建议您用原始Sample进行测试 (仅更改用户信息,不改变其他代码),这边测试的PSDK版本为2.2.1。 感谢您的理解与支持,祝您生活愉快! Best Regards, DJI大疆创新SDK技术支持
    0
    Comment actions Permalink
  • develop

    码率低、运动过快,出现马赛克是正常现象。出现马赛克,说视频源不正常,违背h624编码原理的。

    你这边回复提到“有您提到的马赛克现象,未见明显的中间花屏现象 ”,说明两点:第一,原视频马赛克,pilot特有马赛克,这个是正常的现象;第二:属于已经承认飞机存在转码缺陷导致中间花屏,不论明显与否,都是存在缺陷的,还请尽快解决飞机端的问题。

    前面录制视频的对比视频,psdk、飞机遥控器固件均是最新版本,使用的原始sample,仅替换了图传演示需要的媒体 PSDK_0006.h264 文件。pilot中播放的效果和原始保存的视频流表现效果不一致。后面将提高编码码率,避免马赛克(并不是丢数据)现象。之后再做对比测试。

    另外,不知道发送的附件录制视频在哪里?

    0
    Comment actions Permalink
  • DJI Developer Support
    尊敬的客户, 您好!感谢您联系DJI大疆创新。 关于您提到的2点问题: 一、是的,正因为查看到原始数据播放也有马赛克现象,建议是先解决这个问题,您提到的马赛克现象,还是因为原始视频数据解码导致播放不正常,原则上是可以解决的。 二、您提到的飞机转码缺陷,现在是无法明确存在异常缺陷的。首先,飞机的转码是为适配无线传输链路的干扰进行传输的自适应,是为了防止传输不过去导致花屏或马赛克等解码问题,传输数据正常情况下降码率也不应该出现花屏或马赛克(可以参考DJI原相机同样会有自适应处理),若确定有问题可能需要进一步排查和确认。前面的建议是因为,如果原始数据本身解码存在异常,再降码率处理是可能存在问题的,这样也就不确定问题的根本点,所以之前提供的建议先保证源数据正常的情况下,如果传输导致数据丢失我们将更进一步复现和排查。 根据您提供的信息,现在看来应该是您的psdk程序中视频处理过程有关,我们这边边测试,直接使用您提供的h264视频在原sample中替代PSDK_0006.h264文件,测试没有中间花屏现象。 以下为之前提到的测试效果录制文件,已上传至网盘,请查看: 链接:https://pan-sec.djicorp.com/s/Tpst8Q2sKF5B5po 密码:dji123 感谢您的理解与支持,祝您生活愉快! Best Regards, DJI大疆创新SDK技术支持
    0
    Comment actions Permalink
  • develop

    再声明一下,早期使用h264-custom,发送264的视频流,pilot图传显示没有问题(快速运动出现的马赛克不考虑)。因为图传链路质量差,这一种原始h264格式会卡顿、丢画面。 后期切换到H264-DJI,只要图传链路还存在,那么画面始终是有的,只是效果会差一些。但是,会发现实际画面和pilot显示画面有差异,也就是前面截图中出现的红色、带状的花屏。

    1、原始视频有马赛克,播放有马赛克,我们可以认为是正常的。因为提供什么画面,pilot就应该显示什么画面。如果源是视频数据编码有问题, 那么pilot是不可能正常播放的。

    这个视频文件经官方提供是 stream_check_tool格式检测是全部是passed,对于官网文档h264编码要求也做过比对(当前问题最早以提供检测结果截图、sps和pps信息)。如果非要说视频编码有问题,我这边已经无任何可以参考的信息,需要你方告知存在什么问题,例如其他264编码的参数要求。   能否提供飞机端转码的h264解码、编码细节,我这边可以自己尝试复现是否存在未知的限定参数?

    2、飞机根据链路情况转码,理论上只会降低画质,但画面主体内容应该和相机实际观测的场景是一致的。

    但是,从你上传反馈的20s画面(放入demo中),已经是和原画面不一致了,而且这个视频中的问题很明显。例如,在相机画面摆动脚,之后脚移出了画面。之后的一段时间内,真实相机视野内是没有脚的,但是画面中还是出现了脚,这个画面是定格的,是前面出现的,而且会和正常画面交替闪烁出现。 在保存的264文件中,直接播放是没有该情况的。(这些也是前面我使用原始sample、仅替换媒体文件测试出现的现象)

    这个h264测试文件电脑端能正常显示播放,是否说明电脑端解码正常,原始视频数据编码也正常?为什么经了飞机转码pilot显示就出现上一句出现的问题?飞机和pilot是处理机制我无法得知,这个疑问只能你们解释。

     

    另外,我们自己的程序中视频流发送流程也很简单, 先获取得到每一帧h264数据,在每一帧后面添加AUD(除sps、pps外,无SEI帧类型,因此仅I帧和P帧后添加),之后根据包大小限制,分包调用api函数发送。

    通用的代码如下:

    这个流程是没有任何问题的,因为使用H264 Custom格式不会添加aud,pilot显示一切正常。 如果代码中问题,还请指出。谢谢

     

    0
    Comment actions Permalink
  • DJI Developer Support
    尊敬的客户, 您好!感谢您联系DJI大疆创新。 好的,关于您的疑问,这边会将您的情况提交至工程师进一步确认,如果有进展,将及时告知您。 感谢您的理解与支持,祝您生活愉快! Best Regards, DJI大疆创新SDK技术支持
    0
    Comment actions Permalink
  • DJI Developer Support
    这边工程师确认后,回复以下: 需要确认一下,之前您提供的视频文件,保存的H264的流是调用API发送之前的原始流,还是拆包调用API之后保存的处理后的流 ? 这边确认的是,分析dump下来的流通过eseye工具查看分析码流码流,播放下半部分画面丢失,原因是码流的I帧在静止的情况下被截断,静止的I帧存在丢失的现象。静止的时候,I帧相比有画面运动的时候,要大很多。建议使用eseye排查下原因。 从流的数据来看,因为不同的硬件解码器之间解码规则不一致,不能保证说飞机端播放的现象和PC端完全一致。我们优先保证dump下来的流是可以正常播放的。因为目前来看,整个流下半部分被截断了,从dump下来的码流上看,后面的I帧没有超过65569的,丢失在这个尺寸都被截断掉了,建议排查下buffer或者分包的时候是否有问题,建议保存一份完整正常的流看下,我们再尝试用完好的流进行推流播放。 ![](https://djisdksupport.zendesk.com/attachments/token/lfMhcHCWk6iji3nAHLlMMbZOX/?name=inline1395491586.png)​
    0
    Comment actions Permalink
  • develop

    感谢。 这边大致排查到问题,硬件编码器给出的每个数据包最大65535,当NALU数据量超过时分包发出,使用和H64-custom没有问题,但使用H264-dji时本应该属于一个NALU单元的两个分包都添加了AUD,图传到Pilot显示异常。  电脑端不同播放器解码显示也是有差异的,有能正常显示的情况。

    另外一个情况,静止画面I帧比P帧要大得多(3M码流情况下,NALU最大会超过100K),请问飞机端正常处理接收PSDK的一个完整的I帧或P帧(可能分包多次发送)最大数据量是否限制?若有限制,最大为多少?

    0
    Comment actions Permalink
  • DJI Developer Support
    ![](https://djisdksupport.zendesk.com/attachments/token/OYh5blZNb7k8zwCBp31qAFO5H/?name=inline718751345.png)​ 单帧最大不能超过256KByte,因此需要一帧加一个AUD信息,一帧需要通过一个NALU发出,不能是多个,一帧最大支持256KByte。 256KByte是262,144Byte,你的那个65535Byte,太小不用拆分,如果使用DJI H264,建议尝试一个帧不要拆分,一个帧只加一个AUD信息,放到一个NALU单元发出。
    0
    Comment actions Permalink
  • develop

    目前已经解决了NALU截断的问题。下面是相机码流文件信息,分辨率1280*720,profile/level为High 4.0,码率3Mbps。

     

    目前测试3Mbps码率、使用DJI-H264格式,发现仍然有花屏截断的情况(镜头静止时),增加log输出后,发现当前流状态videoStreamState.busyState为1,发送的数据被丢弃。

    当前测试遥控器和无人机在2米以内。 我们降低码率到1M继续测试,仍然有花屏情况。测试时pilot录屏,在widget浮窗中以 3Hz 打印流状态信息,这里截图并给出一个gif图片

    视频部分gif画面的链接如下, https://space.dingtalk.com/s/gwHOAwjOvQLODQRqlgPaACA2ZWY0MGFmMGZmYjc0OTE4OTA4Y2M4MDExMTU2ZWQ3Nw 密码: 1ApN

    代码中流量控制接口设置的视频传输占高数数据传输通道整个带宽的比例为70%,板载网卡为千兆自适应。 按照实时流状态,平均1s内可以发送数据量为1000KB字节,gif中实时数据量在 180KB/s以内,是远低于上限的, 不明白为什么会出现当前通道状态忙、而导致码流数据发送被丢弃造成话花屏。

    0
    Comment actions Permalink
  • develop

    (仅更换负载设备,无人机、遥控器均未重启)

    后来又测试了几次使用3Mbps码率、但是使用了GDR编码策略,实时数据量在400KB/s以内(镜头静止或者运动),从未出现过流状态为忙的情况,也未出现花屏问题。   

    后面将继续多次对比测试。     

    0
    Comment actions Permalink
  • DJI Developer Support
    您提到的未达到带宽上限但提示busy的问题,麻烦提供完整的debug等级的LOG,我们分析下实际的带宽分配。
    0
    Comment actions Permalink
  • develop

    使用DJI-H264格式, 1280*720@30fps,HIGH 4.0,1Mbps。在PSDK流量控制功能设置视频数据占整个高速数据传输通道带宽70%。

    实时带宽log提示busy问题,分别2次运行程序的Debug级别LOG如下链接https://space.dingtalk.com/s/gwHOAwylJwLODQRqlgPaACAwNmFiNWQ0YzVjN2U0ZDNiOWIxMzdkM2E5Mjc0NTBiNg 密码: AJwk

    0
    Comment actions Permalink
  • DJI Developer Support
    根据您的Log,确实有异常现象,工程师正在进一步确认。
    0
    Comment actions Permalink
  • DJI Developer Support
    这边工程师根据您提供的运行log排查,结果如下: 1. busystate=1 不是由于带宽限制导致的,实测8Mbps以下都是可以的。 2. busystate=1 由于网口发送失败导致的,网口发送失败的时候系统判定为busy状态, log上可以体现。 busystate=1上方伴随着发送失败的问题 ( 如下图 )。 ![](https://djisdksupport.zendesk.com/attachments/token/aVj6goQLVKdqvuUmxVzoomEeH/?name=inline-1167079348.png)​ 可以排查下发送失败的原因,发送是直接调用的linux系统的sendto接口,我们这边可以配合排查下,我们给您对应的库测试( 已加Socket sendto errno: %d, msg: %s" ), 确认下log errno, 可以排查问题( 对应错误https://blog.csdn.net/partner1/article/details/75136659): 1. 把sendto的errno打印出来 2. 您可以将发送的数据长度打印出来, 看下是否超过64K。 您使用的是哪个库,这边把加了sendto的errno打印的库发给您进一步排查。
    0
    Comment actions Permalink

Please sign in to leave a comment.