【FAQ】全志V系列芯片 如何生成拍照缩略图和视频缩略图?
-
适用范围
只适用于V系列,并使用MPP多媒体框架。
拍照缩略图的处理
设置JPEG编码生成缩略图
在创建一个JPEG编码的通路时,想要同时生成缩略图,其实很简单,只需要在调用AW_MPI_VENC_SendFrame之前调用AW_MPI_VENC_SetJpegExifInfo设置缩略图属性即可。VENC_EXIFINFO_S stExifInfo; memset(&stExifInfo, 0, sizeof(VENC_EXIFINFO_S)); stExifInfo.ThumbWidth = thumbnailWidth; stExifInfo.ThumbHeight = thumbnailHeight; stExifInfo.thumb_quality = thumbnailQuality; stExifInfo.Orientation = mJpegRotate; AW_MPI_VENC_SetJpegExifInfo(vechn, &stExifInfo); AW_MPI_VENC_SendFrame(vechn, &frmInfo);
获取缩略图
通过调用接口AW_MPI_VENC_GetJpegThumbBuffer,我们可以得到缩略图buffer的起始指针,和其大小。需要注意的是,缩略图并不是单独的buffer,而是保存在整个JPEG图像数据中的。
我们可以通过比较缩略的起始地址指针和JPEG图像数据的起始指针,得到其在JEPG文件中的偏移位置。同时由于JPEG文件的格式,我们可以在保存JPEG文件时,将得出的缩略图偏移量和大小写入到文件尾部,当需要缩略图去显示的时候,能更方便的获取到缩略图数据。
int getThumbOffset(VENC_STREAM_S *pVencStream, VENC_JPEG_THUMB_BUFFER_S *pThumbBuf, off_t *pThumbOffset) { if (NULL == pVencStream || NULL == pThumbBuf) { aloge("fatal error! why parameter is null!"); return -1; } if (pThumbBuf->ThumbAddrVir >= pVencStream->mpPack[0].mpAddr0 && \ pThumbBuf->ThumbAddrVir < pVencStream->mpPack[0].mpAddr0+pVencStream->mpPack[0].mLen0) { *pThumbOffset = pThumbBuf->ThumbAddrVir - pVencStream->mpPack[0].mpAddr0; } else if (pThumbBuf->ThumbAddrVir >= pVencStream->mpPack[0].mpAddr1 && \ pThumbBuf->ThumbAddrVir < pVencStream->mpPack[0].mpAddr1+pVencStream->mpPack[0].mLen1) { *pThumbOffset = pThumbBuf->ThumbAddrVir - pVencStream->mpPack[0].mpAddr1; } alogd("get thumb offet[%lld]", *pThumbOffset); return 0; }
视频生成缩略图
视频生成缩略图的方法是通过demux组件解析一帧图像,送入解码器,将其解码为YUV图像,再将其送入编码器缩放编码为较小的图像作为视频的缩略图。
demux -> vdec -> venc -> jpeg
详细的实现流程可以参考 softwinner/eyesee-mpp/framework/v316/demo/sample_ThumbRetriever下的sample_ThumbRetriever和eyesee-mpp/framework/v316/media/thumbretriever路径下的EyeseeThumbRetriever类的实现流程。
-
-
-
-
-
-
-
-
-
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号