# FFmpegSource

## Přehled

autor: Myrsloik
verze: 2.00 beta9
stáhnout: http://forum.doom9.org/showthread.php?t=127037, http://avisynth.org/warpenterprises/
kategorie: Audio video dekodéry (zdrojové) pluginy
požadavky: RGB24, RGB32, YUY2, YV12 Barevné prostředí
licence: GPL

## Úvod

Otvírá soubory použitím ffmpeg a ničeho jiného. V dobrých dnech může být přesný na snímek. Zdroj je pod MIT licencí a lze ho získat z http://svn.aegisub.net/trunk/aegisub/FFmpegSource2/. Předkompilovaný soubor je pod GPL licencí. Pokud jste zbožní, můžete toto považovat za druhý příchod.

## Známé problémy

- FFAudioSource() znovu vytvoří jakýkoli index implicitně vytvořený v FFVideoSource() a proto zápis jako

      AudioDub(FFVideoSource(X), FFAudioSource(X))

  bude vyžadovat dva indexační průchody. Kromě spotřebovaného času je to neškodné. Aby jste to obešli, otevřete nejdříve audio

      A = FFAudioSource(X)
      V = FFVideoSource(X)
      AudioDub(V, A)

  nebo použijte FFIndex().

      FFIndex(X)
      AudioDub(FFVideoSource(X), FFAudioSource(X))

- FFIndex() bude tiše ignorovat fatální chyby dekódování při indexování. To znamená, že indexování dané stopy může selhat dokonce i když FFIndex() uspěje.
- Vyžaduje Haali's Media Splitter pokud je otvíráno ogm nebo mpeg ps/ts .
- Avi soubory s NVOPy (občas se vyskytují v xvid a podobných) desynchronizuje, když se s těmito snímky setkáte. Remuxujte do mkv/mp4 před otevřením , aby jste to prozatím vyřešili.
- Stále jsou některé problémy s FFAudioSource ale mělo by to být dostatečně dobré pro skutečné použití v mnoha případech.

## Kompatibilita - Video

- AVI, MKV, MP4, FLV: Snímková přesnost (Frame accurate)
- WMV: Snímková přesnost(?) ale avformat se zdá, že vybírá klíčové snímky relativně daleko
- OGM: Snímková přesnost(?)
- VOB: Nepoužité žádné rff znaky (flags)
- MPG: Vyhledávání (seeking) se zdá být vypnuto na jeden nebo dva snímky teď a poté
- M2TS, TS: Vyhledávání (seeking) se zdá být vypnuto na několik snímků zde a tam
- Obrázkové soubory: Většina formátů může být otevřena pokud je nastaveno seekmode=-1 , žádná podpora animace

## Kompatibilita - Audio

- Všechny formáty jsou zapsány do oddělených wave64 souborů
- Žádný nástroj pro čtení wave64 se neposkytuje

## Použití

FFIndex(string source, string cachefile = source + ".ffindex", int indexmask = -1, int dumpmask = 0, string audiofile = source, bool overwrite = false)
Použito pro vyvolání indexování odděleně a k zápisu audio stop na disk jako wave64 soubory.

FFVideoSource(string source, int track, bool cache = true, string cachefile = source + ".ffindex", int fpsnum = -1, int fpsden = 1, string pp, int threads = -1, string timecodes, int seekmode = 1)
Otvírá video, vyvolá indexování s výchozími hodnotami, pokud není nalezen existující index.

FFAudioSource(string source, int track, bool cache = true, string cachefile = source + ".ffindex")
Otvírá audio, pokud už index existuje, potřebuje obsahovat vhodný audio index nebo je vráceno prázdné audio, vyvolá indexování s výchozími hodnotami, pokud není nalezen existující index.

FFPP(clip, string pp)
Oddělený postprocessing (dodatečné zpracování), který jak se zdá, obsahuje několik jednoduchých odstraňovačů prokládání (deinterlacerů).

SWScale(clip, width = -1, height = -1, resizer = "BICUBIC", colorspace = "")
Oddělený postprocessing (dodatečné zpracování), který jak se zdá, obsahuje několik jednoduchých odstraňovačů prokládání (deinterlacerů).

