mp4无法得到文件,得到的文件只有一个数据头

Viewed 56

问题描述


我明显的看到我的日志里面有一个:kd_mpi_venc_get_stream[0] error ret:0
但是我不知道含义,我的代码是抄mp4_muxer的,get_stream是一样的,但我把aenc去掉了,绑定方式我先后尝试了注释掉的和现在的,但都没有区别,vb块也是4k对齐,没找到问题在哪

static k_s32 start_run(SampleCtx *psample_ctx) {
k_s32 ret = kd_mapi_venc_start(0, -1);
if (ret != K_SUCCESS) {
printf("venc chn start failed, %x.\n", ret);
return -1;
}

/*ret = kd_mapi_venc_bind_vi(vicap_dev, VICAP_CHN_ID_2, 0);
if (ret != K_SUCCESS) {
    printf("venc chn bind vi failed, %x.\n", ret);
    goto venc_stop;
}*/

k_mpp_chn vi_chn;
k_mpp_chn venc_chn;

vi_chn.mod_id = K_ID_VI;
vi_chn.dev_id = VICAP_DEV_ID_0;
vi_chn.chn_id = VICAP_CHN_ID_2;   // 你的图像通道

venc_chn.mod_id = K_ID_VENC;
venc_chn.dev_id = 0;
venc_chn.chn_id = 0;

ret = kd_mpi_sys_bind(&vi_chn, &venc_chn);
if (ret != 0) {
    printf("sys bind vi -> venc failed!!!\n");
    return -1;
}

ret = kd_mapi_vicap_start(VICAP_DEV_ID_0);
if (ret != K_SUCCESS) {
    printf("kd_mapi_vicap_start failed, %x.\n", ret);
}

return 0;

venc_unbind:
kd_mapi_venc_unbind_vi(VICAP_DEV_ID_0, 2, 0);

venc_stop:
kd_mapi_venc_stop(0);

return ret;

}
以下是我的日志

msh /sharefs>./_camera.elf
inputs_size:1
input_shape(0) 元素个数: 4
press 'q' to exit application!!
[D/lt9611] vtotal 1125 vactive 1080 htotal_sys 400

