对H20T的H264流进行硬解码,延时很大,请问这是为什么?有什么解决办法

Completed

Comments

10 comments

  • DJI Developer Support
    解码后显示的视频流延迟有多大?你是怎么调用的硬解码?是用我们DJICodecManager解码还是用安卓自带的解码器呢?你跑一下我们的Sample,看看视频流是否有延迟?https://github.com/dji-sdk/Mobile-SDK-Android
    0
    Comment actions Permalink
  • Hurd

    我是使用的你们提供的Linux OSDK 硬解码代码,按照步骤进行的,参考的链接如下:https://bbs.dji.com/forum.php?mod=viewthread&tid=260759;延时估计有好几十秒;流没有延时;

    0
    Comment actions Permalink
  • Hurd

    是否是解码代码camera_h264_hardware_decoder.cpp中这一行的设置问题:

    m_gstQueue = gst_element_factory_make("queue", "queue");
     
    或者是camera_stream_show.cpp中显示代码的问题
     
    附:
    0
    Comment actions Permalink
  • DJI Developer Support
    请问机载平台是什么?如果是妙算可以参考论坛上的实测效果,再进一步排查是获取流的延时还是解码的延时。
    0
    Comment actions Permalink
  • Hurd

    jeston nx

    0
    Comment actions Permalink
  • Hurd

    已查明,是读取解码后的数据并显示太慢,解码性能跟得上

    0
    Comment actions Permalink
  • DJI Developer Support
    这个与OSDK本身没有直接关系,可以根据使用的平台再进一步优化。这边没有NX平台,可能无法进一步提供具体的优化方案。
    0
    Comment actions Permalink
  • Hurd

    依然没有解决这个问题,OSDK提供的硬解码pipline如下:

        /* Create the elements */
        m_gstAppSrc = gst_element_factory_make("appsrc", "dji_video_stream_src");
        m_gstQueue = gst_element_factory_make("queue", "queue");
        m_gstH264Parse = gst_element_factory_make("h264parse", "h264parse");
        m_gstDecode = gst_element_factory_make("omxh264dec", "decode");
        m_gstAppSink = gst_element_factory_make("appsink", "sink");

        /* Create the empty pipeline */
        m_gstPipeline = gst_pipeline_new("dji_video_stream_decode_pipeline");

        if (!m_gstPipeline || !m_gstAppSrc || !m_gstQueue || !m_gstH264Parse || !m_gstDecode || !m_gstAppSink) 
        {
            cout << "Not all gstreamer elements could be created." << endl;
            return ErrorCode::SYSTEM_ERROR;
        }

        /* Build the pipeline */
        gst_bin_add_many(GST_BIN (m_gstPipeline), m_gstAppSrc, m_gstQueue, m_gstH264Parse, m_gstDecode,m_gstAppSink, NULL);

        if (gst_element_link_many(m_gstAppSrc, m_gstQueue, m_gstH264Parse, m_gstDecode, m_gstAppSink,NULL) != TRUE) 
        {
            cout << "Gstreamer elements could not be linked." << endl;
            gst_object_unref(m_gstPipeline);
            return ErrorCode::SYSTEM_ERROR;
        }

        //appsrc config
        g_object_set(m_gstAppSrc,
                    "stream-type", GST_APP_STREAM_TYPE_STREAM,
                    "format", GST_FORMAT_TIME,
                    "do-timestamp", TRUE,
                    "is-live", TRUE,
                    "block", FALSE,
                    NULL);

        //decode disable dpb for low lantency
        g_object_set(m_gstDecode, "disable-dpb", TRUE, NULL);

        // appsink config
        // /* max queue buffer numbers */
        // gst_app_sink_set_max_buffers(GST_APP_SINK(m_gstAppSink), 2);
        // /* drop old buffers when queue is filled */
        // gst_app_sink_set_drop(GST_APP_SINK(m_gstAppSink), true);
        g_object_set(m_gstAppSink,
                    "max-buffers", 2,
                    "drop", TRUE,
                    NULL);

        /* Start playing */
        ret = gst_element_set_state(m_gstPipeline, GST_STATE_PLAYING);
        if (ret == GST_STATE_CHANGE_FAILURE) 
        {
            cout << "Unable to set the pipeline to the playing state." << endl;
            gst_object_unref(m_gstPipeline);
            return ErrorCode::SYSTEM_ERROR;
        }
     
    请问如何看经过元件appsrc、queue、h264parse、omxh264dec、appsink,即经过一条完整pipline进行解码并将数据存储到appsink包含的队列中这一过程的处理帧率?是不是取解码数据时,只要经过
    gst_app_sink_pull_sample()从appsink中取出的图像数据不模糊、不花屏就意味着处理帧率是跟得上相机帧率的,即H20T相机30帧,解码处理的帧率也有30帧?
    0
    Comment actions Permalink
  • Hurd

    我在NX上进行硬解码有延迟的问题,由于不需要全部的数据,丢帧也没关系,因此想在解码过程中丢掉一些数据,例如我分别针对上述元件,做了如下设置尝试,设置appsrc的属性max-bytes为2,设置appsink的属性"max-buffers"为2,设置appsink的属性"drop"为TRUE,按照理解,设置"max-buffers"为2即将appsink的结果保存队列的尺寸设置为了2,如果读取解码后数据的速度跟不上解码数据的速度,那正常情况下,数据就会不断覆盖,我从队列读取到的始终为最新数据,然而事实上,数据似乎没有发生覆盖,而是不断堆积,请问这是为什么?

    0
    Comment actions Permalink
  • DJI Developer Support
    这个与OSDK本身没有直接关系,可以根据使用的平台再进一步优化。这边没有NX平台,可能无法进一步提供具体的优化方案。
    0
    Comment actions Permalink

Please sign in to leave a comment.