FPS

From Avisynth wiki
(Difference between revisions)
Jump to: navigation, search
m (added category)
(formatting, some rearranging of text)
Line 1: Line 1:
=== AssumeFPS ===
+
A set of functions to change frame rate of a clip.
 +
 
 +
__TOC__
 +
== AssumeFPS ==
  
 
{{Template:Func4Def|AssumeFPS(clip ''clip'', float ''fps'' [, bool ''sync_audio''])|AssumeFPS(clip ''clip'', ''int numerator'' [, int ''denominator'', bool ''sync_audio''])|AssumeFPS(clip ''clip1'', clip ''clip2'' [, bool ''sync_audio''])|AssumeFPS(clip ''clip1'', string ''preset'' [, bool ''sync_audio''])}}
 
{{Template:Func4Def|AssumeFPS(clip ''clip'', float ''fps'' [, bool ''sync_audio''])|AssumeFPS(clip ''clip'', ''int numerator'' [, int ''denominator'', bool ''sync_audio''])|AssumeFPS(clip ''clip1'', clip ''clip2'' [, bool ''sync_audio''])|AssumeFPS(clip ''clip1'', string ''preset'' [, bool ''sync_audio''])}}
  
The AssumeFPS filter changes the frame rate without changing the frame count (causing the video to play faster or slower). It only sets the framerate-parameter. If ''sync_audio'' (which is false by default) is true, it also changes the audio sample rate to match the duration of the video, the pitch of the resulting audio gets shifted.
+
Changes the frame rate without changing the frame count, causing the video to play faster or slower.  
  
This is also a method to change only the sample rate of the audio alone.
+
This is also a method to change the sample rate of the audio alone.
  
In v2.55, if ''clip2'' is present, the framerate of ''clip1'' will be adjusted to match the one of ''clip2''. This is useful when you want to add two clips with slightly different framerate.
+
=====Parameters=====
 +
;''clip1''
 +
:Source clip
  
In v2.57, the behaviour with respect to the framerate is a bit changed. The main issue is that users are allowed to specify the framerate as float, but the NTSC (FILM and Video) and PAL standards require ratios as framerate. Besides this AviSynth exports the framerate as a ratio, so when specifying a float, it will be converted to a ratio. The ratios of the standards are given by 24000/1001 for 23.976 (FILM) and 30000/1001 for 29.97 (Video). ''When specifying these floats, they are exported by AviSynth as ratios, but not as the standard ratios.'' One of the reasons for this is, that those floats are approximations (remember that 24000/1001 = 23.9760239760...), so how should AviSynth know how to choose the correct ratio? In order to overcome this issue, the user can use AssumeFPS(24000,1001) or simply AssumeFPS("ntsc_film").
+
;''fps''
 +
:If supplied, the new framerate is set to ''fps''.  
 +
:*Due to the way frame rates are stored, ''fps'' must be converted to the closest ratio of 32-bit signed integers,  
 +
::eg, 33.3333 → 329833/9895 (33.3332996)
  
Another problem is that the converted floats were (in v2.56 and older) exported with 64 bit precision, resulting in very large numerators and denominators, making some players crash. To overcome this, a smart float-ratio is added internally, and the framerates are approximated accurately by ratios of small numbers. For example, AssumeFPS(23.976) is converted to AssumeFPS(2997,125) as can be checked with [[Info]].
+
;''numerator'', ''denominator''
 +
:If supplied, the new framerate is set to ''numerator'' divded by ''denominator''. ''Denominator'' defaults to 1.
  
'''Presets:'''
+
;''clip2''
 +
:If supplied, the new framerate is taken from clip2.
  
{| border="1"
+
;''preset''
 +
:If supplied, the new framerate is taken from a set of standard rates, as shown below:
 +
:{| class="wikitable"
 
|-
 
|-
| standard
+
! style="text-align:left"| preset name
| numerator
+
! numerator
| denominator
+
! denominator
| approximate fps
+
! approximate FPS
 
|-
 
|-
 
| "ntsc_film"
 
| "ntsc_film"
Line 88: Line 100:
 
|}
 
|}
  
'''Examples:'''
+
;''sync_audio''
 +
:If ''true'', the audio sample rate is changed to match the duration of the video; the pitch of the resulting audio is shifted.
 +