mp4 muxer...
kd_mapi_venc_init start 0
venc[0] 1280*720 size:692224 cnt:30 srcfps:30 dstfps:30 rate:4000 rc_mode:1 type:265 profile:5
kd_mapi_venc_init end
[VENC_S] [Func]:kd_mapi_venc_registercallback [Line]:477 [Info]:0 ###
[VENC_S] [Func]:kd_mapi_venc_start [Line]:329 [Info]:start chn_num:0 s32_frame_cnt:-1
[VENC_S] [Func]:kd_mapi_venc_start [Line]:349 [Info]:end chn_num[0].output_tid:7937784
kd_mapi_vicap_start dev id is 0
mirror mirror is 0 , sensor tpye venc_streamis 39
ov5647_power_rest OV5647_CAM_PIN_CSI2 _threads 0 start ###
Thu Jan 1 01:10:41 1970 864000000 is 21
Nanoseconds
set output err, set default format ISP_PIX_FMT_YUV420SP
set output err, set default format ISP_PIX_FMT_YUV420SP
[tuning] dev: 0
acq_win.width: 1280
acq_win.height: 720
pipe_ctrl: 4261412857
sensor_fd: 13
sensor_type: 39
sensor_name: ov5647_csi2
database_name: ov5647-1920x1080
buffer_num: 0
buffer_size: 0
[tuning] chn: 0
out_win.width: 1280
out_win.height: 720
bit_width: 0
pix_format: 5
buffer_num: 10
buffer_size: 1382400
yraw_size: 0
uv_size: 0
v_size: 0
block_type: 1
wait_time: 500
chn_enable: 1
isp_3dnr_en is 1 g_isp_dev_ctx[dev_num].dev_attr.pipe_ctrl.bits.dnr3_enable is 0
VsiCamDeviceCreate hw:0-vt:0 created!
ov5647_power_rest OV5647_CAM_PIN_CSI2 is 21
kd_mpi_isp_set_output_chn_format, width(1280), height(720), pix_format(5)
kd_mpi_isp_set_output_chn_format, width(1280), height(720), pix_format(16)
kd_mpi_isp_set_output_chn_format, width(1280), height(720), pix_format(5)
[dw] init, version Mar 14 2025 16:36:59
size:2764800
kmodel:1x3x320x320
shape:1x3x320x320
ai2d run: duration = 2.39296 ms, fps = 417.892
in_shape:1x3x320
out_shape:1x6300x7
num_valid:0
final_boxes:0
size:2764800
kmodel:1x3x320x320
shape:1x3x320x320
ai2d run: duration = 2.43241 ms, fps = 411.115
in_shape:1x3x320
out_shape:1x6300x7
num_valid:0
final_boxes:0
size:2764800
kmodel:1x3x320x320
shape:1x3x320x320
ai2d run: duration = 2.38989 ms, fps = 418.429
in_shape:1x3x320
out_shape:1x6300x7
num_valid:0
final_boxes:0
size:2764800
kmodel:1x3x320x320
shape:1x3x320x320
ai2d run: duration = 2.38715 ms, fps = 418.91
in_shape:1x3x320
out_shape:1x6300x7
num_valid:0
final_boxes:0
size:2764800
kmodel:1x3x320x320
shape:1x3x320x320
ai2d run: duration = 2.38426 ms, fps = 419.418
in_shape:1x3x320
out_shape:1x6300x7
num_valid:0
final_boxes:0
size:2764800
kmodel:1x3x320x320
shape:1x3x320x320
ai2d run: duration = 2.38407 ms, fps = 419.45
in_shape:1x3x320
out_shape:1x6300x7
q
app_run stop!
num_valid:0
final_boxes:0
[VENC_S] [Func]:kd_mapi_venc_unbind_vi [Line]:439 [Info]:start vicap stop 0
[VENC_S] [Func]:kd_mapi_venc_unbind_vi [Line]:468 [Info]:vicap stop end 0
[VENC_S] [Func]:kd_mapi_venc_stop [Line]:355 [Info]:start chn_num:0
[VENC_S] [Func]:kd_mapi_venc_stop [Line]:362 [Info]:output_tid:7937784
kd_mpi_venc_get_stream[0] error ret:0
kd_mpi_venc_get_stream[0] error ret:0
venc_stream_threads 0 exit ###
ch 0: 278 pictures encoded. Average FrameRate = 30 Fps
[VENC_S] [Func]:kd_mapi_venc_stop [Line]:385 [Info]:end
user`s venc stop.
main in stop!!!
1
2
[VENC_S] [Func]:kd_mapi_venc_unregistercallback [Line]:495 [Info]:0 ###
kd_mapi_venc_deinit start 0
ch 0: total used pages 968
kd_mapi_venc_deinit end
3
kd_mpi_isp_stop_stream chn enable is 1
kd_mpi_isp_stop_stream chn enable is 1
kd_mpi_isp_stop_stream chn enable is 1
release reserved vb 275953664
release reserved vb 289783808
release reserved vb 296706048
ov5647_power_rest OV5647_CAM_PIN_CSI2 is 21
4
5
mp4 muxer end...
vpu_exit>q_wm 118
msh /sharefs>

复现步骤


这是vb块的:
int sample_vb_init(void)
{
k_u32 pic_width = sample_context.video_pic_width;
k_u32 pic_height = sample_context.video_pic_height;
k_s32 ret;
k_vb_config config;
memset(&config, 0, sizeof(config));
config.max_pool_cnt = 5;
//VB for YUV420SP output
config.comm_pool[0].blk_cnt = 5;
config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE;
config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K);
//VB for RGB888 output
config.comm_pool[1].blk_cnt = 5;
config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE;
config.comm_pool[1].blk_size = VICAP_ALIGN_UP((ISP_CHN1_HEIGHT * ISP_CHN1_WIDTH * 3 ), VICAP_ALIGN_1K);

//VB for YUV420SP venc in
config.comm_pool[2].blk_cnt = 5;
config.comm_pool[2].mode = VB_REMAP_MODE_NOCACHE;
config.comm_pool[2].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), 0x1000);//4k对齐

// video pool parameter
k_u32 pic_size = pic_width * pic_height * 3 / 2;//yuv格式
k_u32 stream_size = pic_width * pic_height * 3 / 4;//pic_szie的一半大小,因为视频会压缩,体积原小于默认的raw图片
config.comm_pool[3].blk_cnt = 6;//缓存vi的4张,编码器自己占2张
config.comm_pool[3].blk_size = ((pic_size + 0xfff) & ~0xfff);//& ~0xfff = 把低 12 位全部清 0 → 变成 4096 整数倍,进行4k对齐(内存硬性要求)
config.comm_pool[3].mode = VB_REMAP_MODE_NOCACHE;
config.comm_pool[4].blk_cnt = 30;//1s30帧
config.comm_pool[4].blk_size = ((stream_size + 0xfff) & ~0xfff);
config.comm_pool[4].mode = VB_REMAP_MODE_NOCACHE;


ret = kd_mpi_vb_set_config(&config);
if (ret) {
    printf("vb_set_config failed ret:%d\n", ret);
    return ret;
}

k_vb_supplement_config supplement_config;
memset(&supplement_config, 0, sizeof(supplement_config));
supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK;

ret = kd_mpi_vb_set_supplement_config(&supplement_config);
if (ret) {
    printf("vb_set_supplement_config failed ret:%d\n", ret);
    return ret;
}
ret = kd_mpi_vb_init();
if (ret) {
    printf("vb_init failed ret:%d\n", ret);
}
return ret;

}
这是vicap通道2的:
image.png

1 Answers

如果您用的是 RTOS SDK,是不包含 MAPI 接口的,该接口仅在双系统代码中提供。请核对 SDK 版本是否正确,优先使用 RTOS 代码而非双系统版本。https://www.kendryte.com/zh/sdkResource/230rtt

是的,双系统,点错了

双系统版本出现这种情况一般是因为什么呢

请参考 k230_sdk/src/common/cdk/user/mapi/sample/sample_venc 示例,确保能正常获取编码后的数据。从你目前的情况来看,编码数据获取失败,因此生成的 MP4 文件只有文件头,没有有效音视频数据。