FFSetLogLevel(int Level)
Nastavuje log FFmpeg logovací úroveň, výchozí pro quiet (-8) a FFmpeg výchozí je 16, všechny různé hodnoty lze najít v avutil/log.h FFGetLogLevel()
Vrací aktuální úroveň logování jako celé číslo (int).

source: Zdrojový soubor.

indexmask & dumpmask: Které audio stopy indexovat/zapsat na disk. Dumping stopy také naznačuje indexování, protože stejná práce musí být ostatně udělána. Je to binární maska znamenající, že 7 odpovídá zapsání stop 1-3. Stopy bez audia jsou ignorovány. -1 zapíše všechny stopy.

audiofile: Základní jméno pro dekódované audio. Jsou připojeny číslo stopy a zpoždění.

overwrite: Vynutí přeindexování dokonce i když už existuje platný index. Může být užitečné pro změny trackmask nebo testování.

track: Číslo stopy jak je viděno relevantním demuxerem, začíná od 0, -1 znamená, že vybere první vhodnou stopu.

fpsnum & fpsden: Pro VFR -> CFR převod. Nastavení fpsnum <= 0 znamená poměr 1:1 s enkódovanými snímky.

timecodes: Soubor pro vysílání timecodes, pokud soubor existuje bude přepsán.

cache: Zapisuje indexovací informaci do souboru pro pozdější použití. Toto nastavení neovládá jestli je video index načten, což je vždy pokud existuje.

cachefile Kam zapsat cache informaci.

pp: Podívejte se do tabulky níže na úplný popis, prázdný řetězec znamená žádné zpracování. Doporučuje se vyhnout se možnosti autoq, protože v současnosti není známé jaký vliv bude mít na zpracování.

threads: Nastavuje počet použitých vláken dekodéru. Vychází se z počtu cpu oznámených windows. Ignorován v lavc, pokud to použitý dekodér neimplementuje.

seekmode: Vynutí jaké vyhledávání (seekování) je prováděno, nemá vliv na matroska soubory, které vždy používají ekvivalent k seekmode=1
-1: lineární přístup bez rewind, vyhodí chybu pokud každé následně žádané číslo snímku není větší než poslední, určeno jen pro otvírání obrázků, ale měl by pracovat dobře s některými obskurními formáty videa
0: lineární přístup, definice pomalosti, ale měl by udělat některé formáty "použitelné"
1: bezpečný normální, základna rozhodování vyhledávání v oznámených pozicích klíčových snímků
2: riskantní normální, stejný jako 1 , ale nevyhodí žádnou chybu, když musí být hádáno přesné umístění
3: agresivní, vyhledává směrem vpřed dokonce i když není známo, že existuje blízký klíčový snímek, užitečné jen pro testování a konteinery, kde avformat neoznamuje správně klíčové snímky.

width & height: Šířka a výška na které se má změnit velikost. Hodnota menší nebo rovná 0 je stejná jako zadání vstupních rozměrů.

resizer: Vybírá resizer (měnič velikosti) použitý pro převzorkování barevnostních ploch a normální změnu velikosti. Dostupné metody jsou: FAST_BILINEAR, BILINEAR, BICUBIC, X, POINT, AREA, BICUBLIN, GAUSS, SINC, LANCZOS a SPLINE.

colorspace: Barevné prostředí, do kterého se má převést. Jména jsou YV12, YUY2, RGB24, RGB32 a prázdný řetězec pro stejné jako vstupní.

## Exportované proměnné Avisynthu

FFSAR_NUM, FFSAR_DEN, FFSAR: Poměr stran (aspect ratio) přehrávání zadaný kontejnerem. FFSAR_NUM a FFSAR_DEN vytvoří racionální číslo poměru a FFSAR je poskytnuto jen pro případ potřeby.

FFCROP_LEFT, FFCROP_RIGHT, FFCROP_TOP, FFCROP_BOTTOM: Oříznutí při přehrávání zadané kontejnerem.

