hi3518E + ov9712调试时,sample_venc居然取不到video data!

本文记录了一次音视频编解码过程中遇到的问题及解决方法。主要问题包括捕获图片超时、获取编码流超时等现象,通过调整摄像头参数最终解决了这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试过程:
# ./sample_venc 2
press 'q' to exit sample!
peress ENTER to capture one picture to file


[SAMPLE_COMM_VENC_SnapProcess]-747: snap time out!
SAMPLE_VENC_720P_Snap: sanp process failed!
snap over!
[SAMPLE_COMM_VENC_SnapStop]-678: HI_MPI_VENC_DestroyChn vechn[0] failed with 0xa0078009! 
0xA0078009 HI_ERR_VENC_NOT_PERM 该操作不允许,如试图修改静态配置参数
[SAMPLE_VENC_720P_Snap]-664: Stop snap failed!


# /mnt/nfs/sample_venc1 
Usage : /mnt/nfs/sample_venc1 <index>
index:
         0) 720p classic H264 encode.
         1) 1*720p MJPEG encode.
         2) 1*720p JPEG snap.
# /mnt/nfs/sample_venc1 2
register isp lib info ec ffffffff!
SAMPLE_COMM_ISP_Init: HI_MPI_ISP_Init failed!
SAMPLE_COMM_ISP_Run: ISP init failed!
[SAMPLE_COMM_VI_StartIsp]-1253: SAMPLE_COMM_VI_StartIsp: ISP init failed!
[SAMPLE_VENC_720P_Snap]-607: start vi failed!
Segmentation fault
# /mnt/nfs/sample_venc2 2
press 'q' to exit sample!
peress ENTER to capture one picture to file


[SAMPLE_COMM_VENC_SnapProcess]-747: snap time out!
SAMPLE_VENC_720P_Snap: sanp process failed!
snap over!
[SAMPLE_COMM_VENC_SnapStop]-678: HI_MPI_VENC_DestroyChn vechn[0] failed with 0xa0078009!
[SAMPLE_VENC_720P_Snap]-664: Stop snap failed!
program exit abnormally!



# ./rtspmain 
[SAMPLE_COMM_VENC_GetVencStreamProc]-928: get venc stream time out!!continue
[SAMPLE_COMM_VENC_GetVencStreamProc]-928: get venc stream time out!!continue
[SAMPLE_COMM_VENC_GetVencStreamProc]-928: get venc stream time out!!continue
[SAMPLE_COMM_VENC_GetVencStreamProc]-928: get venc stream time out!!continue
[SAMPLE_COMM_VENC_GetVencStreamProc]-928: get venc stream time out!!continue
pid:593 receive signal:2, prepare to exit!
Exit from Rtspd monitor thread!
[SAMPLE_COMM_VENC_GetVencStreamProc]-928: get venc stream time out!!continue

# /mnt/nfs/rtmpmain  rtmp://192.168.2.10/live/demo
SRS(simple-rtmp-server) client librtmp library.
version: 3.0.3
[1970-01-01 00:59:55.23][597] simple handshake success
[1970-01-01 00:59:55.28][597] connect vhost/app success
[1970-01-01 00:59:55.37][597] publish stream success!
[SAMPLE_COMM_VENC_GetVencStreamProc]-928: get venc stream time out!!continue
[SAMPLE_COMM_VENC_GetVencStreamProc]-928: get venc stream time out!!continue
[SAMPLE_COMM_VENC_GetVencStreamProc]-928: get venc stream time out!!continue
pid:597 receive signal:2, prepare to exit!
[SAMPLE_COMM_VENC_GetVencStreamProc]-928: get venc stream time out!!continue //可以确认,不管是snapshot or stream,都是
timeout拿不到video frame!!


>>原因: ov9712需要修改几个参数,也就是说,原本的init table并不正确!
#patch for ov9712
/home/toolkit/himm 0x200f0000 0
/home/toolkit/himm 0x20150400 1
/home/toolkit/himm 0x20150004 1
/home/toolkit/himm 0x20030030 1





