Vfr处理

来自NMM Doc
跳转至: 导航搜索

AviSynth, 可变帧速率(vfr)和混合视频(hybrid video)

根据帧速率可将视频分为两种类型,固定帧速率(CFR)的视频和可变帧速率(VFR)的视频.CFR视频帧速率为恒定值,VFR视频帧速率为非恒定值.因为AVI不支持VFR所以许多视频编辑程序(例如VirtualDub和AviSynth)都假设VFR视频的帧速率为恒定值.由于一系列的原因,这在不久的将来也是不会有改变的.虽然AVI容器不支持VFR,但有一些容器(例如MKV,MP4和WMV/ASF)支持VFR.

混合视频通常定义为一个混合着pulldown和non-pulldown(pulldown可以是场,标准的3:2 pulldown,或full frame)的视频.这与pulldown是否是hard(在回放时 场field/帧frame 重复)或soft(流stream中加入这标记表明在播放时哪些 场field/帧 frame是重复的)无关.所以,它可以是CFR或VFR.因此,混合视频是简单地混合着不同的帧速率(如通常用于动画的8,12和16fps)原始帧率base framerate是pulldow之前的速率的视频.这种视频需要根据内容决定最终的帧速率.

可变帧速率和混合视频


我们需要知道通常视频都是CFR的.但是混合视频转换成VFR是很常见的VFR的例子. 混合视频是混合着不同原始帧速率base framerate的视频 (如通常用于动画的8,12和16fps). 更常见的混合视频的例子是由部分隔行扫描interlaced/progressive NTSC (29.97 fps)和部分FILM (t通过胶卷过带将23.976 fps 转成29.97 fps)组成的视频. soft pulldown, NTSC的部分(也叫做视频video部分)回放速度是29.97 fps和添加重复帧胶卷过带telecined的部分(23.976 fps转换至29.97 fps). hard pulldown,没有增加任何场fields且回放速度是29.97. 另一个混合视频的例子是现代电视动画,科幻电视剧例如SG1,星级迷航,TNG和巴比伦5,和很多纪录片DVD.

TIVTC工具被设计出用来用于无损的处理混合视频,Decomb工具则用于通过合成来将视频处理成CFR.

如何分辨VFR视频(mkv/mp4)


这里有一些判断mkv/mp4是否是VFR的方法:

mpeg-2: DGIndex可以检查Film/Video的比例, 它可以告诉你有多少内容是soft pulldown的. 它不能处理hard pulldown, 它也不能准确的识别视频当视频中混合着soft pulldown和hard pulldown.

mkv: 用mkv2vfrmkvtoolnix取出timecodes.txt文件.

mp4: 用mp4dump(from the MPEG4 tools by MPEG4ip package). 打开命令行节目并输入(使用相对路径)

mp4dump -verbose=2 holly_xvid.mp4 > log.txt

打开log文件,你会看到类似下面的代码(看stts部分来找出每一帧的长度):

type stts
     version = 0 (0x00)
     flags = 0 (0x000000)
     entryCount = 41 (0x00000029)
      sampleCount = 3 (0x00000003)
      sampleDelta = 1000 (0x000003e8)
      sampleCount[1] = 1 (0x00000001)
      sampleDelta[1] = 2000 (0x000007d0)
      sampleCount[2] = 3 (0x00000003)
      sampleDelta[2] = 1000 (0x000003e8)
      sampleCount[3] = 1 (0x00000001)
      sampleDelta[3] = 2000 (0x000007d0)
      etc ...

sampleDelta显示帧frames的长度,sampleCount显示有多少帧frames. 根据上面的例子我们得到如下数据: 3帧frames显示长度1000 1帧frames显示长度2000 3帧frames显示长度1000 1帧frames显示长度2000 .......... 显示长度的值的单位不是秒而是滴答"ticks", 你可以通过时间表"timescale"来计算时间. 时间表"timescale"被存储在视频轨track里(确定你看的是正确的轨, 因为每个轨都有它自己的时间表timescale). 找这样的输出内容:

   type mdia
   type mdhd
   ...
   timeScale = 24976 (0x00006190)
   duration = 208000 (0x00032c80)
   language = 21956 (0x55c4)
   reserved = <2 bytes> 00 00

在本例中时间表timeScale是24976. 大多数帧frames的显示长度是1000. 1000/24976 = 0.04这意味着前3帧frames每一帧显示了0.04秒,与25 fps (1/25 = 0.04)是相同的. 下一个帧的显示长度是2000. 2000/24976 = 0.08这意味着这一帧显示了0.08秒, 与12.5 fps (1/12.5 = 0.08)是相同的. etc ... 从上面例子中的log文件可以看出这个视频是混合视频

