2012-06-05 3 views
0

По моим previous post я пытался использовать sampleGrabber, который будет захватывать кадры из видео файлов и затем вызывает обратный вызов функции:Как сделать запись видео с помощью текстового наложения с помощью Directshow и C#?

Type comType = Type.GetTypeFromCLSID(new Guid("e436ebb3-524f-11ce-9f53-0020af0ba770")); 
IGraphBuilder graphBuilder = (IGraphBuilder)Activator.CreateInstance(comType); 

comType = Type.GetTypeFromCLSID(new Guid("C1F400A0-3F08-11d3-9F0B-006008039E37")); 
ISampleGrabber sampleGrabber = (ISampleGrabber)Activator.CreateInstance(comType); 

graphBuilder.AddFilter((IBaseFilter)sampleGrabber, "samplegrabber"); 

AMMediaType mediaType = new AMMediaType(); 
mediaType.majorType = MediaType.Video; 
mediaType.subType = MediaSubType.RGB24; 
mediaType.formatType = FormatType.VideoInfo; 
sampleGrabber.SetMediaType(mediaType); 

int hr = graphBuilder.RenderFile(@"D:\test.wmv", null); 

IMediaEventEx mediaEvent = (IMediaEventEx)graphBuilder; 
IMediaControl mediaControl = (IMediaControl)graphBuilder; 
IVideoWindow videoWindow = (IVideoWindow)graphBuilder; 
IBasicAudio basicAudio = (IBasicAudio)graphBuilder; 

videoWindow.put_AutoShow(OABool.False); 
basicAudio.put_Volume(-10000); 

sampleGrabber.SetOneShot(false); 
sampleGrabber.SetBufferSamples(true); 

//the same object has implemented the ISampleGrabberCB interface. 
//0 sets the callback to the ISampleGrabberCB::SampleCB() method. 
sampleGrabber.SetCallback(this, 0); 

mediaControl.Run(); 

EventCode eventCode; 
mediaEvent.WaitForCompletion(-1, out eventCode); 


Marshal.ReleaseComObject(sampleGrabber); 
Marshal.ReleaseComObject(graphBuilder); 

обратного вызова функции

public int SampleCB (double sampleTime, IMediaSample mediaSample) 
    { 
    //WHAT TO DO HERE. 
    } 
  1. Что я сделать в функции обратного вызова, чтобы добавить наложение на каждый кадр, а затем все видео получит магазин с наложением текста?

  2. Есть ли способ добавить текст наложения при записи видео?

ответ

0

Лучший способ добавить текстовый оверлей во время записи, чтобы реализовать DMO или DirectShow Transform-Filter. Я бы предпочел DMO, потому что это проще, и вы можете повторно использовать его позже в MediaFoundation.

Вы устанавливаете RGB24 или RGB32 в качестве типа ввода для DMO/Filter, а затем вы можете рисовать с помощью GDI, что вы хотите на каждом кадре.

На графике это выглядит следующим образом: VideoSource -> DMO -> ASF Writer.

+0

i woukd хотел бы пойти с DMO с любым образцом кода? Я использую [этот] (http://stackoverflow.com/questions/10847477/text-overlay-when-video-is-recording-using-directshow-and-c-sharp) код для записи? по крайней мере, давайте шаги? Спасибо за ваш ответ .. – Amogh

+0

В образце DirectShowNet есть образец для видео-Dmo: DMOFlip [ссылка] (http://directshownet.sourceforge.net/about.html). Это должно быть хорошей отправной точкой, потому что этот образец также содержит справочный файл, как написать dmo. – CPlusSharp

+0

Большое спасибо, сэр, я прохожу через этот образец. – Amogh