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

来源:互联网 发布:dlna软件下载 编辑:程序博客网 时间:2024/05/14 14:41


方法一(L之前版本)
可以在下面这个地方同,即MDP输出这个画面,但是Encode之前,使用SW的方式来Overlay即可,至于具体如何实现Overlay的话,网上搜索一下,很多示例代码的。如下的参考代码是在录像的画面上画一条彩色条的测试代码,你们可以将添加timestamp的功能的代码替换掉memset之后即可实现timestamp的功能。这个Buffer的格式是YUV420 Planer格式,即先放Y,再放U,最后放V。
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);     ... ... }



方法二(适用所有版本,不包括MT6735平台的M版本):   
PreviewCmdQueThread.cpp(/vendor/mediatek/proprietary/platform/mt6735/hardware/mtkcam/D2/v1/hal/adapter/MtkDefault/Preview/PreviewCmdQueThread.cpp) 的
updateOne()方法中修改。
将丢给encoder的yuv数据进行处理,这里的demo是将部分内容给涂黑,您可以使用这段buffer来处理timestamp,其中buffer地址为vidoNode.getImgBuf()->getVirAddr()。
1)录像video中显示时间:

if(flag&eID_Pass2VIDO){  //Add timestamp  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++;  }    //Add timestamp end  vidoNode.getImgBuf()->setTimestamp(pass1LatestTimeStamp);  mspPreviewBufHandler->enqueBuffer(vidoNode); }


2)录像preview的时候也显示时间:

if (flag&eID_Pass2DISPO) {  //Add timestamp  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++;  }     //Add timestamp  dispNode.getImgBuf()->setTimestamp(pass1LatestTimeStamp);    mspPreviewBufHandler->enqueBuffer(dispNode); }


方法三(适用所有版本,包括MT6735平台的M版本):
ExtImgProcImp.cpp:
M版本=>/vendor/mediatek/proprietary/hardware/mtkcam/legacy/v1/common/ExtImgProc/ExtImgProcImp.cpp
L版本=>/vendor/mediatek/proprietary/hardware/mtkcam/v1/common/ExtImgProc/ExtImgProcImp.cpp
KK版本=>/mediatek/hardware/mtkcam/v1/common/ExtImgProc/ExtImgProcImp.cpp
这里的demo是对ImageBufferQueue的yuv数据进行处理,将部分内容给涂黑,您可以使用这段buffer来处理timestamp,其中buffer地址为img.virtAddr。
1)设置需要处理的Image buffer type:

ExtImgProcImp:: ExtImgProcImp() {  FUNCTION_NAME;  //Set which img buf you want to process.  //For example: mImgMask = BufType_Display|BufType_Record;  mImgMask = BufType_Display|BufType_Record;//录像Preview和video中都显示时间  mUser = 0; } 

2)添加时间戳

MBOOL ExtImgProcImp:: doImgProc(ImgInfo& img) { ...  //Add image process code  switch(img.bufType)  {   case BufType_Display:   {   //[BEGIN]     //Add timestamp   MUINT8 *p = (MUINT8*)img.virtAddr;   MUINT8 *end_p = (MUINT8*)img.virtAddr + img.width*3*100/2;   while((p<(end_p)))   {    *p=0;    p++;   }   //Add timestamp end     //[END]   break;   }   ...   case BufType_Record:   {   //[BEGIN]     //Add timestamp   MUINT8 *p = (MUINT8*)img.virtAddr;   MUINT8 *end_p = (MUINT8*)img.virtAddr + img.width*3*100/2;   while((p<(end_p)))   {    *p=0;    p++;   }   //Add timestamp end     //[END]   break;   }   ...  } }   




0 0