使用delphi按照dspack的demo实现了在播发时候的文字叠加,因为他的demo是在播放的空间上叠加bmp的方式实现,所以录下来的视频还是没有叠加文字的。查询了相关文章,有的说是要使用filter来试下你,但是我也没有找到相关filter。请问各位dspack高手,应该怎样在能在录下来的视频上叠加文字

解决方案 »

  1.   

    type
      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;