3
A
回答
2
是的,这是可能的。你需要使用DirectShow.NET。我发现this有用。
编辑:
确定它看起来像,因为我用它的库已经改变了......诅咒开源:)
我刚翻译成下面的代码和测试,它为我工作正常(注意,假定存在一个在C WMV:\ AAA称为C4.wmv和输出将转至c:\ AAA \ out.bmp)
IGraphBuilder graphbuilder = (IGraphBuilder)new FilterGraph();
ISampleGrabber samplegrabber = (ISampleGrabber) new SampleGrabber();
graphbuilder.AddFilter((IBaseFilter)samplegrabber, "samplegrabber");
AMMediaType mt = new AMMediaType();
mt.majorType = MediaType.Video;
mt.subType = MediaSubType.RGB24;
mt.formatType = FormatType.VideoInfo;
samplegrabber.SetMediaType(mt);
int hr = graphbuilder.RenderFile("C:\\aaa\\c4.wmv", null);
IMediaEventEx mediaEvt = (IMediaEventEx)graphbuilder;
IMediaSeeking mediaSeek = (IMediaSeeking)graphbuilder;
IMediaControl mediaCtrl = (IMediaControl)graphbuilder;
IBasicAudio basicAudio = (IBasicAudio)graphbuilder;
IVideoWindow videoWin = (IVideoWindow)graphbuilder;
basicAudio.put_Volume(-10000);
videoWin.put_AutoShow(OABool.False);
samplegrabber.SetOneShot(true);
samplegrabber.SetBufferSamples(true);
long d = 0;
mediaSeek.GetDuration(out d);
long numSecs = d/10000000;
long secondstocapture = (long)(numSecs * 0.10f);
DsLong rtStart, rtStop;
rtStart = new DsLong(secondstocapture * 10000000);
rtStop = rtStart;
mediaSeek.SetPositions(rtStart, AMSeekingSeekingFlags.AbsolutePositioning, rtStop, AMSeekingSeekingFlags.AbsolutePositioning);
mediaCtrl.Run();
EventCode evcode;
mediaEvt.WaitForCompletion(-1, out evcode);
VideoInfoHeader videoheader = new VideoInfoHeader();
AMMediaType grab = new AMMediaType();
samplegrabber.GetConnectedMediaType(grab);
videoheader =
(VideoInfoHeader)Marshal.PtrToStructure(grab.formatPtr,
typeof(VideoInfoHeader));
int width = videoheader.SrcRect.right;
int height = videoheader.SrcRect.bottom;
Bitmap b = new Bitmap(width, height, PixelFormat.Format24bppRgb);
uint bytesPerPixel = (uint)(24 >> 3);
uint extraBytes = ((uint)width * bytesPerPixel) % 4;
uint adjustedLineSize = bytesPerPixel * ((uint)width + extraBytes);
uint sizeOfImageData = (uint)(height) * adjustedLineSize;
BitmapData bd1 = b.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int bufsize = (int)sizeOfImageData;
int n = samplegrabber.GetCurrentBuffer(ref bufsize, bd1.Scan0);
b.UnlockBits(bd1);
b.RotateFlip(RotateFlipType.RotateNoneFlipY);
b.Save("C:\\aaa\\out.bmp");
Marshal.ReleaseComObject(graphbuilder);
Marshal.ReleaseComObject(samplegrabber);
另外要注意,DirectShow是somethign的框架中冷静...... MS有点建议你去媒体基金会......我是一个老派的DirectX坦率地说,这个程序员不再那么做了。
嗨, 我引用的DirectShowLib-2005.dll,但我停留在你链接我的示例代码2行:) 类型comtype = Type.GetTypeFromCLSID(Clsid.FilterGraph); ClsId会是什么? – Michel 2010-04-06 12:39:30
是啊!有用。非常感谢! – Michel 2010-04-07 20:25:30
恩,恩,我几乎不敢问......我更新了我的相机附带的软件,GRMBL软件现在不会让我输出到WMV,但只能输出到原始格式:MP4。我试图理解代码以使其适用于MP4文件(因为它在MP4文件崩溃),但我真的不知道如何。 你能帮我解决这个问题吗? – Michel 2010-04-10 19:47:27