在AviSynth中打开MPEG - 2混合视频并重新编码

假设你有混合视频,这里有列出几种方法对它进行编码.第一种方法是将它转换为cfr视频(23.976 fps或29.97 fps). 第二中方法是编码成120 fps的avi并且丢帧dropped frames (其中重复的帧null帧将被丢弃后播放). 第三中方法是使用mkv或mp4容器创建一个真正的vfr.

编码至CFR(23.976 fps或29.970 fps)


(翻译中) If we choose the video rate, the video sequences will be OK, but the FILM sequences will not be decimated, appearing slightly jumpy (due to the duplicated frames). On the other hand, if we choose the FILM rate, the FILM sequences will be OK, but the video sequences will be decimated, appearing jumpy (due to the "missing" frames). Additionally, when encoding to 29.97 fps, you will get lower quality for the same file size, because of the 25% greater number of frames. It's a tough decision which to choose. If the clip is mostly FILM you might choose 23.976 fps, and if the clip is mostly video you might choose 29.97 fps. The source also is a factor. If the majority of the video portions are fairly static "talking heads", for example, you might be able to decimate them to 23.976 fps without any obvious stutter on playback.

When you create your d2v project file you will see whether the clip is mostly video (NTSC) or FILM (in the information box). However, many of these hybrids are encoded entirely as NTSC, with the film portions being "hard telecined" (the already telecined extra fields having also been encoded) so you'll have to examine the source carefully to determine what you have, and how you wish to treat it.

The AviSynth plugins Decomb and TIVTC provide two special decimation modes to better handle hybrid clips by blending. This will eat bitrate quickly, but it appears very smooth. Here is a typical script to enable this mode of operation:

Telecide(order=0, guide=1)
Decimate(mode=X) # tweak "threshold" for film/video detection

or

TFM(mode=1)
TDecimate(mode=0,hybrid=X) # tweak "vidThresh" for film/video detection

There are 2 factors that enable Decimate to treat the film and nonfilm portions appropriately. First, when Telecide declares guide=1, it is able to pass information to Decimate about which frames are derived from film and which from video. For this mechanism to work, Decimate must immediately follow Telecide. Clearly, the better job you do with pattern locking in Telecide (by tweaking parameters as required), the better job Decimate can do.

The second factor is the threshold. If a cycle of frames is seen that does not have a duplicate, then the cycle is treated as video. The threshold determines what percentage of frame difference is considered to be a duplicate. Note that threshold=0 disables the second factor.

Make sure to get the field order correct - DVDs are generally order=1, and captured video is generally order=0. The included DecombTutorial?.html explains how to determine the field order.

Mostly Film Clips (mode=3)

When the clip is mostly film, we want to decimate the film portions normally so they will be smooth. For the nonfilm portions, we want to reduce their frame rate by blend decimating each cycle of frames from 5 frames to 4 frames. Video sequences so rendered appear smoother than when they are decimated as film. Set Decimate to mode=3, or TDecimate to hybrid=1 for this behavior.

Another IVTC was developed specifically to handle hybrid material without blended frames: SmartDecimate. While you do get "clean" frames as a result, it also may play with slightly more stutter than does Decomb's result. A typical script might go:

B = TDeint(mode=1) # or KernelBob(order=1)
SmartDecimate(24, 60, B)

In order to keep the result as smooth playing as possible, it will insert the "Smart Bobbed" frames from time to time.</p>

Mostly Video Clips (mode=1)

When the clip is mostly video, we want to avoid decimating the video portions in order to keep playback as smooth as possible. For the film portions, we want to leave them at the video rate but change the duplicated frames into frame blends so it is not so obvious. Set Decimate to mode=1, or TDecimate to hybrid=3 for this behavior.

In this case you may also consider leaving it interlaced and encoding as such, especially if you'll be watching on a TV later.

编码至cfr - 120 fps

你需要TIVTC和avi_tc. 首先创建 已经删帧decimate过的avi和timecodes.txt, 不要muxing. 然后打开tc-gui的tc2cfr标签并添加你的文件或这使用以下命令行 :

tc2cfr 120000/1001 c:\video.avi c:\timecodes.txt c:\video-120.avi

然后和你的音频一起mux. 它的工作原理是通过tc2cfr创建一个没有丢帧frames的avi并插入null帧来创建一个平滑的120fps avi.

編碼至VFR (mkv)

