Double deinterlace with full motion - ffmpeg + yadif 50i-50p 60i-60p

33,432

Solution 1

It turns out that the video I was attempting to double-deinterlace was actually 25p that was encoded into a 50i video file in order to conform to an older AVCHD standard. Apparently this is a common practice for tapeless cameras from the mid-late 2000s. So of course when I attempt to deinterlace I only end up with, at most, the original source 25 frames per second because there is no motion between the fields.

f:v yadif=1 does exactly what is described - it takes true interlaced 50i footage and turns it into astonishingly high-quality 50p output using a motion-weighted bob algorithm, just the same as the "yadif 2x" realtime filter does in VLC. The output is of nearly double the effective vertical resolution over frame-discarded deinterlace. It is now one of my favorite video filters because practically nothing else appears to offer this capability.

Solution 2

I used this command:

ffmpeg -i source_50i.MTS -aspect 1920:1080 -vf yadif=1,scale=1920:1080 -c:v libx264 -preset fast -profile:v high -crf 23 -ac 2 -strict experimental -c:a aac -b:a 96k -movflags +faststart -y result_50p.mp4

and it worked fine!

I didn't check if the yadif method good or not good quality, but really created from 50i MTS to 50p mp4 from a camcorder source file. The source file was 19 MB and the result was 21MB.

Share:
33,432

Related videos on Youtube

moot
Author by

moot

Multimedia producer

Updated on September 18, 2022

Comments

  • moot
    moot almost 2 years

    I'm trying to figure out how to use yadif / yadif-2x with ffmpeg to convert 50i source material into 50p output that preserves the motion of all fifty fields per second. Right now, I am using the following command, which creates a frame-doubled version, essentially the same as 25p output.

    ffmpeg -i input.m2t -f:v yadif=1 -c:v prores output.mov
    

    Using yadif=0 makes a deinterlaced 25p file. Using yadif=1 makes a deinterlaced 50p file with doubled 25p frames. I need to make a deinterlaced file with 50 unique frames per second, and I'm pretty well certain this is possible. Is that what yadif(2x) is supposed to do?

    • Elisa Cha Cha
      Elisa Cha Cha about 11 years
      Please show your complete ffmpeg console output.
    • moot
      moot about 11 years
      Available here: pastebin.com/CqsD5D8L
    • moot
      moot about 11 years
      After a great deal of searching, I may have found another way to accomplish this conversion. I will attempt this method tomorrow and report results. hddv.net/…
    • mark4o
      mark4o about 11 years
      yadif=1 works for me: twice as many frames and each is different
    • moot
      moot about 11 years
      I tried that again today and unfortunately it definitely produces 50p output, but only doubled frames for me. I am using the MacPorts installation on MacOS X with mencoder_extras among others.
    • mark4o
      mark4o about 11 years
      Are you sure that your input is interlaced? You can use ffmpeg -i input.m2t -filter:v idet -f null - to analyze it for frames that appear to be top-frame-first interlaced, bottom-frame-first interlaced, or progressive.
    • Elisa Cha Cha
      Elisa Cha Cha over 9 years
      Looks like you solved your issue, so you can create and accept your own answer.
    • Peter Cordes
      Peter Cordes over 9 years
      ya, I didn't notice right away that you editted the answer into the question, since I was just skimming. Would be best to move that to an answer.
  • Display Name
    Display Name almost 10 years
    This is wrong. Yadif can interpolate missing lines and create real 50fps video from 50i, if this is indeed real 50i video (no duplicated fields — i.e. 2 fields from one frame).
  • Display Name
    Display Name almost 10 years
    I don't have time to search how to (properly) make it happen with ffmpeg — but it clearly has the effect in VLC player (while playing 60i video & having Yadif x2 enabled). looks like ffmpeg has a bug — it always duplicates frames, so I get either 120fps or 60fps and in either case I must drop every 2nd frame, which is kind of "hacky" and ffmpeg has no clear way of dropping every 2nd frame
  • Rajib
    Rajib almost 10 years
    If you care to share a short interlaced clip I'll give it a shot.
  • Display Name
    Display Name almost 10 years
    Currently I have only one such video which is not supposed for sharing, but I may shoot another one sooner or later (my DSLR camera has option of recording in 60i), and send example of both original (interlaced) video and processed one.
  • Display Name
    Display Name over 9 years
    @PeterCordes yes, as far as I can recall this is like this. Although in my case, ffmpeg did also double frames, resulting in 4x framerate, so I needed to drop every other frame after deinterlacing (because I was getting 120fps stream which is actually just 60fps with duplicates)
  • Peter Cordes
    Peter Cordes over 9 years
    I wonder if you got 120fps because of ffmpeg a lowest-common-multiple frame rate for a container like mp4, where it defaults to not supporting variable frame rate. e.g. with a variable-fps input from a phone camera, ffmpeg can make a 90k fps output file. With mkv as the output container format, ffmpeg doesn't actually feed duplicate frames to the video codec, so you get proper VFR. There may be an option to mux VFR mp4 output from ffmpeg, but IDK what it is.
  • Gyan
    Gyan over 7 years
    For anyone needing to know, adding -vsync vfr will mux VFR MP4s.
  • Graham P Heath
    Graham P Heath over 6 years
    I used this answer successfully to create a video out of a GoPro time lapse at 60fps, in hopes that others find it useful: ffmpeg -i 'G%*.JPG' -r 60 -vf "scale=1920:ih*1920/iw, crop=1920:1080, yadif=1" -c:v libx264 -preset slow -crf 18 -c:a aac -b:a 192k -pix_fmt yuv420p output.mkv