Grab frame from .mov file using DirectShow.net - c#

How to grab frame from .mov file in c#.net by using DirectShow.net

DirectShow and DirectShow.NET don't make it any special with .MOV files. You typically create a filter graph with a Sample Grabber filter that you manage, and its callback gives you frames of video stream that passes through.
You might want to look at DxScan sample in DirectShow.NET, \Samples\Editing\DxScan. It grabs frames from a given movie file.
A sample application scanning a media file looking for black frames
Most of the work is done in ISampleGrabberCB.BufferCB. See the comments
there. Also, the algorithm used to scan for black frames isn't as efficient
as it could be. However, the samples gives you an idea of how this could be
done.

Related

How can I transform a sequence of images into a playable video using LibVLCSharp?

I have a sequence of images that I was able to extract from a video using LibVLCSharp. This sample to be more specific. I'm creating a small video library manager for learning purposes, and I would like to extract frames and create thumbnails to play when the user hovers the mouse over the previewer.
Using the aforementioned sample I was able to create a WPF UI around the same loging and extract the frames from a video file. However what I want now is to convert these extracted frames into a video file, using them as preview for the video, just like happens on YouTube.
I wasn't able, however, to find out how to achieve this using LibVLCSharp or just LibVLC. Using this answer on Super User I was able to achieve my goal and put those frames together into a video using ffmpeg.
I haven't taken the time yet to study FFmpeg.Autogen, so I don't know if I would be able to extract the frames from the video files in the same way I can do with LibVLCSharp, but I don't see with good eyes using both libraries on my application, one to export the frames and one to generate these frames into a video.
So, is there a way to get the output frames and convert them into a playable video using LibVLCSharp (or libvlc) itself?
I don't see with good eyes using both libraries on my application
You already are, LibVLC ships with ffmpeg.
So, is there a way to get the output frames and convert them into a playable video using LibVLCSharp (or libvlc) itself?
It is possible that there is a way, but I cannot find it right now. Using libvlc for this would be awkward and an inflexible solution. I would use ffmpeg.
You are not forced to use FFmpeg.Autogen for conversion scenarios you can achieve with ffmpeg.exe. I would start a ffmpeg process to do the conversion, and read the ffmpeg stdout for the video data, if you don't want to save it somewhere.
I think there is a way to play images at a specific rate (look at the VLC CLI options), but I don't know how well it works as I never used that

Direct Show Decrease Video File Size

I am using direct show to capture video and save it to file. I have tried in vain to find ways to decrease the resultant video size but cannot manage. I would like to know if anyone can tell me how I can:
Decrease the frame rate of the video
Decrease the quality of the video (even down to 320 x 240)
Apply a compression on the video (mpeg? etc).
Raw video is huge in size, and to size-efficient storage assumes you compress the video. You are to use one of the video encoders, such as MPEG-4 AVC (H.264) or Windows Media. You typically insert an additional filter into your pipeline between capture filter and multiplexer/file writer. Read up on this in multiple past topics:
Using video codecs like XVid in c#
Real-time video encoding in DirectShow
How to properly build a directshow graph to compress video...

Using video codecs like XVid in c#

I'm trying to develop an application which captures a series of images from web cam using DirectShow.Net and then sends it over network to other clients.
Everything is working fine, except the images are too big and compression methods like using GZipStream, JPEG Compression and etc does not help more about reducing the size.
Now, I want to know how to using codecs like XVid or any other codec, to reduce the size.
Playing around the demos of VisioForge, it approves that XVid files are too smaller than regular AVI files.
Thanks for any help
There are specific video compression algorithms, which effectively compress video, some of the most popular are: M-JPEG, MPEG-4, H.261, H.263, H.264, VP8, Theora. In DirectShow the video compression items have form-factor of video compression filters (or codecs). Standard Windows does not normally include much for this task (for various reasons, patents to specifically mention), so you need to use a third party or otherwise installable codec. Luckily, the codecs have more or less uniform interface and you use them similarly from C#.
See related questions with helpful information:
Real-time video encoding in DirectShow
Capturing webcam using DirectShow.NET library
Be sure to check DirectShow.NET samples out:
\Samples\Misc\DxWebCam
A poor man's web cam program. This application runs as a Win32
Service. It takes the output of a capture graph, turns it into a
stream of JPEG files, and sends it thru TCP/IP to a client
application.
\Samples\Capture\CapWMV
A .NET sample application using the WM ASF Writer filter to create an
wmv file

Record video from opengl

I am using Tao framework and I have a simple opengl control.
How can I record a video from this control and save it to a file?
See here for a link that mentions both Bitmap screen capture in C# and starts to describe the AVI conversion.
For further information about the library used to in the first link to make an avi file from a collection of bitmap images see here.
See here for an example that uses the Media Player Encoder in order record the screen.
The more complicated and direct way would be to either use a video capture card or write a software device that emulates one and feed that source to DirectShow filter using DirectShow.Net or Pinvoking other DirectShow libaries directly.
How can I record a video from this control and save it to a file?
Use glReadPixels to get the pixel data. Feed the pixel data into a video encoder (e.g. a DirectShow filter graph, or through ffmpeg/libavcodec or sump the images into files and encode them to video later).

What is up-to-date way of grabbing frames from video file in c#?

As far as I know one way of grabbning frames from video files in C# is using MediaDet. However MSDN says that Media Detector(MediaDet) is deprecated:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd390664(v=vs.85).aspx
What is the 'modern' way of getting frames from a video file using c#?
If you are looking for a thumbnail image from the video, take a look at FFMPEG.
there is a c# wrapper available . http://code.google.com/p/ffmpeg-sharp/
Checkout this link for a sample http://ramcrishna.blogspot.com/2008/09/playing-videos-like-youtube-and.html

Categories

Resources