我正在开发一个应用程序,用于从framegrabber卡捕获全高清视频并将其保存到磁盘上的文件中。我使用Diretshow接口捕获视频流,对其进行编码,然后使用AVI Mux过滤器将其保存到磁盘。
现在我还想将时间戳(捕获视频的时间)添加到视频文件中,以便在用户稍后播放视频文件时在视频顶部显示时间戳。用户应该能够播放任何流行的播放器(VLC,Windows媒体播放器等)。任何人都可以帮助我找到完成这项任务的可能方法。
答案 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;
}