:If ''false'' (the default), the audio is unchanged; this means the audio will lose synchronization over time.
  
Examples PAL +4% conversion:
+
=====Examples=====
 +
 
 +
*PAL +4% conversion:
  
 
  AVISource("FILM_clip.avi")            # Get 24fps clip
 
  AVISource("FILM_clip.avi")            # Get 24fps clip
Line 99: Line 115:
 
The +4% speed up is conventionally used for displaying 24fps film on PAL television. The slight increase in pitch and tempo is readily accepted by viewers of PAL material.
 
The +4% speed up is conventionally used for displaying 24fps film on PAL television. The slight increase in pitch and tempo is readily accepted by viewers of PAL material.
  
Slowing down of video (framerate of original video is 30 frames a second):
+
*Slowing down of video (framerate of original video is 30 frames a second):
  
 
  AviSource("video.avi").AssumeFPS(10, true)            # Slows the video down to a third of its speed
 
  AviSource("video.avi").AssumeFPS(10, true)            # Slows the video down to a third of its speed
  
Speeding up of video (framerate of original video is 30 frames a second):
+
*Speeding up of video (framerate of original video is 30 frames a second):
  
 
  AviSource("video.avi").AssumeFPS(60, true)            # Double speed
 
  AviSource("video.avi").AssumeFPS(60, true)            # Double speed
  
=== AssumeScaledFPS ===
+
=====History=====
 +
*From v2.55, if ''clip2'' is present, the framerate of ''clip1'' will be adjusted to match the one of ''clip2''. This is useful when you want to add two clips with slightly different framerate.
 +
 
 +
*From v2.57, the behaviour with respect to the framerate is a bit changed. The main issue is that users are allowed to specify the framerate as float, but the NTSC (FILM and Video) and PAL standards require ratios as framerate. Besides this AviSynth exports the framerate as a ratio, so when specifying a float, it will be converted to a ratio. The ratios of the standards are given by 24000/1001 for 23.976 (FILM) and 30000/1001 for 29.97 (Video). When specifying these floats, they are exported by AviSynth as ratios, ''but not as the standard ratios.'' One of the reasons for this is, that those floats are approximations (remember that 24000/1001 = 23.9760239760...), so how should AviSynth know how to choose the correct ratio? In order to overcome this issue, the user can use AssumeFPS(24000,1001) or simply AssumeFPS("ntsc_film").
 +
 
 +
*Another problem is that in v2.56 and older, the converted floats were exported with 64 bit precision, resulting in very large numerators and denominators, making some players crash. To overcome this, a smart float-ratio is added internally, and the framerates are approximated accurately by ratios of small numbers. For example, AssumeFPS(23.976) is converted to AssumeFPS(2997,125) as can be checked with [[Info]].
 +
 
 +
 
 +
== AssumeScaledFPS ==
  
 
{{Template:FuncDef|AssumeScaledFPS(clip [, int ''multiplier'', int ''divisor'', bool ''sync_audio''])}}
 
{{Template:FuncDef|AssumeScaledFPS(clip [, int ''multiplier'', int ''divisor'', bool ''sync_audio''])}}
  
The AssumeScaledFPS filter scales the frame rate without changing the frame count. The numerator is multiplied by the ''multiplier'', the denominator is multiplied by the ''divisor'', the resulting rational FPS fraction is normalized, and if either the resulting numerator or denominator exceed 31 bits the result is rounded and scaled. This allows exact rational scaling to be applied to the FPS property of a clip.
+
Like '''AssumeFPS''', scales the frame rate without changing the frame count (causing the video to play faster or slower), by directly scaling [[Clip_properties|FrameRateNumerator]] and/or [[Clip_properties|FrameRateDenominator]].  
 +
 
 +
*Due to the way frame rates are stored, the scaled numerator/denominator fraction must be converted to the closest ratio of 32-bit signed integers,
 +
:eg, 33.3333 → 329833/9895 (33.3332996)
 +
 
 +
=====Parameters=====
 +
;''clip1''
 +
:Source clip
 +
 
 +
;''multiplier''
 +
:clip1.[[Clip_properties|FrameRateNumerator]] is multiplied by ''multiplier''.
 +
 
 +
;''divisor''
 +
:clip1.[[Clip_properties|FrameRateDenominator]] is multiplied by ''divisor''.
 +
 
 +
