为视频添加时间戳

时间:2011-11-19 14:25:44

标签: video timestamp directshow

我正在开发一个应用程序,用于从framegrabber卡捕获全高清视频并将其保存到磁盘上的文件中。我使用Diretshow接口捕获视频流,对其进行编码,然后使用AVI Mux过滤器将其保存到磁盘。

现在我还想将时间戳(捕获视频的时间)添加到视频文件中,以便在用户稍后播放视频文件时在视频顶部显示时间戳。用户应该能够播放任何流行的播放器(VLC,Windows媒体播放器等)。任何人都可以帮助我找到完成这项任务的可能方法。

1 个答案:

答案 0 :(得分:1)

您可以为此继承自CTransInPlaceFilter的过滤器。覆盖Transform方法,在其中您可以使用GDI +在Bitmap上编写时间戳。

您必须将此过滤器连接到图形中的适当位置,即媒体类型为RGB的位置。

编辑: 这是从我的过滤器中删除的一些示例代码,用于在RGB帧上写入文本。 希望这能让你开始:

#include <Gdiplus.h>
...
using namespace Gdiplus;

HRESULT UtilityFilter::Transform(IMediaSample *pSample)
{
  ...
  std::string sText = ...
  return drawTextOntoFrame(sText, pSample); 
}

HRESULT UtilityFilter::drawTextOntoFrame(const std::string& sText, IMediaSample *pSample)
{
  // get image properties
  AM_MEDIA_TYPE mt;
  HRESULT hr = InputPin()->ConnectionMediaType(&mt);
  if (FAILED(hr))
  {
    return hr;
  }
  ASSERT(mt.formattype == FORMAT_VideoInfo);
  BITMAPINFOHEADER *pbmi = HEADER(mt.pbFormat);

  // Get image buffer
  BYTE *pBuffer(NULL);
  hr = pSample->GetPointer(&pBuffer);
  if (FAILED(hr))
  {
    return hr;
  }

  wchar_t* wsText = StringUtil::stlToWide(sText);

  BITMAPINFO bitmapInfo;
  bitmapInfo.bmiHeader = *pbmi;

  Bitmap bm(&bitmapInfo, (void*)pBuffer);
  Graphics* pGraphics = Graphics::FromImage(&bm);

  // Initialize font
  Font myFont(L"Arial", 16);
  //RectF layoutRect(0.0f, 0.0f, 200.0f, 50.0f);
  RectF layoutRect(m_uiX, m_uiY, 350.0f, 50.0f);
  StringFormat format;
  format.SetAlignment(StringAlignmentNear);
  SolidBrush blackBrush(Color(255, 0, 0, 0));
  SolidBrush greenBrush(Color(255, 0, 255, 0));

  // Draw string
  pGraphics->DrawString(
    wsText,
    sText.length(),
    &myFont,
    layoutRect,
    &format,
    &greenBrush);

  delete[] wsText;
  delete pGraphics;
  return S_OK;
}