2
votes

I just create simple graph to record video from a source Filter:

SourceFilter ---> Muxer ---> FileWriter

I can able to save video which come from SourceFilter to my local disk.

But when i try to play the recorded video, it play in "slow motion" :-).

It is sure that there is fps (frame persecond) problem. How can i fix it? any ideas?

PS:

To check if my SourceFilter give righ fps i simply create another graph:

SourceFilter ---> Video Decoder ---> Video Renderer

and it plays at right speed (fps)

More Details:

SourceFilter(*.mp4 file format) ---> Avi Mux Filter ---> File writer Filter

This record but in wrong fps.

When I try gdcl MP4 Mux ( can see it here ) i successfully get right fps.

SourceFilter(*.mp4 file format) ---> GDCL MPEG 4 Mux Filter ---> File writer Filter

The other scenario

SourceFilter( *.h264 file format) ---> Avi Mux Filter ---> File writer Filter
SourceFilter( *.h264 file format) ---> GDCL MPEG 4 Mux Filter---> File writer Filter

It records but recorded file does not play.

And actually i do not want decode anything...Just write the originally encoded video frames(mp4,h264) into file. And also i may not need syn audio with video...Why need Mux?

My ideal filter should be like this:

SourceFilter(whatever format) ---> File writer
2
It could help if you add file-format and codec info to the questionRalf
Thanks Ralf. File formats are mp4 and h264. I put more details into my question at More Details Section. @RalfDSBoy
I've run into a similar issue with the AVI mux before, unfortunately it's so long ago I can't remember what the issue was in my case. Are you setting AvgTimePerFrame of the VIDEOINFOHEADER in your source filter according to msdn.microsoft.com/en-us/library/dd318188(v=vs.85).aspx?Ralf
Actually, for now i just use GraphEdit...Not program anything...I does not do any modification in SOURCE filter.DSBoy

2 Answers

3
votes

Ralf's comment is probably right. The AVI file format doesn't have per-frame timestamps, just an average frame rate. So when a frame arrives, the mux has to decide whether to place this frame in the next "slot", or insert a "dropped frame" marker and put the frame in the slot after. If the source filter's timestamps don't match the media type's frame rate, then you will get this effect.

You can save your video elementary stream to a file, but use the Dump filter example, not the file writer. The file writer has a special protocol to allow multiplexors random access to the file (using the timestamps as file offsets). You want to just save the data as a stream, and the Dump example does that.

1
votes

In my case I indeed had a Source filter that didn't set AvgTimePerFrame correctly. After I fixed that (it was my own source filter) the AVI also went along with whatever it received from upstream.