rocketskyy

rocketskyy

0个粉丝

1

问答

0

专栏

0

资料

rocketskyy  发布于  2026-03-20 17:04:16
采纳率 0%
1个问答
28

hi3516cv610跑sample_aidetect_vie例程,RTSP推流卡顿求助

使用hi3516cv610跑sample_aidetect_vie例程,从这个例程的readme中知道,有两条通路,如下:

  1. sample_aidetect_vie的数据通路如下。
    vi-vpss-venc chn_0
     └──aidetect-vgs-venc    chn_1
    
    1) 码流录制通路:vi-vpss-venc
    2) AI业务通路:vi-vpss-aidetect-vgs-venc

我想把AI业务通路处理过的视频数据RTSP推流查看,修改了sample_comm_venc.c文件的sample_comm_get_stream_from_one_channl函数

static td_s32 sample_comm_get_stream_from_one_channl(sample_comm_venc_stream_proc_info *stream_proc_info, td_s32 index,
    ot_venc_stream_buf_info *stream_buf_info, ot_payload_type *payload_type)
{
    td_s32 ret;
    ot_venc_stream stream;
    ot_venc_chn_status stat;
    td_s32 i;
    unsigned char* pStremData = NULL;
    int nSize = 0;

    /* step 2.1 : query how many packs in one-frame stream. */
    if (memset_s(&stream, sizeof(stream), 0, sizeof(stream)) != EOK) {
        printf("call memset_s error\n");
    }

    ret = ss_mpi_venc_query_status(index, &stat);
    if (ret != TD_SUCCESS) {
        sample_print("ss_mpi_venc_query_status chn[%d] failed with %#x!\n", index, ret);
        return SAMPLE_RETURN_BREAK;
    }

    if (stat.cur_packs == 0) {
        sample_print("NOTE: current  frame is TD_NULL!\n");
        return SAMPLE_RETURN_CONTINUE;
    }
    /* step 2.3 : malloc corresponding number of pack nodes. */
    stream.pack = (ot_venc_pack *)malloc(sizeof(ot_venc_pack) * stat.cur_packs);
    if (stream.pack == TD_NULL) {
        sample_print("malloc stream pack failed!\n");
        return SAMPLE_RETURN_BREAK;
    }

    /* step 2.4 : call mpi to get one-frame stream */
    stream.pack_cnt = stat.cur_packs;
    ret = ss_mpi_venc_get_stream(index, &stream, TD_TRUE);
    if (ret != TD_SUCCESS) {
        free(stream.pack);
        stream.pack = TD_NULL;
        sample_print("ss_mpi_venc_get_stream failed with %#x!\n", ret);
        return SAMPLE_RETURN_BREAK;
    }

    /* step 2.5 : save frame to file */
    if(1 == g_rtsp_enable) {
        if(0 == index){
            for (i = 0; i < stream.pack_cnt; i++) {
                if(stream.pack[i].data_type.h265_type == OT_VENC_H265_NALU_SEI){
                    continue;
                }else {
                    pStremData = (unsigned char*)stream.pack[i].addr + stream.pack[i].offset;
                    nSize =stream.pack[i].len - stream.pack[i].offset;
                    if(g_rtsplive) {
                    rtsp_sever_tx_video(g_rtsplive, session_h265, pStremData, nSize, stream.pack[i].pts);
                    }
                }

                if(stream.pack[i].data_type.h264_type == OT_VENC_H264_NALU_SEI){
                    continue;
                }else {
                    pStremData = (unsigned char*)stream.pack[i].addr + stream.pack[i].offset;
                    nSize =stream.pack[i].len - stream.pack[i].offset;
                    if(g_rtsplive) {
                    rtsp_sever_tx_video(g_rtsplive, session_h264, pStremData, nSize, stream.pack[i].pts);
                    }
                }
            }
        } else {
            for (i = 0; i < stream.pack_cnt; i++) {
                if(stream.pack[i].data_type.h264_type == OT_VENC_H264_NALU_SEI){
                    continue;
                }else {
                    pStremData = (unsigned char*)stream.pack[i].addr + stream.pack[i].offset;
                    nSize =stream.pack[i].len - stream.pack[i].offset;
                    if(g_rtsplive) {
                    rtsp_sever_tx_video(g_rtsplive, session_h264, pStremData, nSize, stream.pack[i].pts);
                    }
                }
            }
        }
    } else {
        ret = sample_comm_save_frame_to_file(index, stream_proc_info, &stream, stream_buf_info, payload_type);
            if (ret != TD_SUCCESS) {
            ss_mpi_venc_release_stream(index, &stream);
            return ret;
        }
    }
    /* step 2.6 : release stream */
    ret = ss_mpi_venc_release_stream(index, &stream);
    if (ret != TD_SUCCESS) {
        sample_print("ss_mpi_venc_release_stream failed!\n");
        free(stream.pack);
        stream.pack = TD_NULL;
        return SAMPLE_RETURN_BREAK;
    }

    /* step 2.7 : free pack nodes */
    free(stream.pack);
    stream.pack = TD_NULL;
    stream_proc_info->picture_cnt[index]++;
    if (payload_type[index] == OT_PT_JPEG) {
        fclose(stream_proc_info->file[index]);
        stream_proc_info->file[index] = TD_NULL;
    }
    return TD_SUCCESS;
}

我把if(0 == index)改成if(1 == index)上传通路1经过目标识别后的视频数据,使用VCL看很卡顿,有时候全是马赛克甚至看不了。但换回if(0 == index)的话,就没有前面提到的卡顿问题,但是是原始的未经过处理的视频。

我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区