<think>根据用户的需求,用户希望了解如何使用HI3519DV500的MMP接口,通过`sample_comm_venc_save_jpeg`实现拍照功能。在之前的对话中,我们已经介绍了使用MPP实现拍照的核心程。现在用户具体到使用sample示例中的函数来实现。我们注意到,在海思的MPP示例代码中,`sample_comm_venc_save_jpeg`是用于保存JPEG图像的一个函数。它通常被用于在视频编码通道中捕获一帧并保存为JPEG文件。下面,我们将分步骤解释如何使用`sample_comm_venc_save_jpeg`实现拍照:###**步骤1:运行环境准备**1.确保已经正确编译MPP,并且生成了对应的sample程序(如sample_venc)。2.将sample_venc程序放到设备上运行。###**步骤2:理解`sample_comm_venc_save_jpeg`函数**这个函数的原型可能类似于(具体参数需参考实际代码):```cHI_S32sample_comm_venc_save_jpeg(VENC_CHNVeChn,constchar*pszFileName);```参数说明:-`VeChn`:视频编码通道号(VENCChannel)-`pszFileName`:保存的JPEG文件名(包括路径)###**步骤3:在示例代码中调用**在sample_venc的示例代码中,通常有一个模式是用于JPEG抓拍的。我们需要在该模式下调用`sample_comm_venc_save_jpeg`。以`sample_venc.c`中的`SAMPLE_VENC_JPEG_SNAP`模式为例:1.首先初始化系统、VI、VPSS和VENC(通道类型为PT_JPEG)。2.然后调用函数进行拍照:```cs32Ret=sample_comm_venc_save_jpeg(VENC_CHN_ID,"/userdata/capture.jpg");if(s32Ret!=HI_SUCCESS){printf("SaveJPEGfailed!\n");gotoEND;}```3.完成后释放资源。###**具体代码示例**以下是一个简化的示例程(基于`sample_venc`中的代码结构):```c#include"sample_comm.h"intmain(intargc,char*argv[]){HI_S32s32Ret;VENC_CHNVeChn=0;//假设使用通道0/*1.系统初始化*/s32Ret=sample_comm_sys_init();if(s32Ret!=HI_SUCCESS){printf("Systeminitfailed!\n");return-1;}/*2.VI、VPSS、VENC初始化*/s32Ret=sample_comm_vi_vpss_venc_init(VeChn,PIC_JPEG,1920,1080);if(s32Ret!=HI_SUCCESS){printf("Initvivpssvencfailed!\n");gotoSYS_EXIT;}/*3.保存JPEG*/s32Ret=sample_comm_venc_save_jpeg(VeChn,"/userdata/capture.jpg");if(s32Ret!=HI_SUCCESS){printf("SaveJPEGfailed!\n");}else{printf("CaptureJPEGsuccess!\n");}/*4.去初始化*/sample_comm_vi_vpss_venc_deinit(VeChn);SYS_EXIT:sample_comm_sys_exit();return0;}```###**关键配置说明**1.**分辨率设置**:在初始化VI和VENC,要确保分辨率一致(如1920x1080)。2.**文件路径**:确保保存路径有写权限(如/userdata/目录)。3.**编码通道类型**:必须是PT_JPEG。###**常见问题处理**-**拍照失败**:-检查VI传感器是否正常启动。-检查VB池是否足够大(JPEG捕获需要较大的VB)。-检查文件路径是否正确,并且有写入权限。-**图片不完整**:-确保在调用`sample_comm_venc_save_jpeg`之前,编码通道已经绑定并开始接收数据。###**注意事项**-该函数通常只捕获当前的一帧图像,因此需要确保在调用已经有图像数据到达VENC通道。-在实际应用中,可能需要结合外部事件(如按键)来触发拍照,而不是立即调用。###**参考文档**-详细参数配置可参考《HiMPPV4.0媒体处理软件开发参考》中的VENC章节。-sample_venc示例代码路径:`mpp/sample/venc/sample_venc.c`[^1]。---§§相关问题§§1.如何实现连续拍照(连拍)?2.如何调整JPEG的压缩质量?3.sample_comm_venc_save_jpeg函数的内部实现原理是什么?</think> 在 HI3519DV500 MPP 平台上通过 `sample_comm_venc_save_jpeg` 实现拍照功能的具体程和代码示例如下: ### 一、代码实现程 1. **系统初始化**(位于 `sample_comm_sys.c`) ```c HI_S32 SAMPLE_COMM_SYS_Init(VB_CONFIG_S *pstVbConfig) { // 初始化 VB 缓存池 HI_MPI_VB_SetConfig(pstVbConfig); // 系统初始化 HI_MPI_SYS_Exit(); HI_MPI_SYS_Init(); ... } ``` 2. **编码通道初始化**(关键步骤) ```c // 在 sample_venc.c 中调用 HI_S32 SAMPLE_VENC_JPEG_SNAP(VENC_CHN VeChn) { // 1. 配置 VENC 参数 VENC_CHN_ATTR_S stAttr; memset(&stAttr, 0, sizeof(stAttr)); stAttr.stVeAttr.enType = PT_JPEG; // JPEG 编码 stAttr.stVeAttr.u32PicWidth = 1920; stAttr.stVeAttr.u32PicHeight = 1080; // 2. 创建编码通道 HI_MPI_VENC_CreateChn(VeChn, &stAttr); // 3. 绑定 VPSS 到 VENC HI_MPI_SYS_Bind(&stSrcChn, &stDestChn); } ``` 3. **拍照功能实现**(核心函数) ```c // 在 sample_comm_venc.c 中 HI_S32 SAMPLE_COMM_VENC_SaveJpeg(VENC_CHN VeChn, const HI_CHAR *pszFileName) { // 1. 获编码 HI_S32 ret = HI_MPI_VENC_GetStream(VeChn, &stStream, HI_TRUE); // 2. 保存 JPEG 文件 FILE *fp = fopen(pszFileName, "wb"); fwrite(stStream.pStream, 1, stStream.u32Len, fp); // 3. 释放资源 HI_MPI_VENC_ReleaseStream(VeChn, &stStream); HI_MPI_VB_ReleaseBlock(stStream.pPack); ... } ``` ### 二、完整调用示例 ```c void capture_jpeg() { VB_CONFIG_S stVbConf; // 配置 VB 缓存(计算大小需考虑分辨率) stVbConf.astCommPool[0].u32BlkSize = 1920*1080*3/2; ... // 系统初始化 SAMPLE_COMM_SYS_Init(&stVbConf); // 初始化编码通道 SAMPLE_COMM_VENC_Start(0, PT_JPEG, 1920, 1080); // 执行拍照 SAMPLE_COMM_VENC_SaveJpeg(0, "/userdata/capture.jpg"); // 清理资源 SAMPLE_COMM_VENC_Stop(0); SAMPLE_COMM_SYS_Exit(); } ``` ### 三、关键参数说明 | 参数 | 要求 | 计算公式示例(1080P) | |------|------|----------------------| | VB 块大小 | 必须满足一帧JPEG所需 | $$ \text{u32BlkSize} = 1920 \times 1080 \times 1.5 $$ | | 编码类型 | `PT_JPEG` | - | | 超间 | 建议设-1(阻塞等待) | `HI_MPI_VENC_GetStream(VeChn, &stStream, -1)` | ### 四、常见问题解决 1. **VB不足错误**: - 调整 VB 配置:增加 `u32BlkCnt` 和 `u32BlkSize` - 检查公式:分辨率 × 1.5 × 安全系数(1.2) 2. **文件保存失败**: ```c // 检查存储路径权限 system("mkdir -p /userdata"); chmod("/userdata", 0777); ``` 3. **图像花屏**: - 确保像素格式一致:YUV420SP - 检查 VI→VPSS→VENC 的绑定顺序 > 完整代码参考 `mpp/sample/venc/sample_venc.c` 中的 `SAMPLE_VENC_JPEG_SNAP()` 函数实现[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草根大哥

进军大神程序员路上,谢谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值