使用delphi按照dspack的demo实现了在播发时候的文字叠加,因为他的demo是在播放的空间上叠加bmp的方式实现,所以录下来的视频还是没有叠加文字的。查询了相关文章,有的说是要使用filter来试下你,但是我也没有找到相关filter。请问各位dspack高手,应该怎样在能在录下来的视频上叠加文字
解决方案 »
- [转贴]很现实,也感人。MM与IT GG的对话!
- 有关ehlib调试
- delphi里有显示“确定”和“取消”这两种选择按钮的对话框吗?兄弟们,帮帮忙,在线等,急啊!!解决马上结帐!
- 一道数学题,请看:如何得到两个点连成的直线的所有点?
- 求nec versapro va60j的声卡,显卡驱动程序
- 用惯了MS Server SQL Server(ODBC)+Delphi开发数据库,现在想用Oracle+Delphi,要注意哪些问题?
- intraweb有for delphi5的吗?delphi能做b/s程序吗?
- 利用ADOQUERY
- 在delphi中怎样去设计数据库存储AutoCAD图
- 高手请进,在下有礼了!详情...
- Delphi的问题
- 传奇外挂中文脚本或触发器实现的原理
TIPTVRender = class(TBCTransformFilter)
....
function TIPTVRender.Transform(pMediaSample: IMediaSample): HRESULT;
var
pmt: PAMMediaType;
pvi: PVideoInfoHeader;
pData: PByte; // Pointer to the actual image buffer
lDataLen: Longint; // Holds length of any given sample
//int iPixel; // Used to loop through the image pixels
iPixelSize, cxImage, cyImage, cbImage, numPixels: integer;
left, top: integer;
begin
EnterCriticalSection(m_IPTVRenderLock);
try
// get current media type
pmt := FInput.CurrentMediaType.MediaType;
pvi := PVideoInfoHeader(pmt^.pbFormat); pMediaSample.GetPointer(pData);
lDataLen := pMediaSample.GetSize(); // Get the image properties from the BITMAPINFOHEADER
iPixelSize := pvi^.bmiHeader.biBitCount div 8;
cxImage := pvi^.bmiHeader.biWidth;
//if( cxImage<0 )
// cxImage = 0-cxImage;
cyImage := pvi^.bmiHeader.biHeight;
if (cyImage < 0) then
begin
cyImage := 0 - cyImage;
m_bYUV := TRUE;
end;
cbImage := cyImage * cxImage * iPixelSize;
numPixels := cxImage * cyImage; // Transform it to its XOR image according the parameters
if (m_IPTVRenderParams.param1 = 0) then
begin
if (m_bYUV) then
begin
if (m_pTimeYUV <> nil) then
SH_AddImage2To1(TRUE, pData, m_pTimeYUV, m_iTimeX, m_iTimeY, cxImage, cyImage, cyImage - m_iTimeY - m_iTimeTop, m_iTimeLeft, m_clrTimeBk);
end
else
begin
if (m_pTimeRGB <> nil) then
SH_AddImage2To1(TRUE, pData, m_pTimeRGB, m_iTimeX, m_iTimeY, cxImage, cyImage, m_iTimeTop, m_iTimeLeft, m_clrTimeBk);
end; if (m_bYUV) then
begin
if (m_pImageYUV <> nil) then
SH_AddImage2To1(TRUE, pData, m_pImageYUV, m_iImageX, m_iImageY, cxImage, cyImage, cyImage - m_iImageY - m_iImageTop, m_iImageLeft, m_clrImageBk);
end
else
begin
if (m_pImage <> nil) then
SH_AddImage2To1(TRUE, pData, m_pImage, m_iImageX, m_iImageY, cxImage, cyImage, m_iImageTop, m_iImageLeft, m_clrImageBk);
end; if (m_pTextRGB <> nil) and (m_pTextYUV <> nil) then
begin
if (m_bFirstText) then
begin
m_iX := m_iTextLeft;
m_iY := m_iTextTop; if (m_iTextVerScroll = 1) then
m_iX := 0 - m_iTextX; m_bFirstText := FALSE;
end; left := 0;
if (m_iTextVerScroll = 0) then
begin
left := cxImage - m_iX;
inc(m_iX);
if (m_iX >= cxImage + m_iTextX) then
m_iX := 0;
end
else
begin
if (m_iTextVerScroll = 2) then
left := m_iTextLeft
else
begin
left := m_iX;
inc(m_iX);
if (m_iX >= cxImage) then
m_iX := 0 - m_iTextX;
end;
end; m_iTextHorScroll := 2;
top := 0;
if (m_iTextHorScroll = 0) then
begin
top := m_iY;
inc(m_iX);
if (m_iY >= cyImage) then
m_iY := 0;
end
else
begin
if (m_iTextHorScroll = 2) then
top := m_iTextTop
else
begin
top := cyImage - m_iY;
inc(m_iX);
if (m_iY >= cyImage + m_iTextY) then
m_iY := 0;
end;
end; if (m_bYUV) then
SH_AddImage2To1(TRUE, pData, m_pTextYUV, m_iTextX, m_iTextY, cxImage, cyImage, cyImage - m_iTextY - top, left, m_clrTextBk)
else
SH_AddImage2To1(TRUE, pData, m_pTextRGB, m_iTextX, m_iTextY, cxImage, cyImage, top, left, m_clrTextBk);
end; end;
finally
LeaveCriticalSection(m_IPTVRenderLock);
end;
Result := NOERROR;
end;