FFPICT_TYPE: Typ obrazu posledně žádaného snímku. Použijte after_frame=true v podmíněném skriptování Avisynthu pro správné výsledky. FFmpeg source definice čísel:

    FF_I_TYPE  1 ///< Intra
    FF_P_TYPE  2 ///< Predicted
    FF_B_TYPE  3 ///< Bi-dir predicted
    FF_S_TYPE  4 ///< S(GMC)-VOP MPEG4
    FF_SI_TYPE 5 ///< Switching Intra
    FF_SP_TYPE 6 ///< Switching Predicted
    FF_BI_TYPE 7

## PP string (řetězcový) formát

    Dostupné postprocesingové filtry:
    Filtry                        Možnosti
    krátké dlouhé jméno   krátká  dlouhá možnost   Popis
    *      *               a       autoq           CPU power dependent enabler
                           c       chrom           chrominance filtering enabled
                           y       nochrom         chrominance filtering disabled
                           n       noluma          luma filtering disabled
    hb     hdeblock        (2 threshold)           horizontal deblocking filter
           1. difference factor: default=32, higher -> more deblocking
           2. flatness threshold: default=39, lower -> more deblocking
                           the h & v deblocking filters share these
                           so you can't set different thresholds for h / v
    vb     vdeblock        (2 threshold)           vertical deblocking filter
    ha     hadeblock       (2 threshold)           horizontal deblocking filter
    va     vadeblock       (2 threshold)           vertical deblocking filter
    h1     x1hdeblock                              experimental h deblock filter 1
    v1     x1vdeblock                              experimental v deblock filter 1
    dr     dering                                  deringing filter
    al     autolevels                              automatic brightness / contrast
                           f        fullyrange     stretch luminance to (0..255)
    lb     linblenddeint                           linear blend deinterlacer
    li     linipoldeint                            linear interpolating deinterlace
    ci     cubicipoldeint                          cubic interpolating deinterlacer
    md     mediandeint                             median deinterlacer
    fd     ffmpegdeint                             ffmpeg deinterlacer
    l5     lowpass5                                FIR lowpass deinterlacer
    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 threshold)           temporal noise reducer
                         1. <= 2. <= 3.            larger -> stronger filtering
    fq     forceQuant                   force quantizer

Použití:

    [:[:...]][[,|/][-][:...]]...
    příklad dlouhé formy:
    vdeblock:autoq/hdeblock:autoq/linblenddeint    default,-vdeblock
    příklad krátké formy:
    vb:a/hb:a/lb                                   de,-vb
    více příkladů:
    tn:64:128:256

## Kompilování

zlib z http://www.zlib.net/

FFmpeg svn z http://ffmpeg.mplayerhq.hu/

pthreads vyžadováno jen pro FFmpeg-mt compiles

Vyžadovaná FFmpeg Konfigurace: ./configure --enable-memalign-hack --enable-gpl --enable-postproc

Navrhované doplňkové možnosti: --enable-w32threads --disable-encoders --disable-muxers --disable-network --disable-debug --enable-libfaad --disable-decoder=aac

Všimněte si, že --enable-w32threads nebo --enable-pthreads je vyžadováno pro práci multithreaded dekódování. Pro FFmpeg-mt bude pracovat jen --enable-pthreads.

## Změny