;''sync_audio''
 +
:If ''true'', the audio sample rate is changed by the same amount; the pitch of the resulting audio is shifted.
 +
:If ''false'' (the default), the audio is unchanged; this means the audio will lose synchronization over time.
 +
 
 +
=====History=====
 +
*Available from v2.56.
 +
 
  
If ''sync_audio'' is true, it also changes the audio sample rate by the same ratio, the pitch of the resulting audio gets shifted.
+
== ChangeFPS ==
  
Available in v2.56.
+
{{Template:Func4Def|ChangeFPS(clip ''clip'', float ''fps'' [, bool ''linear''])|ChangeFPS(clip ''clip'', int ''numerator'' [, int ''denominator'', bool ''linear''])|ChangeFPS(clip ''clip1'', clip ''clip2'', bool ''linear'')|ChangeFPS(clip ''clip1'', string ''preset'' [, bool ''linear''])}}
  
=== ChangeFPS ===
+
Changes the frame rate by deleting or duplicating frames.
  
{{Template:Func4Def|ChangeFPS(clip ''clip'', float ''fps'' [, bool ''linear''])|ChangeFPS(clip ''clip'', int ''numerator'' [, int ''denominator'', bool ''linear''])|ChangeFPS(clip ''clip1'', clip ''clip2'', bool ''linear'')|ChangeFPS(clip ''clip1'', string ''preset'' [, bool ''sync_audio''])}} <- error? should be "linear" here?
+
=====Parameters=====
 +
;''clip1''
 +
:Source clip
  
ChangeFPS changes the frame rate by deleting or duplicating frames.
+
;''fps''
 +
:If supplied, the new framerate is set to ''fps''.
 +
:*Due to the way frame rates are stored, ''fps'' must be converted to the closest ratio of 32-bit signed integers,
 +
::eg, 33.3333 &rarr; 329833/9895 (33.3332996)
  
Up to v2.05, the video gets truncated or filled up to preserve playback speed and play time (the number of frames was not changed). In later versions, the behaviour has been changed and the number of frames is increased or decreased like in ConvertFPS.
+
;''numerator'', ''denominator''
 +
:If supplied, the new framerate is set to ''numerator'' divided by ''denominator''. ''Denominator'' defaults to 1.  
  
In v2.54, an option ''linear''=true/false is added to ChangeFPS. This will make AviSynth request frames in a linear fashion, when skipping frames. Default is true.
+
;''clip2''
 +
:If supplied, the new framerate is taken from clip2.
  
In v2.56, if ''clip2'' is present, the framerate of ''clip1'' will be adjusted to match that of ''clip2''.
+
;''preset''
 +