首先下載 mkvtoolnix. 我們將會用它將我們的視頻和時間碼(timecode)封裝入MKV容器. 請使用最新版本 (在翻譯本文時最新的版本為4.4.0), 某些舊版本無法正確處理timecode.

There are several AviSynth plugins that you can use to generate the VFR video and required timecode file. An example is given below using the Decomb521VFR plugin. Another alternative is the TDecimate plugin contained in the TIVTC package. See their respective documentations to learn more about tweaking them.

The DeDup plugin removes duplicate frames but does not change the framerate (leaving jerky video if not decimated first), so it won't be included. It can still be used after either method by using their timecodes as input to DeDup.

Decomb521VFR:

Add this to your script:

Decomb521VFR_Telecide(order=1, guide=0)
Decomb521VFR_Decimate(mode=4, threshold=1.0, progress=true, \
             timecodes="timecodes.txt", vfrstats="stats.txt")

Open this script in VirtualDub, it will create the timecodes and stats files, then encode. It will seem to freeze at first, because it examines every frame on the first load.

TIVTC:

This is a 2-pass mode. Add this to your script:

TFM(mode=1, output="tfm.txt")
TDecimate(mode=4, output="stats.txt")

Open this and play through it in VirtualDub. Then close it, comment those lines out (or start a second script) and add:

TFM(mode=1)
TDecimate(mode=5, hybrid=2, dupthresh=1.0, input="stats.txt", \
          tfmin="tfm.txt", mkvout="timecodes.txt")

Load and encode.

framerate:

If you're encoding to a specific size using a bitrate calculator, vfr decimation will mess up the calculations. To make them work again add these to your script:

Before decimation:

oldcount = framecount # this line must be before decimation
oldfps = framerate

End of script:

averagefps = (float(framecount)*float(oldfps))/float(oldcount)
AssumeFPS(averagefps)

封裝:

現在封裝成MKV:

  1. 打開mmg.exe (mkvmerge的圖形界面)
  2. 添加你的視頻流文件
  3. 添加你的音頻流文件
  4. 點擊已經導入的視頻流軌道
  5. 導入你的 "timecodes.txt" 時間碼文件timecode file
  6. 點擊你的音軌
  7. 如果你的音軌需要延遲delay,設置它
  8. 開始封裝

要播放它你需要Matroska分離器splitter. 播放AVC你需要Haali's分離器Splitter,播放ASP你可以用Gabest's分離器Splitter.

编码至vfr(mp4)

如果你创建了一个带null帧的120 fps avi视频 然而在你将它mux成mp4的时候,null帧将被删除. 更那啥的方法是转换多个cfr avi文件 (一些23.976 fps的film和一下29.97 fps的vide) 然后用mp4box和-cat 参数将他们打包成一个vfr mp4文件.

第三, 更简单的,方法是使用上面mkv的方法然后用tc2mp4处理视频:你可以在 Doom9 论坛找到更多有关tc2mp4的信息.

方法总结

总结上述方法的优点与缺点. 如果我们编码至23.976或29.97 fps的cfr(像AviSynth和Virtualdub需要的那样)将会使它可能在回放时看起来很怂=口=因为重复帧和丢失了帧. 我们可以通过blending来迴避它, 但是编码器不能很好的处理它. 如果编码至含有null帧的120 fps视频,它是cfr的,并且在回放时不会看起来很怂,也很适合编辑. 编码至使用timecdoes的真正的vfr MKV不损失也不重复帧,得不到想avi那样的广泛支持 I.

在Avisynth中打开非MPEG-2混合视频并重编码

在Avisynth中打开vfr视频并保持同步是可能的:DirectShowSource.大多数常见的格式都支持混合视频(vfr)例如mkv, mp4, wmv,和 rmvb,并且下列方法皆可用于它们;不过,如果源是mkv,你也可是使用 mkv2vfr 和AviSource.

在Avisynth中打开非avi vfr内容

最好的保持所以帧frames都同步和准确的方法是将其转换成恒定帧速率,例如24/30可以转换成120 (或者119.88). 不要忘记convertfps=true,它可以像ChangeFPS那样添加帧frames,或者你的音频将不同步.

DirectShowSource("F:\Hybrid\vfr.mp4", fps=119.88, convertfps=true)

你可以将它当作30P来打开但之后你要重删帧re-decimate,只要选一部分就行了,例如24P,损失30P的部分: 重编码至23.976fps或29.97 fps:

# fps=29.97 或 fps=23.976
DirectShowSource("F:\Hybrid\vfr.mkv", \
                 fps=29.97, convertfps=true)

或者