- 2.00 beta 9
  - Dumping audio now actually implies indexing too in FFIndex, previously nothing would be done if the index mask wasn't set as well
  - FFAudioSource will now first load the index and returns the first indexed audio track with track=-1, if no audio tracks are indexed or the chosen track isn't indexed the equivalent of FFIndex(indexmask = -1, overwrite = cache) is executed first
  - Codec lookup for non-lavf opened files now to a large part use the same lookup tables as lavf, this should improve the number of properly recognized codecs
  - Now uses the average framerate for files opened with Haali's splitters, before it was always reported as 30 fps
  - Implemented audio decoding using Haali's splitters, FFAudioSource now works on ts, ps and ogm
  - Can now be compiled with ICL 10.1 (probably other versions too)
  - How indexing works has been split internally so the track numbers and types are reported, this makes it possible to create an interactive GUI or ask which audio tracks are to be indexed
  - Now has stricter index checking to detect when different FFmpeg versions were used to create an index of the same version
  - Fixed memory leaks when audio sources were destroyed and when errors happened during indexing
  - Fixed access violations occurring when a track of the wrong type was specified or didn't exist in FFVideoSource and FFAudioSource
  - Fixed access violations occurring when unindexed or empty audio tracks in matroska/lavf read files were opened
  - Less type conversion/signedness warnings
  - When audio track dumping is performed a custom callback can now be supplied to name the tracks
  - The audio track delay is now exposed in the API in the same way as video tracks
  - A big type and argument name cleanup in the API, many things have been renamed to be clearer and ffms.h should be completely C friendly now
  - Removed FFNoLog and replaced it with FFSetLogLevel and FFGetLogLevel, the default logging is now also set to quiet, the magical numbers to supply it can be found in avutil/log.h
  - Updated FFmpeg to rev 18972 (now with faad2 again by popular demand, updated to GCC 4.4.0 for compiling all libraries)
- 2.00 beta 8
  - Improved the audio decoding quality a lot by adding a simple cache, no more seeking is done when playing a file linearly and pops and other artifacts should be much more uncommon
  - Fixed a bug that would most of the time drop frame 0 and sometimes frame 1
  - Updated Haali's matroska parser code to the latest version
  - Updated FFmpeg to rev 18774
- 2.00 beta 7
  - Using ffms2 as a library no longer requires an installed pixfmt.h from libavutil, it is however still required to compile ffms2 and the avisynth plugin part
  - Fix a crash bug at the end of files with b-frames in beta 6 caused by uninitialized null packets
  - Includes TheFluff's wrapper function for 1.21 style syntax
  - Added a simple regression test application to the source
  - Removed a few pointless functions from the API
  - Fixed the accessing of codecprivate data with Haali's splitters
  - Timecode output should be fixed to include decimals AND not be in scientific format
  - Fixed a memory leak when using Haali's splitters
  - Updated FFmpeg to rev 18717
- 2.00 beta 6
  - Haali's splitters have been improved for video and now have audio dumping during indexing implemented
  - SeekMode=1 has improved logic which will make it go back and decode more frames if necessary to figure out where it is, in theory SeekMode=0 should now be mostly obsolete
  - Haali's splitters are now used to open mpeg ps and ogm in addition to mpeg ts, only ogm is frame accurate at this time
  - Negative timecodes and other bugs caused by an integer overflow fixed
  - Updated FFmpeg to rev 18442 (once again compilation fixes for the changes)
- 2.00 beta 5
  - FFMSIndex should now print the progress properly when another application reads its output
  - Added missing variables and explanations to the manual
  - Can now directly be compiled as a library for use in *nix
  - Fixed the missing decimals in saved timecode files
- 2.00 beta 4
  - Added the function FFNoLog which suppresses all messages from ffmpeg
  - Experimental new TS parsing using Haali's splitter (with bugs)
  - Everything is now compiled with VS2008 and GCC 4.3.2
  - Updated FFmpeg to rev 16383 (no libfaad2 this time)
- 2.00 beta 3
  - Compiled with libfaad2 again (has anyone seen a single aac file lavc can open right now?)
  - More API changes (and even more are likely to come)
  - Several access violations and memory leaks on opening and indexing files fixed
  - Added a VFR to CFR mode
  - Readded FFAudioSource support for other containers (glitches still present now and then but no separate raw cache is required and possibly less buggy)
  - Renamed the dll to FFMS2.dll, FFMS2 is now the official short name of the project
  - Updated FFmpeg to rev 15522
- 2.00 beta 2
  - More API changes (and more are likely to come)
  - Includes a simple CLI indexing application
  - FFIndex now takes a few more arguments
  - Readded FFAudioSource (only matroska supported for now)
  - Updated FFmpeg to rev 15396
- 2.00 beta 1
  - Can now be used as a stand alone library for making indices and retrieving frames
  - Rewrote most things
  - Updated FFmpeg to rev 15301

`Český překlad:3.7.2009`