大家好 我在使用dvsdk中的demo但是发现录像效果很卡很迟钝,没有25帧每秒的压缩。这是怎么回事?谢谢大家帮助。
lu edward:
附件中我上传了录像的视频。由于不能上传h264文件,所以压缩了一下,解压后会有test.h264文件,可以通过VLC播放。从录像后播放的效果来看,是录像太快了。是怎么回事?怎么可以让录像正常速度?
各位高手帮我支支招,谢谢了。
Chris Meng:
回复 lu edward:
Edward,
请问你是在你自己的板子上测试的,还是TI的EVM?
ARM/DSP/DDR的频率是否配置到芯片支持的最高频率?
lu edward:
回复 Chris Meng:
你好meng:
我不是在ti 的 EVM板子上测试的。
dsp平率是不是设置的太高了?什么参数可以设置?我记得以前dm368的时候dsp的下利率没有用到99%这么高,好像是30%左右?
另外我用vlc看了一下视频的信息,其实是25帧左右。300帧使用了12秒左右。我觉得是video和capture的fifoget和fifoput不对称。(我的猜想)
但是不管怎么样dsp的使用率都太高了。
谢谢你的回复。
Chris Meng:
回复 lu edward:
Edward,
DM368没有DSP只有ARM9,是利用的加速器做的编解码。
lu edward:
回复 Chris Meng:
你好meng DM368确实是用DSP进行编解码的。你看一下信息:
我使用的DM368开发板是奇想达生产。
硬件平台叫QXD-DM368。我在上面开发过DVSDKdemo的 encode和decode,DSP不知道什么型号。但是也有打印信息。DSP load 3x%,具体我忘记了。
软件使用的平台是:
达芬奇的EVM太贵了,而且也不知道怎么在官网上购买。即使购买了,核心板的原理图也么有办法得到,不利于开发自己产品。我们现在做的产品,其中的核心板是问别家购买,硬件软件再做二次开发的。
这个不说了,我觉得dvsdk demos有没有在TI的evm上跑过的视频?能不能把一些log或者信息给我看看,我看看代码里面到底有什么区别。
我现在看了一下录制的视频文件,觉得文件本身可能没有什么问题,可能问题在于送到encode的fifo没有调整好,
比如所应按照顺序的规律该是 1 2 3 4 5 6 7 8 9
但是其实送到encode中的帧 1 4 8 9 10 13 15
这是我在调试时候发现的。具体我不知道,现在还在调试。
另外:
DSP ALG HEAP
CMEM
DSPLINK
以上的模块内存分布位置我都调整过,这些调整会不会导致DSP的效率过高?
谢谢你meng。
lu edward:
回复 Chris Meng:
我看了一下demo,调试的时候我把demo中的Venc1_process注释掉,demo运行cap和disp正常。但是加入了视频压缩后效果就卡住了。这是为什么,dsp的性能不够压缩?
另外我看了一下dmai中的默认配置:
/**********************************************************************************/const VIDENC1_Params Venc1_Params_DEFAULT = { sizeof(VIDENC1_Params), /* size */ XDM_DEFAULT, /* encodingPreset */ IVIDEO_LOW_DELAY, /* rateControlPreset */ 720, /* maxHeight */ 1280, /* maxWidth */ 30000, /* maxFrameRate */ 6000000, /* maxBitRate */ XDM_BYTE, /* dataEndianness */ 0, /* maxInterFrameInterval */ XDM_YUV_420P, /* inputChromaFormat */ IVIDEO_PROGRESSIVE, /* inputContentType */ XDM_CHROMA_NA /* reconChromaFormat */};
const VIDENC1_DynamicParams Venc1_DynamicParams_DEFAULT = { sizeof(IVIDENC1_DynamicParams), /* size */ 720, /* inputHeight */ 1280, /* inputWidth */ 30000, /* refFrameRate */ 30000, /* targetFrameRate */ 6000000, /* targetBitRate */ 30, /* intraFrameInterval */ XDM_ENCODE_AU, /* generateHeader */ 0, /* captureWidth */ IVIDEO_NA_FRAME, /* forceFrame */ 1, /* interFrameInterval */ 0 /* mbDataFlag */};/**********************************************************************************/
这些配置我都配置了,还有什么需要配置的吗?
368的平台demo我看过了也是使用同样的code_engine 和 dmai。
有没有大侠遇到过这个问题。跪求帮助了。
lu edward:
回复 lu edward:
应该不是帧同步的问题,排除了。
调试只要把Venc1_process这个代码去掉 就可以正常从摄像头内获取视频并且显示。
文件:video.c
函数:Void *videoThrFxn(Void *arg)
while (!gblGetQuit()) { /* Get a buffer to encode from the display thread */ fifoRet = Fifo_get(envp->hDisplayOutFifo, &hDisplay);
if (fifoRet < 0) { ERR("Failed to get buffer from video thread\n"); cleanup(THREAD_FAILURE); }
/* Did the display thread flush the fifo? */ if (fifoRet == Dmai_EFLUSH) { cleanup(THREAD_SUCCESS); }
/* Get a buffer to encode to from the writer thread */ fifoRet = Fifo_get(envp->hWriterOutFifo, &hDstBuf);
if (fifoRet < 0) { ERR("Failed to get buffer from video thread\n"); cleanup(THREAD_FAILURE); }
/* Did the writer thread flush the fifo? */ if (fifoRet == Dmai_EFLUSH) { cleanup(THREAD_SUCCESS); }
/* Make sure the whole buffer is used for input */ BufferGfx_resetDimensions(hDisplay);
#if 0
/* Decode the video buffer */ if (Venc1_process(hVe1, hDisplay, hDstBuf) < 0) { ERR("Failed to encode video buffer\n"); cleanup(THREAD_FAILURE); }
#endif
/* Send encoded buffer to writer thread for filesystem output */ if (Fifo_put(envp->hWriterInFifo, hDstBuf) < 0) { ERR("Failed to send buffer to display thread\n"); cleanup(THREAD_FAILURE); }
/* Return buffer to display thread */ if (Fifo_put(envp->hDisplayInFifo, hDisplay) < 0) { ERR("Failed to send buffer to display thread\n"); cleanup(THREAD_FAILURE); }
/* Increment statistics for the user interface */ gblIncVideoBytesProcessed(Buffer_getNumBytesUsed(hDstBuf)); frameCnt++; }
lu edward:
回复 Chris Meng:
按照代码的意思就是说 1秒内 dsp应该处理25帧图片。VIDENC1_process()应该被调用25次才对。
@0x0035bab9:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 2 outID 3 generated 5482 bytes@0x003af75a:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 3 outID 4 generated 8188 bytes@0x0040918f:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 0 outID 1 generated 31828 bytes@0x0045be36:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 1 outID 2 generated 18135 bytes@0x004aedd8:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 2 outID 3 generated 10945 bytes@0x004ff93d:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 3 outID 4 generated 5807 bytes@0x00559335:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 0 outID 1 generated 14515 bytes@0x005ace49:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 1 outID 2 generated 6596 bytes@0x00603448:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 2 outID 3 generated 11814 bytes@0x0065666b:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 3 outID 4 generated 6386 bytes@0x006ac6cf:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 0 outID 1 generated 11678 bytes@0x006fe87e:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 1 outID 2 generated 3404 bytes@0x00752374:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 2 outID 3 generated 5295 bytes@0x007a5949:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 3 outID 4 generated 7149 bytes@0x007fa100:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 0 outID 1 generated 12656 bytes@0x0084c3ff:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 1 outID 2 generated 4371 bytes@0x008a026a:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 2 outID 3 generated 10357 bytes@0x008f41c8:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 3 outID 4 generated 10575 bytes@0x0094a39a:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 0 outID 1 generated 17447 bytes@0x0099de34:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 1 outID 2 generated 7092 bytes@0x009f3458:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 2 outID 3 generated 10232 bytes@0x00a48b51:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 3 outID 4 generated 9369 bytes@0x00a9e080:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 0 outID 1 generated 10903 bytes@0x00b5efe7:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 1 outID 2 generated 17659 bytes@0x00bb0386:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 2 outID 3 generated 6919 bytes@0x00c029db:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 3 outID 4 generated 6571 bytes@0x00c56ae5:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 0 outID 1 generated 10193 bytes@0x00ca8fcd:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 1 outID 2 generated 5549 bytes@0x00cfc76c:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 2 outID 3 generated 10557 bytes@0x00d4fb59:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 3 outID 4 generated 8786 bytes@0x00da4404:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 0 outID 1 generated 16246 bytes@0x00df6c60:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 1 outID 2 generated 7076 bytes@0x00e49537:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 2 outID 3 generated 8551 bytess@0x00e9bab7:[T:0x42cc0490] ti.sdo.dmai – [Venc1] VIDENC1_process() ret 0 inId 3 outID 4 generated 7783 bytes
lu edward:
回复 Chris Meng:
meng 你好:
我想问下
params->inputChromaFormat = XDM_YUV_422ILE; params->reconChromaFormat = XDM_YUV_420SP;
这两者的区别。应为我设置的时候XDM_YUV_422ILE然后通过电脑VLC软件解析录像后的视频文件显示是 yuv420的。demo是不是设置错了?
Chris Meng:
回复 lu edward:
lu edward
meng 你好:
我想问下
params->inputChromaFormat = XDM_YUV_422ILE; params->reconChromaFormat = XDM_YUV_420SP;
这两者的区别。应为我设置的时候XDM_YUV_422ILE然后通过电脑VLC软件解析录像后的视频文件显示是 yuv420的。demo是不是设置错了?
我对DM3730不熟悉,具体请看一下DM3730的h264编码库的user guide。但是其他平台,例如DM36x,DM6467, DM81xx的的h264编码输入的数据格式都是yuv40.