[FFmpeg-user] Deinterlace and change framerate with -vcodec copy

Mark Himsley mark at mdsh.com
Sat May 21 18:15:03 CEST 2011


On 21/05/2011 14:24, Peter Bašista wrote:
>>> Hello everyone!
>>>
>>> I  would like ask for an advice.
>>>
>>> I have some mpegts files captured from DVB card.
>>> They contain some video streams and some audio streams.
>>> I know how to extract the streams from the mpegts file
>>> and how to use them to create a mkv file, for example.
>>> I do it like this:
>>> ffmpeg -i DVBchannel.mpegts -vcodec copy -acodec copy movie.mkv
>>>
>>> But I have a problem with the resulting file. The original
>>> video streams (in file DVBchannel.mpegts) are interlaced at 50fps.
> 
>> No, I very much doubt that is true. There are no DVB broadcasters that I
>> know of which transmit at 100 fields per second, which is what you are
>> implying. Please supply the output of "ffmpeg -i DVBchannel.mpegts"
> 
> Okay, I am sorry, you are right. I have posted something
> that is definitely confusing.
> 
> I should have written 50 fields per second, not frames per second.
> By "interlaced at 50fps" I was trying to tell that the video contains
> 50 fields (or half frames) per second. But I did not know about
> the difference between frames and fields before you replied.
> So, thank you for pointing that out.

Ok. So you say you have a video that is encoded at 25i (50 fields per
second)(and if anyone wants the 25i verses 50i argument then please
start a new thread, I'll be happy to join in ;-).

I hope you understand that each frame will contain 2 fields, that is,
two picture each taken 20 milliseconds apart that are encoded onto
alternating lines of the frame.

And what you want to do is output 25 frames per second without throwing
away any data and without re-encoding?

Before I go much further, I think I should point out that that will look
horrible. Turning an interlaced frames into progressive frames without
doing some de-interlacing will leave you with comb artefacts on all
movement.

It is not something I would want to do, but I do have a vague
recollection of some bit of software being able to twiddle with the
flags on an mpeg2 video stream to alter the interlaced/progressive
flags. But since, in general, doing so would be horrible, I've forgotten
what it is.

> You wanted me to post output from ffmpeg -i DVBchannel.mpegts, so here it is:
> 
> Seems stream 0 codec frame rate differs from container frame rate:
> 50.00 (50/1) -> 50.00 (50/1)
> Input #0, mpegts, from 'DVBchannel.mpegts':
>  Duration: 01:23:55.58, start: 54068.412678, bitrate: 5916 kb/s
>  Program 1
>    Stream #0.0[0x44d]: Video: h264 (Main), yuv420p, 1440x1080 [PAR
> 4:3 DAR 16:9], 55.22 fps, 50 tbr, 90k tbn, 50 tbc
>    Stream #0.1[0x44e](eng): Audio: mp2, 48000 Hz, stereo, s16, 192 kb/s

Interesting that FFmpeg says the file is 55.22 fps... FFmpeg generally
tells you the field rate for interlaced files - but that is a strange rate.

> I have reformulated the remaining part of my original email, so I repost it.
> 
> I want the final file to play as simply as possible
> (e.g. without the deinterlace filters), so I would like to deinterlace
> the video in advance. But I assume it is not possible with -vcodec copy.
> Or am I mistaken?
> 
> My point here is that I do not want to reencode the video "just"
> to deinterlace it. I want to do it as simply as possible, utilizing
> as much previous encoding work as possible. But as far as I know,
> it is necessary to completely reencode the video in order to
> use the deinterlace filters. Am I correct?
> 
> To my knowledge, the deinterlace filters just somehow
> combine the fields (half frames) together, but they do not change
> the framerate. So, my first question is: Is there a video codec
> for which it is possible to deinterlace video with -vcodec copy?
> I would really appreciate if it would be possible for h264.

The yadif filter can take the 50 fields and convert them into 50 frames,
which doubles the frame rate. It can also drop every other field -
preserving the 25 fps.

> And my second question is about the framerate itself.
> 
> Let's say I have managed to get a 25fps noninterlaced file movie.mkv.
> Is there any "easy" way to change the framerate to 24fps?
> By "easy" I mean without reencoding (or: with -vcodec copy).

That's an easy answer. No.

> This, in my opinion, should be possible, because it seems like
> a rather minor change. Here I would like to emphasize that
> what I want to change is the framerate, not the number of frames.

Ok. Think about how h.264 is encoded. It contains few 'I' frames
(effectively a full frame - only compressed) but it also contains 'P'
frames and 'B' frames that both just encode the differences between
other frames and this frame. If you just simply throw away frames, as
your opinion suggests should be possible, then you are just throwing
away frames that OTHER frames REQUIRE in order to be able to create them.

So, no, you cannot just throw away frames in a h.264 stream (unless your
h.264 stream is 'I' frame only, which yours will not be).

> So, I expect the video to be longer (take more time to play)
> after such a framerate change. Here:
> http://www.hdslr-cinema.com/news/workflow/convert-between-framerates/
> the author mentions that such a framerate change
> is referred to as "conforming".
> 
> I tried the intermediate rawvideo format method described
> on the mentioned website, but it is of no use for me,
> because it requires reencoding. I would really like to do it
> with -vcodec copy. Is is possible? If it is, which codecs
> allow for framerate changes like this? Does h264 support it?

No. To change frame rate you have to decode, throw away 'baseband' 'I'
frames, and re-encode.

> Thank you for your time.
> 
> Peter Basista


More information about the ffmpeg-user mailing list