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

方法一(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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值