DirectShowSource("F:\Hybrid\vfr_startrek.mkv", \
                 fps=119.88, convertfps=true)
FDecimate(29.97) # or FDecimate(23.976)

另一种方法是找出平均帧速率framerate (用总帧数frames除以总长度的秒数)并在DirectShowSource中使用它. 根据帧frame的时间, 帧frames将被添加或删除来保持同步, 这种方法一定会卡卡=口=. DirectShowSource不会胶卷过带.

重编码120 fps视频

最简单的在Avisynth中将vfr源转换回vfr的方法是使用DeDup:

1st pass:

DupMC(log="stats.txt")

2nd pass:

DeDup(threshold=.1, maxcopies=4, maxdrops=4, dec=true, \
      log="stats.txt", times="timecodes.txt")

TIVTC 也可以做到:

1st pass:

TFM(mode=0,pp=0)
TDecimate(mode=4, output="stats.txt")

2nd pass:

TFM(mode=0,pp=0)
TDecimate(mode=6, hybrid=2, input="stats.txt", mkvout="timecodes.txt")

如果你编码了你的文件,用mkv或120fps avi来mux它.

这将删除所有重复的帧,同时保持总帧数framecount和时间几乎相同. 但是不要使用来自输入视频的timecode文件,使用新的,因为它们可能不相同. (如果你想使用dedup的更多功能,你可以尝试其他参数.)

通过Avisynth转换vfr至cfr

你可以通过专门的工具省略掉分析和删帧decimate的步骤直接得到一个最小恒定帧速率的avi来喂avisynth.经过处理和重新编码,使用tc2cfr或mmg输出并通过添加timecodes来还原vfr并完全同步,. (如果你执行了删帧decimate或改变帧速率,你就只能自己编辑timecode文件了, 虽然dedup有一个timesin参数.)

avi

avi_tc 如果avi没有使用丢帧drop frames和非n-vops或完全编码的帧frames.本工具将创建一个timecode和普通视频.它要求没有音频或第二个track. 要使用它, 打开tc-gui并且添加你的文件或者使用以下命令:

cfr2tc c:\video-120.avi c:\video.avi c:\timecodes.txt 1

mkv

mkv2vfr 从Matroska中提取所有视频帧frames转换成普通avi文件和timecode文件.只有在mkv是vfw-mode时才工作. 用以下命令行实现它:

mkv2vfr.exe input.mkv output.avi timecodes.txt

转换至MPEG-2 vfr 视频

http://forum.doom9.org/showthread.php?t=93691

本文段落作者还没有看贴, 所以这只是他的copy/paste.

音频同步

我们已经讨论过转换你手中视频的几个方法(23.976 fps, 29.97 fps的cfr视频或者vfr视频). 你可能想知道为什么不论你用的方法来编码你的视频你的音频总是保持同步. 在此之前的编码, 视频和音频拥有相同的长度, 所以他们始终同步. 你可能会遇到下面两种情况:

  • 你改变帧速率framerate使流stream变快或变慢(通常在PAL-FILM的转换中). 这意味着视频流的长度被改变了,因此音频流出现不同步.
  • 你通过增加和减少帧frames改变了帧速率framerate.这意外这视频的长度仍然相同, 因此音频流仍然同步.

如果你使用下列代码将23.976 fps的视频编码至29.97 fps(同为cfr)

Decimate(mode=3, threshold=1.0) 或
Decimate(mode=1, threshold=1.0)

帧frames将被删除或增加,因此你的音频流会保持同步. 因为我们可以推理得出vfr编码时也会同步.

最后, 假设你在Avisynth中通过DriectShowSource打开vfr视频. 比较下方

# fps=29.97 或 fps=23.976
DirectShowSource("F:\Hybrid\vfr_startrek.mkv", fps=29.97)

# fps=29.97 or fps=23.976
DirectShowSource("F:\Hybrid\vfr_startrek.mkv", fps=29.97, convertfps=true)

前者将因为24p提速而出现音频不同步, 而后者因为增加了帧frames所以音频仍然同步.

参考

原始出处avisynth VFR
必读: Force Film, IVTC, and Deinterlacing and more (doom9的好人们写的).
如何创建 120 fps video.
说明文档 Decomb521VFR.
关于 Decomb521VFR1.0 Matroska VFR自动处理模块.
Mkvextract GUI by DarkDudae.

Besides all people who contributed to the tools mentioned in this guide, the author of this tutorial (Wilbert) would like to thank bond, manono, tritical and foxyshadis for their useful suggestions and corrections of this tutorial.

翻译:btcdtc