:If supplied, the new framerate is taken from a set of standard rates, as listed under [[#Parameters|AssumeFPS]].
  
In v2.57, the behaviour with respect to the framerate is a bit changed. See AssumeFPS.
+
;''linear''
 +
:If ''true'' (the default), this will make AviSynth request frames in a linear fashion, when skipping frames.  
  
Examples PAL->NTSC conversion:
+
=====Examples=====
 +
*PAL->NTSC conversion:
  
 
  AviSource("PAL_clip.avi")              # Get clip
 
  AviSource("PAL_clip.avi")              # Get clip
Line 142: Line 197:
 
The effect is similar to 3-2 telecine pull down. Regular viewers of PAL material may notice a motion stutter that viewers of NTSC material readily ignore as for telecined film.
 
The effect is similar to 3-2 telecine pull down. Regular viewers of PAL material may notice a motion stutter that viewers of NTSC material readily ignore as for telecined film.
  
=== ConvertFPS ===
+
=====History=====
 +
*Up to v2.05, the video gets truncated or filled up to preserve playback speed and play time (the number of frames was not changed). In later versions, the behaviour has been changed and the number of frames is increased or decreased as in '''ConvertFPS'''.
  
{{Template:Func4Def|ConvertFPS(clip ''clip'', float ''new_rate'' [, int ''zone'', int ''vbi''])|ConvertFPS(clip ''clip'', ''int numerator'' [, int ''denominator'', int ''zone'', int ''vbi''])|ConvertFPS(clip ''clip1'', clip ''clip2'' [,int ''zone'', int ''vbi''])|ConvertFPS(clip ''clip1'', string ''preset'' [, int ''zone'', int ''vbi''])}}
+
*From v2.54, an option '''linear''' is added (see above).
  
The filter attempts to convert the frame rate of clip to new_rate without dropping or inserting frames, providing a smooth conversion with results similar to those of standalone converter boxes. The output will have (almost) the same duration as clip, but the number of frames will change proportional to the ratio of target and source frame rates.  
+
*From v2.56, if '''clip2''' is present, the framerate of ''clip1'' will be adjusted to match that of ''clip2''.
  
In v2.56, if ''clip2'' is present, the framerate of ''clip1'' will be adjusted to match that of ''clip2''.
+
*From v2.57, the behaviour with respect to the framerate is a bit changed. See AssumeFPS.
  
In v2.57, the behaviour with respect to the framerate is a bit changed. See AssumeFPS.
 
  
The filter has two operating modes. If the optional argument ''zone'' is not present, it will blend adjacent video frames, weighted by a blend factor proportional to the frames' relative timing ("Blend Mode"). If ''zone'' is present, it will switch from one video frame to the next ("Switch Mode") whenever a new source frame begins, that is, usually somewhere in the middle of a target frame. Switch Mode assumes that the output will be shown on a TV where each frame is scanned from top to bottom. The parameter zone specifies the height of the transition region in which the current frame will be blended into the next.
+
== ConvertFPS ==
  
Blend Mode will cause visible, although slight, blurring of motion. This is a typical artifact of frame rate conversion and can be seen on commercial video tapes and TV programs as well. When working with interlaced video, it is important to let the filter operate on individual fields, not on the interlaced frames. (See Examples below.)  
+
{{Template:Func4Def|ConvertFPS(clip ''clip'', float ''new_rate'' [, int ''zone'', int ''vbi''])|ConvertFPS(clip ''clip'', ''int numerator'' [, int ''denominator'', int ''zone'', int ''vbi''])|ConvertFPS(clip ''clip1'', clip ''clip2'' [,int ''zone'', int ''vbi''])|ConvertFPS(clip ''clip1'', string ''preset'' [, int ''zone'', int ''vbi''])}}
 
+
Switch Mode is an attempt to avoid motion blurring, but comes at the expense of slight flicker and motion artifacts. Horizontal and vertical pans may show a slight wobble. Still frames from this conversion show "broken" or "bent" vertical lines in moving scenes. Scene transitions may occur in the middle of a frame. Nevertheless, the results do look less blurry than in "Blend Mode".
+
  
Neither mode is perfect. Which one to choose depends on personal preference and on the footage to be converted. Switch Mode is probably only suitable if the output will be shown on a TV, not on a computer screen.  
+
The filter attempts to convert the frame rate without dropping or inserting frames, providing a smooth conversion with results similar to those of standalone converter boxes. The output will have (almost) the same duration as clip, but the number of frames will change proportional to the ratio of target and source frame rates.  
  
 
Frame rate conversion is inherently difficult. This filter implements two common methods used by commercial Prosumer-level converter systems. The results are typically quite good. More sophisticated systems employ motion interpolation algorithms, which are difficult to get right, but, if done right, do yield superior results.  
 
Frame rate conversion is inherently difficult. This filter implements two common methods used by commercial Prosumer-level converter systems. The results are typically quite good. More sophisticated systems employ motion interpolation algorithms, which are difficult to get right, but, if done right, do yield superior results.  
Line 166: Line 219:
 
The audio data are not touched by this filter. Audio will remain synchronized, although the length of the audio data may slightly differ from that of the video data after the conversion. This is because the output can only contain an integer number of frames. This effect will be more pronounced for shorter clips. The difference in length should be ignored.  
 
The audio data are not touched by this filter. Audio will remain synchronized, although the length of the audio data may slightly differ from that of the video data after the conversion. This is because the output can only contain an integer number of frames. This effect will be more pronounced for shorter clips. The difference in length should be ignored.  
  
'''Parameters:'''
+
Not all parameter values are checked for sanity.
  
'''new_rate''': Target frame rate. Can be integer or floating point number. In Blend Mode, new_rate must be at least 2/3 (66.7%) of the source frame rate, or an error will occur. This is to prevent frame skipping. If you need to slow down the frame rate more than that, use Switch Mode.  
+
=====Modes=====
 +
The filter has two operating modes. If the optional argument '''zone''' is not present, it will blend adjacent video frames, weighted by a blend factor proportional to the frames' relative timing (''Blend ''mode). If zone ''is ''present, it will switch from one video frame to the next (''Switch ''mode) whenever a new source frame begins – usually somewhere in the middle of a target frame. ''Switch ''mode assumes that the output will be shown on a TV where each frame is scanned from top to bottom. The parameter zone specifies the height of the transition region in which the current frame will be blended into the next.  
  
'''zone''': (Optional) If specified, puts the filter into Switch Mode. Integer number greater or equal to zero. If zero, the filter will perform a hard switch, that is, it will immediately display the next frame below the switch line. If greater than zero, specifies the height (in lines) of the transition zone, where one frame is gradually blended into the next. zone=80 yields good results for full-size video (480/576 active lines). The transition is done in the same way as in [[PeculiarBlend]](). zone must be less or equal than the number of lines of the target frame that correspond to the duration of the source frame. This is typically 5/6 or 6/5 of the target frame height, that is, a few hundred lines. An error occurs if a larger value is chosen.  
+
'''Blend''' mode will cause visible, although slight, blurring of motion. This is a typical artifact of frame rate conversion and can be seen on commercial video tapes and TV programs as well. When working with interlaced video, it is important to let the filter operate on individual fields, not on the interlaced frames. (see Examples below.)
  
'''vbi''': (Optional) In Switch Mode, specifies that the filter should apply a timing correction for the vertical blanking interval (VBI). Integer number greater than zero, indicating the height of the VBI of the target frames, in lines. Typically vbi=49 for PAL and vbi=45 for NTSC, but these values are not critical. Ignored in Blend Mode.  
+
'''Switch''' mode is an attempt to avoid motion blurring, but comes at the expense of slight flicker and motion artifacts. Horizontal and vertical pans may show a slight wobble. Still frames from this conversion show "broken" or "bent" vertical lines in moving scenes. Scene transitions may occur in the middle of a frame. Nevertheless, the results do look less blurry than in ''Blend ''mode.  
  
 +
Neither mode is perfect. Which one to choose depends on personal preference and on the footage to be converted. ''Switch ''mode is probably only suitable if the output will be shown on a TV, not on a computer screen.
  
Examples NTSC->PAL conversion:
+
=====Parameters=====
 +
;''new_rate''
 +
:Target frame rate. Can be integer or floating point number. In ''Blend ''mode, new_rate must be at least 2/3 (66.7%) of the source frame rate, or an error will occur. This is to prevent frame skipping. If you need to slow down the frame rate more than that, use ''Switch ''mode.
 +
 
 +
;''zone''
 +
:If specified, puts the filter into ''Switch ''mode. Integer number greater or equal to zero. If zero, the filter will perform a hard switch, that is, it will immediately display the next frame below the switch line. If greater than zero, specifies the height (in lines) of the transition zone, where one frame is gradually blended into the next. zone=80 yields good results for full-size video (480/576 active lines). The transition is done in the same way as in [[PeculiarBlend]](). zone must be less or equal than the number of lines of the target frame that correspond to the duration of the source frame. This is typically 5/6 or 6/5 of the target frame height, that is, a few hundred lines. An error occurs if a larger value is chosen.
 +
 
 +
;''vbi''
 +
:If specified in ''Switch'' mode, specifies that the filter should apply a timing correction for the vertical blanking interval (VBI). Integer number greater than zero, indicating the height of the VBI of the target frames, in lines. Typically vbi=49 for PAL and vbi=45 for NTSC, but these values are not critical. Ignored in ''Blend'' mode.
 +
 
 +
=====Examples=====
 +
*NTSC->PAL conversion:
  
 
  AVISource("NTSC_clip.avi")            # Get clip
 
  AVISource("NTSC_clip.avi")            # Get clip
 
  Bob(height=576)                        # Separate fields and interpolate them to full height.
 
  Bob(height=576)                        # Separate fields and interpolate them to full height.
 
  BicubicResize(768,576)                # Resize to PAL square-pixel frame size.
 
  BicubicResize(768,576)                # Resize to PAL square-pixel frame size.
  ConvertFPS(50)                        # Convert field rate to PAL, using Blend Mode.
+
  ConvertFPS(50)                        # Convert field rate to PAL, using ''Blend ''mode.
 
  SeparateFields.SelectEvery(4,0,3)      # Undo Bob, even field first. Use SelectEvery(4,1,2) for odd field first.
 
  SeparateFields.SelectEvery(4,0,3)      # Undo Bob, even field first. Use SelectEvery(4,1,2) for odd field first.
 
  Weave()                                # Finish undoing Bob.
 
  Weave()                                # Finish undoing Bob.
Line 186: Line 252:
 
This example will also work with frame-based NTSC material, even with telecined film (movies). For film material, however, you will get better results by using an inverse-telecine filter and speeding up the frame rate from 23.976 to 25fps.
 
This example will also work with frame-based NTSC material, even with telecined film (movies). For film material, however, you will get better results by using an inverse-telecine filter and speeding up the frame rate from 23.976 to 25fps.
  
Not all parameter values are checked for sanity.
+
====History====
 +
*From v2.56, if '''clip2''' is present, the framerate of ''clip1'' will be adjusted to match that of ''clip2''.
 +
 
 +
*From v2.57, the behaviour with respect to the framerate is a bit changed. See AssumeFPS.
 +
 
  
'''Changes:'''
+
==Changes==
 
{| border="1"
 
{| border="1"
 
|-
 
|-

Revision as of 16:39, 24 December 2015

A set of functions to change frame rate of a clip.

Contents

AssumeFPS

AssumeFPS(clip clip, float fps [, bool sync_audio])
AssumeFPS(clip clip, int numerator [, int denominator, bool sync_audio])
AssumeFPS(clip clip1, clip clip2 [, bool sync_audio])
AssumeFPS(clip clip1, string preset [, bool sync_audio])

Changes the frame rate without changing the frame count, causing the video to play faster or slower.

This is also a method to change the sample rate of the audio alone.

Parameters
clip1
Source clip
fps
If supplied, the new framerate is set to fps.
  • Due to the way frame rates are stored, fps must be converted to the closest ratio of 32-bit signed integers,
eg, 33.3333 → 329833/9895 (33.3332996)
numerator, denominator
If supplied, the new framerate is set to numerator divded by denominator. Denominator defaults to 1.
clip2
If supplied, the new framerate is taken from clip2.
preset
If supplied, the new framerate is taken from a set of standard rates, as shown below:
preset name numerator denominator approximate FPS
"ntsc_film" 24000 1001 23.976
"ntsc_video" 30000 1001 29.970
"ntsc_double" 60000 1001 59.940
"ntsc_quad" 120000 1001 119.880
"ntsc_round_film" 2997 125 23.976
"ntsc_round_video" 2997 100 29.97
"ntsc_round_double" 2997 50 59.94
"ntsc_round_quad" 2997 25 119.88
"film" 24 1 24.0
"pal_film" 25 1 25.0
"pal_video" 25 1 25.0
"pal_double" 50 1 50.0
"pal_quad" 100 1 100.0
sync_audio
If true, the audio sample rate is changed to match the duration of the video; the pitch of the resulting audio is shifted.
If false (the default), the audio is unchanged; this means the audio will lose synchronization over time.
Examples
  • PAL +4% conversion:
AVISource("FILM_clip.avi")             # Get 24fps clip
LanczosResize(768, 576)                # Resize to PAL square-pixel frame size.
AssumeFPS(25, 1, true)                 # Convert frame rate to PAL, also adjust audio.
SSRC(44100)                            # Restore audio sample rate to a standard rate.

The +4% speed up is conventionally used for displaying 24fps film on PAL television. The slight increase in pitch and tempo is readily accepted by viewers of PAL material.

  • Slowing down of video (framerate of original video is 30 frames a second):
AviSource("video.avi").AssumeFPS(10, true)             # Slows the video down to a third of its speed
  • Speeding up of video (framerate of original video is 30 frames a second):
AviSource("video.avi").AssumeFPS(60, true)             # Double speed
History
  • From v2.55, if clip2 is present, the framerate of clip1 will be adjusted to match the one of clip2. This is useful when you want to add two clips with slightly different framerate.
  • From v2.57, the behaviour with respect to the framerate is a bit changed. The main issue is that users are allowed to specify the framerate as float, but the NTSC (FILM and Video) and PAL standards require ratios as framerate. Besides this AviSynth exports the framerate as a ratio, so when specifying a float, it will be converted to a ratio. The ratios of the standards are given by 24000/1001 for 23.976 (FILM) and 30000/1001 for 29.97 (Video). When specifying these floats, they are exported by AviSynth as ratios, but not as the standard ratios. One of the reasons for this is, that those floats are approximations (remember that 24000/1001 = 23.9760239760...), so how should AviSynth know how to choose the correct ratio? In order to overcome this issue, the user can use AssumeFPS(24000,1001) or simply AssumeFPS("ntsc_film").
  • Another problem is that in v2.56 and older, the converted floats were exported with 64 bit precision, resulting in very large numerators and denominators, making some players crash. To overcome this, a smart float-ratio is added internally, and the framerates are approximated accurately by ratios of small numbers. For example, AssumeFPS(23.976) is converted to AssumeFPS(2997,125) as can be checked with Info.


AssumeScaledFPS

AssumeScaledFPS(clip [, int multiplier, int divisor, bool sync_audio])

Like AssumeFPS, scales the frame rate without changing the frame count (causing the video to play faster or slower), by directly scaling FrameRateNumerator and/or FrameRateDenominator.

  • Due to the way frame rates are stored, the scaled numerator/denominator fraction must be converted to the closest ratio of 32-bit signed integers,
eg, 33.3333 → 329833/9895 (33.3332996)
Parameters
clip1
Source clip
multiplier
clip1.FrameRateNumerator is multiplied by multiplier.
divisor
clip1.FrameRateDenominator is multiplied by divisor.
sync_audio
If true, the audio sample rate is changed by the same amount; the pitch of the resulting audio is shifted.
If false (the default), the audio is unchanged; this means the audio will lose synchronization over time.
History
  • Available from v2.56.


ChangeFPS

ChangeFPS(clip clip, float fps [, bool linear])
ChangeFPS(clip clip, int numerator [, int denominator, bool linear])
ChangeFPS(clip clip1, clip clip2, bool linear)
ChangeFPS(clip clip1, string preset [, bool linear])

Changes the frame rate by deleting or duplicating frames.

Parameters
clip1
Source clip
fps
If supplied, the new framerate is set to fps.
  • Due to the way frame rates are stored, fps must be converted to the closest ratio of 32-bit signed integers,
eg, 33.3333 → 329833/9895 (33.3332996)
numerator, denominator
If supplied, the new framerate is set to numerator divided by denominator. Denominator defaults to 1.
clip2
If supplied, the new framerate is taken from clip2.
preset
If supplied, the new framerate is taken from a set of standard rates, as listed under AssumeFPS.
linear
If true (the default), this will make AviSynth request frames in a linear fashion, when skipping frames.
Examples
  • PAL->NTSC conversion:
AviSource("PAL_clip.avi")              # Get clip
Bob(height=480)                        # Separate fields and interpolate them to full height.
BicubicResize(640,480)                 # Resize to NTSC square-pixel frame size.
ChangeFPS(60000, 1001)                 # Convert field rate to NTSC, by duplicating fields.
SeparateFields.SelectEvery(4,0,3)      # Undo Bob, even field first. Use SelectEvery(4,1,2) for odd field first.
Weave()                                # Finish undoing Bob.

The effect is similar to 3-2 telecine pull down. Regular viewers of PAL material may notice a motion stutter that viewers of NTSC material readily ignore as for telecined film.

History
  • Up to v2.05, the video gets truncated or filled up to preserve playback speed and play time (the number of frames was not changed). In later versions, the behaviour has been changed and the number of frames is increased or decreased as in ConvertFPS.
  • From v2.54, an option linear is added (see above).
  • From v2.56, if clip2 is present, the framerate of clip1 will be adjusted to match that of clip2.
  • From v2.57, the behaviour with respect to the framerate is a bit changed. See AssumeFPS.


ConvertFPS

ConvertFPS(clip clip, float new_rate [, int zone, int vbi])
ConvertFPS(clip clip, int numerator [, int denominator, int zone, int vbi])
ConvertFPS(clip clip1, clip clip2 [,int zone, int vbi])
ConvertFPS(clip clip1, string preset [, int zone, int vbi])

The filter attempts to convert the frame rate without dropping or inserting frames, providing a smooth conversion with results similar to those of standalone converter boxes. The output will have (almost) the same duration as clip, but the number of frames will change proportional to the ratio of target and source frame rates.

Frame rate conversion is inherently difficult. This filter implements two common methods used by commercial Prosumer-level converter systems. The results are typically quite good. More sophisticated systems employ motion interpolation algorithms, which are difficult to get right, but, if done right, do yield superior results.

Footage converted with this filter should not be converted again. Blurriness builds up quickly in subsequent generations.

The audio data are not touched by this filter. Audio will remain synchronized, although the length of the audio data may slightly differ from that of the video data after the conversion. This is because the output can only contain an integer number of frames. This effect will be more pronounced for shorter clips. The difference in length should be ignored.

Not all parameter values are checked for sanity.

Modes

The filter has two operating modes. If the optional argument zone is not present, it will blend adjacent video frames, weighted by a blend factor proportional to the frames' relative timing (Blend mode). If zone is present, it will switch from one video frame to the next (Switch mode) whenever a new source frame begins – usually somewhere in the middle of a target frame. Switch mode assumes that the output will be shown on a TV where each frame is scanned from top to bottom. The parameter zone specifies the height of the transition region in which the current frame will be blended into the next.

Blend mode will cause visible, although slight, blurring of motion. This is a typical artifact of frame rate conversion and can be seen on commercial video tapes and TV programs as well. When working with interlaced video, it is important to let the filter operate on individual fields, not on the interlaced frames. (see Examples below.)

Switch mode is an attempt to avoid motion blurring, but comes at the expense of slight flicker and motion artifacts. Horizontal and vertical pans may show a slight wobble. Still frames from this conversion show "broken" or "bent" vertical lines in moving scenes. Scene transitions may occur in the middle of a frame. Nevertheless, the results do look less blurry than in Blend mode.

Neither mode is perfect. Which one to choose depends on personal preference and on the footage to be converted. Switch mode is probably only suitable if the output will be shown on a TV, not on a computer screen.

Parameters
new_rate
Target frame rate. Can be integer or floating point number. In Blend mode, new_rate must be at least 2/3 (66.7%) of the source frame rate, or an error will occur. This is to prevent frame skipping. If you need to slow down the frame rate more than that, use Switch mode.
zone
If specified, puts the filter into Switch mode. Integer number greater or equal to zero. If zero, the filter will perform a hard switch, that is, it will immediately display the next frame below the switch line. If greater than zero, specifies the height (in lines) of the transition zone, where one frame is gradually blended into the next. zone=80 yields good results for full-size video (480/576 active lines). The transition is done in the same way as in PeculiarBlend(). zone must be less or equal than the number of lines of the target frame that correspond to the duration of the source frame. This is typically 5/6 or 6/5 of the target frame height, that is, a few hundred lines. An error occurs if a larger value is chosen.
vbi
If specified in Switch mode, specifies that the filter should apply a timing correction for the vertical blanking interval (VBI). Integer number greater than zero, indicating the height of the VBI of the target frames, in lines. Typically vbi=49 for PAL and vbi=45 for NTSC, but these values are not critical. Ignored in Blend mode.
Examples
  • NTSC->PAL conversion:
AVISource("NTSC_clip.avi")             # Get clip
Bob(height=576)                        # Separate fields and interpolate them to full height.
BicubicResize(768,576)                 # Resize to PAL square-pixel frame size.
ConvertFPS(50)                         # Convert field rate to PAL, using Blend mode.
SeparateFields.SelectEvery(4,0,3)      # Undo Bob, even field first. Use SelectEvery(4,1,2) for odd field first.
Weave()                                # Finish undoing Bob.

This example will also work with frame-based NTSC material, even with telecined film (movies). For film material, however, you will get better results by using an inverse-telecine filter and speeding up the frame rate from 23.976 to 25fps.

History

  • From v2.56, if clip2 is present, the framerate of clip1 will be adjusted to match that of clip2.
  • From v2.57, the behaviour with respect to the framerate is a bit changed. See AssumeFPS.


Changes

v2.57 added preset option; changed framerate behaviour; YV12 and RGB support for ConvertFPS, fixed blending ratio
v2.56 Added AssumeScaledFPS.
v2.56 Added clip2 option in ChangeFPS.
v2.55 Added clip2 option in AssumeFPS.
v2.54 Added linear=true/false to ChangeFPS.
Personal tools