开发者

C# Extract Specific Frame from WMV

开发者 https://www.devze.com 2023-03-10 15:00 出处:网络
This example on Code Project is almost exactly what I need... except the saveFrameFro开发者_如何学运维mVideo takes a percentage instead of a frame number...

This example on Code Project is almost exactly what I need... except the saveFrameFro开发者_如何学运维mVideo takes a percentage instead of a frame number...

How can I use this to extract frame X from a WMV file?

I've also tried FFmpeg.NET... but there weren't any downloadable builds, and I couldn't get the source to build...


You can also try AsfMojo for this task, it allows you to extract an image by time offset:

Bitmap bitmap = AsfImage.FromFile(videoFileName)
                        .AtOffset(17.34);

Internally the Media SDK and some custom stream manipulation is used to get frame accurate still frames (up to a 100 millisecond tolerance), so if you know the frame rate of your media file (i.e. 25) you can calculate the time offset of the nearest frame:

int frameX = 400; //get 400th frame
double frameRate = 25.0;
double timeOffset = frameX / frameRate;

Bitmap bitmap = AsfImage.FromFile(videoFileName)
                        .AtOffset(timeOffset);


The magic is in this line:

mediaDet.WriteBitmapBits(streamLength * percentagePosition, 
                    target.Width, target.Height, outputBitmapFile);

It's calculating the frame number from the percentage and the length of the stream. Since you already know the frame number, use that instead.


I have been working on extracting frames from webcam videos and video files- for both, i used the AForge library- (you need to add references to AForge.Video, AForge.Imaging , AForge.Video.Directshow and AForge.Video.FFMPEG). For live videos, I added a videoSourcePlayer_NewFrame(object sender, ref Bitmap image) to get the frame- Bitmap image contains the required frame in type Bitmap. This is basically the event handler for the videosource player i added in the windows form. For video from a file, i used: videoSource=new FileVideoSoource(fileName); videoSource.Start(); videoSource.NewFrame += new AForge.Video.NewFrameEventHandler(videoSource_NewFrame);

videoSource_NewFrame is the event handler in case there is a new frame.

0

精彩评论

暂无评论...
验证码 换一张
取 消