FFmpegSource2
使用ffmpeg打開源文件,運氣好的能做到諸幀精確。原始碼依照MIT許可證發布,點擊 http://code.google.com/p/ffmpegsource/source/checkout 獲得原始碼。已編譯好的二進位文件按照GPLv3許可證發布。如果你是開源信仰者,你可以把這個當成是基督的歸來。
概 述 | |
作者 | FFmpegSource2項目 |
版本 | 310 |
下載地址 | FFmpegSource2項目 |
分類 | 源濾鏡 |
需求 | AviSynth 2.5 |
授權 | MIT協議 |
局限
- 打開ogm或mpeg文件需要用到Haali媒體分離器(HMS)。
- Haali分離器要求ts文件的分割點在一個數據包的邊界上。打開ts文件前可以用TsRemux修復一下。
- 因為用到了LAVF的分離功能,絕大多數的原始數據流沒有辦發正常打開,比如h264原始數據流和其他一些mpeg視頻流。
- FFAudioSource()需要重新索引由FFVideoSource()索引過的文件,因此像
AudioDub(FFVideoSource(X), FFAudioSource(X))
的腳本,需要索引兩次。這樣做倒沒什麼問題,只是多花了一些時間。用下面的方法可以避免索引兩次,一是先索引音頻
A = FFAudioSource(X) V = FFVideoSource(X) AudioDub(V, A)
或直接用FFIndex()
FFIndex(X) AudioDub(FFVideoSource(X), FFAudioSource(X))
已知問題
- 解碼ts封裝的h264文件時畫面可能會破損。
- FFIndex()在索引時會靜默的忽略解碼錯誤。也就是說即使FFIndex()索引完畢了,對於某條視頻軌或音頻軌的索引有可能已經失敗了。
兼容性
- AVI、MKV、MP4、FLV:準確跳轉
- WMV:準確跳轉(?),但是avformat似乎把關鍵幀定在了比較遠的地方
- OGM:準確跳轉(?)
- VOB、MPG:似乎有時會跳到指定幀前後的一到兩幀
- M2TS、TS:似乎有時會跳到指定幀前後的幾幀
- 圖片:絕大多數文件,可以設置seekmode=-1打開,但不支持動畫
FFMS2.dll里的函數
FFIndex (字符串 source, 字符串 cachefile = source + ".ffindex", 整數 indexmask = -1, 整數 dumpmask = 0, 字符串 audiofile = "%sourcefile%.%trackzn%.w64", 整數 errorhandling = 3, 布爾 overwrite = false)
用來索引的專門獨立函數,有一些額外的選項,還能把音頻軌以wave64格式存到硬碟里。能避免索引一個文件兩次,而且當音頻軌壞掉/不支持導致不能正常索引時也會有用。
FFVideoSource(字符串 source, 整數 track, 布爾 cache = true, 字符串 cachefile = source + ".ffindex", 整數 fpsnum = -1, 整數 fpsden = 1, 字符串 pp, 整數 threads = -1, 字符串 timecodes, 整數 seekmode = 1, 整數 rffmode = 0, 整數 width = -1, 整數 height = -1, 字符串 resizer = "BICUBIC", 字符串 colorspace = "")
打開視頻,如果沒有現成的索引,則索引所有的視頻軌。
FFAudioSource(字符串 source, 整數 track, 布爾 cache = true, 字符串 cachefile = source + ".ffindex", 整數 adjustdelay = -1)
打開音頻,如果沒有現成的索引或需要的音頻軌原先沒有被索引過時,則會去索引所有的音頻軌。
FFPP(clip, 字符串 pp)
獨立的後處理函數,其中包含了一些簡易的反交錯濾鏡。因為FFVideoSource可以直接讀出視頻的量化值,所以儘量在FFVideoSource中使用pp參數,這個後處理能更好地適應打開的視頻。
SWScale(clip, 整數 width = -1, 整數 height = -1, 字符串 resizer = "BICUBIC", 字符串 colorspace = "")
一個縮放/色彩空間轉換濾鏡,沒有什麼特別之處。這個濾鏡和AviSynth的做法不完全一樣,有時會有點用。
FFSetLogLevel(整數 Level = -8)
設置FFmpeg的日誌輸出等級,默認設置成靜默(-8),FFmpeg的默認等級是16。avutil/log.h文件里可以找到所有可設置的等級。
FFgetloglevel()
返回當前日誌記錄等級(整數)。
FFMS2.avsi里的函數
FFmpegSource2(字符串 source, 整數 vtrack = -1, 整數 atrack = -2, 布爾 cache = true, 字符串 cachefile = source + ".ffindex", 整數 fpsnum = -1, 整數 fpsden = 1, 字符串 pp, 整數 threads = -1, 字符串 timecodes, 整數 seekmode = 1, 布爾 overwrite = false, 整數 width = -1, 整數 height = -1, 字符串 resizer = "BICUBIC", 字符串 colorspace = "", 整數 rffmode = 0, 整數 adjustdelay = -1)
近似於1.x系列比較高版本的語法。atrack=-1可以方便同時載入視頻和音頻。注意如果沒有載入第一條視頻軌,而是其他的,可能需要自己調adjustdelay參數,指定合適的音頻軌的延遲。
FFImageSource(字符串 source, 整數 width = -1, 整數 height = -1, 字符串 resizer = "BICUBIC", 字符串 colorspace = "")
FFvideoSource的一種等價形式,選項都為讀取圖片優化過的。為了兼容性,關掉了緩存和seeking。
FFFormatTime(整數 ms)
一個輔助函數,把以毫秒記的時間轉換成h:mm:ss.ttt(字符串)
FFInfo(clip c, 布爾 framenum = true, 布爾 frametype = true, 布爾 cfrtime = true, 布爾 vfrtime = true)
一個輔助函數,顯示當前幀的一般信息。注意並不是所有的值都輸出成了原模式,所以不會每次都顯示所有的值。
函數參數
source:源文件
indexmask和dumpmask:索引哪條音頻軌/把哪條音頻軌寫入硬碟。解碼轉存一條音頻軌同時也做了索引,因為要乾的活一樣多。這個參數以二進位掩碼記,比如設為7對應操作1~3號軌道(1+2+4 = 7),並且會忽略非音頻軌。設為-1則把所有的音頻軌寫入硬碟。
audiofile:轉存音軌的文件名。請確保有變量軌道號,以防止多文件同時寫入產生的訪問錯誤。變量對大小寫敏感。變量如下:
- %sourcefile% - 和參數source相同,音頻軌從這個文件里解碼。
- %trackn% - 軌道號
- %trackzn% - 軌道號前面加個0,變成兩位數
- %samplerate% - 採樣率
- %channels% - 聲道數
- %bps% - 採樣深度
- %delay% - 延遲,準確地講是音軌所在的第一個時間戳
overwrite:即使索引已經存在,也重新索引一遍並覆蓋原索引。在改變過trackmask或測試時可能有用。
track:分離器中對應的軌道號,從0開始。-1則是第一個匹配的軌道,但有可能不是識別出的第一條未索引過得視頻/音頻軌道,而是之後的一條軌道。
fpsunm和fpsden:做VFR -> CFR用的,幀率的分子和分母。設fpsnum <= 0則是和源文件編碼的幀數相同。
timecodes:輸出的timecodes文件(tcv2)的文件名,如果存在就覆蓋掉。
cache:寫一個以後可能用得上的索引信息文件。設置這個參數會同時控制載入已存在的索引文件和寫入新的索引文件。
cachefile:寫入的cache信息的地址。
pp:完整信息請查看下面表格中的描述。留空則是不做後處理。建議儘量不要用根據q值自動處理的選項,因為現在處理的效果不明。
threads:設置解碼線程數,默認值是Windows提供的邏輯核心數。如果用到的解碼器沒有此功能,lavc也會無視掉這個參數。
seekmode:控制如何處理跳轉。對MKV文件和Haali分離器打開的文件無效,這些文件相當於自動設置seekmode = 1。
- -1:線性轉到而且不往回倒。如果每個這個請求的幀數比最後一個小,就會輸出一個警告。只用來打開圖片,但可能可以用在某些難得一見的視頻格式
- 0:線性到達,會比較慢,但可以「打開」更多格式
- 1:安全模式,基於已知的關鍵幀位置判斷跳轉
- 2:非安全模式,和模式1一樣,但是如果精確的目標位置要靠猜的,是不會跳出錯誤的
- 3:激進模式,如果沒有比較接近的關鍵幀,則向前跳轉。僅在測試和打開avformat無法正確返回關鍵幀位置的容器才有用
rffmode:控制如何處理視頻流中的RFF旗標。
- 0:忽略
- 1:按照旗標處理
- 2:等價於Force Film
注意當視頻流里根本沒有RFF旗標時還設rffmode的話,會跳出錯誤。當設置這個參數後,也會輸出CFR的視頻,並禁用垂直方向上的縮放和色彩空間的轉換。FFPICT_TYPE也無效,因為輸出的一些幀是組合起來的。除此之外還有一些其他細微的設置調整。
width和height:縮放到的寬度和高度。設成小於或等於0相當於指定輸入視頻的尺寸。
resizer:選擇對色度平面和普通縮放使用的縮放算法。可選擇的方法有:FAST_BILINEAR、BILINEAR、BICUBIC、X、POINT、AREA、BICUBLIN、GAUSS、SINC、LANCZOS和SPLINE。
colorspace:轉換到的色彩空間。名稱有YV12、YUY2、RGB24、RGB32。留空相當和輸入視頻的色彩空間一致。
errorhandling:控制當遇到音頻解碼錯誤是如何處理。
- 0:退出索引
- 1:清理掉遇到問題的音頻軌,然後繼續
- 2:停止索引此音頻軌,但索引過的內容保留
- 3:什麼都不管直接繼續解碼
adjustdelay:設置合適的音頻軌延遲。默認-1,絕大多數情況都會得到正確結果。
- -3:不調延遲
- -2:相對0時刻調整延遲
- -1:相對於第一條視頻軌調整延遲,如果沒有視頻軌,則相對於0時刻調整
輸出給的AviSynth變量
FFSAR_NUM、FFSAR_DEN、FFSAR:由容器指定的播放高寬比。FFSAR_NUM和FFSAR_DEN是組成比例的分子和分母,FFSAR則只是方便無法計算的情況而已。
FFCROP_LEFT、FFCROP_RIGHT、FFCROP_TOP和FFCROP_BOTTOM:容器指定的播放時切邊參數
FFCOLOR_SPACE:輸出的色彩範圍
- 0:未知/未指定
- 1:有限範圍
- 2:全範圍
FFPICT_COLOR:被請求的最接近幀的幀類型,輸出一個ascii數字,下面列出了所有對應情況。在AviSynth里用[Chr()|字符串函數]轉換成字符。AviSynth的條件運行腳本需要設after_frame = true才能得到正確結果。rffmode=0時才能用。 FFmpeg各字符原始定義:
- I:I幀
- P:P幀
- B:B幀
- i:SI幀
- p:SP幀
- b:FF_BI_TYPE (現在沒有合適的解釋)
- ?:未知
用法舉例:
ScriptClip("""subtitle(chr(FFPICT_TYPE))""",after_frame=true)
FFVFR_TIME:當前幀實際時間,以毫秒計。沒有做任何CFR轉換時才有用(即rffmode和fpsnum都保持默認)
PP字符串格式
後處理濾鏡:
濾鏡 | 選項 | |||
---|---|---|---|---|
簡稱 | 長名稱 | 簡稱 | 長選項 | 描述 |
* | * | a | autoq | 根據CPU能力選擇 |
c | chrom | 處理色度 | ||
y | nochrom | 不處理色 | ||
n | noluma | 不處理亮度 | ||
hb | hdeblock | (2個閾值) | 水平方向deblocking濾鏡 1.差異因子:默認32,調高相當於更強的deblocking 2.平滑度因子:默認39,調低相當於更強的deblocking 水平和垂直的deblocking濾鏡共用這兩個值,不能單獨設置 | |
vb | vdeblock | (2個閾值) | 垂直方向deblocking濾鏡 | |
ha | hadeblock | (2個閾值) | 水平方向deblocking濾鏡 | |
va | vadeblock | (2個閾值) | 垂直方向deblocking濾鏡 | |
h1 | x1hdeblock | 實驗性水平deblocking濾鏡 | ||
v1 | x1vdeblock | 實驗性垂直deblocking濾鏡 | ||
dr | dering | deringing濾鏡 | ||
al | autolevels | 自動調節亮度對比度 | ||
f | fullyrange | 把亮度拉伸到(0..255) | ||
lb | linblendeint | 線性Blend反交錯 | ||
li | linipoldeint | 線性插值反交錯 | ||
ci | cubicipoldeint | 三次方插值反交錯 | ||
md | mediandeint | 中值反交錯 | ||
fd | ffmpegdeint | ffmpeg反交錯 | ||
l5 | lowpass5 | FIR低通反交錯 | ||
de | default | hb:a,vb:a,dr:a | ||
fa | fast | h1:a,v1:a,dr:a | ||
ac | ha:a:128:7,va:a,dr:a | |||
tn | tmpnoise | (3個閾值) | 時間降噪 1. <= 2. <= 3. 數值大 -> 降噪效果強 | |
fq | forceQuant | <量化值> | 強制量化 |
用法:
<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...
長參數名示例:
vdeblock:autoq/hdeblock:autoq/linblenddeint default,-vdeblock
短參數名格式:
vb:a/hb:a/lb de,-vb
其他例子:
tn:64:128:256