微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 录像的视频如何在画面中实时加上时间戳

录像的视频如何在画面中实时加上时间戳

时间:10-02 整理:3721RD 点击:
[DESCRIPTION]
做监控的项目会要求在录制的视频画面上实时的添加上时间戳,这条FAQ提供修改的位置的建议。
[SOLUTION]
方法一(L之前版本):
可以在下面这个地方同,即MDP输出这个画面,但是Encode之前,使用SW的方式来Overlay即可,至于具体如何实现Overlay的话,网上搜索一下,很多示例代码的。如下的参考代码是在录像的画面上画一条彩色条的测试代码,你们可以将添加timestamp的功能的代码替换掉mEMSet之后即可实现timestamp的功能。这个Buffer的格式是YUV420 Planer格式,即先放Y,再放U,最后放V。
php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks/av/media/libstagefright/CAMERASource.cpp
void CameraSource::dataCallbackTimestamp()
{
... ...
CHECK(data != NULL && data->size() > 0);
// Brand the timestamp start 2014-07-29
{
int _stride = mVideoSize.width;
int height = mVideoSize.height;
uint8_t *_ptr = (uint8_t *)data->pointer();
int offset = 240;
int bar_width = 80;
ALOGE("! draw line, ptr: %p, offset: %d, stride: %d, height: %d", _ptr, offset, _stride,height);
if (NULL != _ptr) {
// Overlay the timestamp here.
memset(_ptr + offset*_stride , 0x80, _stride * bar_width); //Clear Y
memset(_ptr + (height*_stride) + offset*_stride/4 , 0x40, _stride*bar_width/4); // Clear U
memset(_ptr + (height*_stride + height*_stride/4) + offset*_stride/4, 0x40, _stride*bar_width/4); // Clear V
}
}
// Brand the timestamp end 2014-07-29
mFramesReceived.push_back(data);
int64_t timeUs = mStartTimeUs + (timestampUs - mFirstFrameTimeUs);
mFrameTimes.push_back(timeUs);
... ...
}
方法二(适用所有版本):
1)录像video中显示时间:
PreviewCmdQueThread.cpp(/vendor/mediatek/proprietary/platform/mt6735/hardware/mtkcam/D2/v1/hal/adapter/MtkDefault/Preview/PreviewC mdQueThread.cpp) 的
updateOne()方法中修改。将丢给encoder的yuv数据进行处理,这里的demo是将部分内容给涂黑,您可以使用这段buffer来处理timestamp,其中buffer地址为vidoNode.getImgBuf()->getVirAddr()。
if(flag&eID_Pass2VIDO) {
MUINT8*p=(MUINT8*)vidoNode.getImgBuf()->getVirAddr();
MUINT8*end_p=(MUINT8*)vidoNode.getImgBuf()->getVirAddr()+
vidoNode.getImgBuf()->getImgWidth()*3*100/2;
while((p<(end_p)))//add the addTimeStamp() function for yourself
{
*p=0;
p++;
}
vidoNode.getImgBuf()->setTimestamp(pass1LatestTimeStamp);
mspPreviewBufHandler->enqueBuffer(vidoNode);
}
2)录像preview的时候也进行显示时间:
if (flag&eID_Pass2DISPO)
{
MUINT8*p=(MUINT8*)dispNode.getImgBuf()->getVirAddr();
MUINT8*end_p=(MUINT8*)dispNode.getImgBuf()->getVirAddr()+
dispNode.getImgBuf()->getImgWidth()*3*100/2;
while((p<(end_p)) )//add the addTimeStamp() function for yourself
{
*p=0;
p++;
}
dispNode.getImgBuf()->setTimestamp(pass1LatestTimeStamp);
mspPreviewBufHandler->enqueBuffer(dispNode);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top