Skip to main content

A super great audio/video source and FFmpeg wrapper

Project description

BestSource

build codespell

BestSource (abbreviated as BS) is a cross-platform wrapper library around FFmpeg that ensures always sample and frame accurate access to audio and video with good seeking performance for everything except some lossy audio formats.

It can be used as either a C++ library directly or through the combined VapourSynth and Avisynth+ plugin that's included.

Dependencies

  • FFmpeg 8.1.x and FFmpeg 8.0.x supported. Later releases may or may not work but FFmpeg API breakages are quite common and don't always generate compilation errors. Only libavcodec, libavformat, libavutil libraries are required.
  • xxHash
  • libp2p (already included as submodule)

Windows Compilation

On Windows the easiest way to compile the the dependencies is to use vcpkg to install ffmpeg[avcodec,avdevice,avfilter,avformat,swresample,swscale,zlib,bzip2,core,dav1d,gpl,version3,lzma,nvcodec,qsv,vulkan,openssl,xml2]:x64-windows-static and xxhash:x64-windows-static. Do however note that this is without Little CMS2 support. Use the latest version of Visual Studio. It should automatically find all the required libraries if you used vcpkg.

Linux and MacOS Compilation

Requires pkg-config, meson and ninja-build.

git clone https://github.com/vapoursynth/bestsource.git --depth 1 --recurse-submodules --shallow-submodules --remote-submodules
cd bestsource
meson setup build
meson compile -C build
meson install -C build

Known issues and limitations

  • Seeking performance in mpeg/ts/vob files can be quite poor due to the FFmpeg demuxer
  • Seeking and decoding performance for lossy audio formats (aac, mp3, dts, ac3, vorbis) can be poor
  • VC1 codec is unseekable due to FFmpeg not having bitexact output after seeking
  • The unholy combination of VFR H264 in AVI has poor seeking performance
  • Needs FFmpeg compiled with Little CMS2 or the color information reported for most image files will be less complete
  • Mod files can't be decoded correctly using libmodplug due to the library not having repeatable bitexact output
  • Gray+alpha format isn't supported in Avisynth+ and as a result only the Y component is returned
  • Files with dimensions that aren't a multiple of the subsampling value will be cropped

VapourSynth usage

bs.AudioSource(string source[, int track = -1, int adjustdelay = -1, int threads = 0, bint enable_drefs = False, bint use_absolute_path = False, float drc_scale = 0, int cachemode = 1, string cachepath, int cachesize = 100, bint showprogress = True, maxdecoders = 0])

bs.VideoSource(string source[, int track = -1, int variableformat = -1, int fpsnum = -1, int fpsden = 1, bint rff = False, int threads = 0, int seekpreroll = 20, bint enable_drefs = False, bint use_absolute_path = False, int cachemode = 1, string cachepath , int cachesize = 100, string hwdevice, int extrahwframes = 9, string timecodes, int start_number, int viewid = 0, bint showprogress = True, maxdecoders = 0, bool hwfallback = True, exporttimestamps = False])

bs.TrackInfo(string source[, bint enable_drefs = False, bint use_absolute_path = False])

bs.Metadata(string source[, int track, bint enable_drefs = False, bint use_absolute_path = False])

bs.SetDebugOutput(bint enable = False)

bs.SetFFmpegLogLevel(int level = <quiet log level>)

The TrackInfo function only returns the most basic information about a track which is the type, codec and disposition. Its main use is to be able to implement custom track selection logic for the source functions.

The Metadata function returns all the file or track metadata as key-value pairs depending on whether or not track is specified.

Avisynth+ usage

BSAudioSource(string source[, int track = -1, int adjustdelay = -1, int threads = 0, bool enable_drefs = False, bool use_absolute_path = False, float drc_scale = 0, int cachemode = 1, string cachepath, int cachesize = 100, int maxdecoders = 0])

BSVideoSource(string source[, int track = -1, int fpsnum = -1, int fpsden = 1, bool rff = False, int threads = 0, int seekpreroll = 20, bool enable_drefs = False, bool use_absolute_path = False, int cachemode = 1, string cachepath, int cachesize = 100, string hwdevice, int extrahwframes = 9, string timecodes, int start_number, int variableformat = 0, int viewid = 0, int maxdecoders = 0, bool hwfallback = True])

BSSource(string source[, int atrack = -1, int vtrack = -1, int fpsnum = -1, int fpsden = 1, bool rff = False, int threads = 0, int seekpreroll = 20, bool enable_drefs = False, bool use_absolute_path = False, int cachemode = 1, string cachepath, int acachesize = 100, int vcachesize = 100, string hwdevice, int extrahwframes = 9, string timecodes, int start_number, int variableformat = 0, int adjustdelay = -1, float drc_scale = 0, int viewid = 0, int maxdecoders = 0, bool hwfallback = True])

BSSetDebugOutput(bool enable = False)

BSSetFFmpegLogLevel(int level = <quiet log level>)

Note that the BSSource function by default will silently ignore errors when opening audio and in that case only return the video track. However if atrack is explicitly set failure to open the audio track will return an error.

Argument explanation

source: The source filename. Note that image sequences also can be opened by using %d or %03d for zero padded numbers. Sequences may start at any number between 0 and 4 unless otherwise specified with start_number. It's also possible to pass urls and other ffmpeg protocols like concat.

track: Either a positive number starting from 0 specifying the absolute track number or a negative number to select the nth audio or video track. Throws an error on wrong type or no matching track.

adjustdelay: Adjust audio start time relative to a video track number. Pass -2 to disable and -1 to be relative to the first video track if one exists. Specifying a non-video track is equivalent to passing -2. Note that the offset is always relative to the first CPU-decodable frame in the stream meaning that it may not be the correct delay when hwmode and variableformat are used.

variableformat: Allow format changes in the output for video. To only allow fixed format output pass 0 or greater to choose the nth encountered format as the output format. Any frames not matching the chosen format are dropped. If the file is constant format (most are) this setting does nothing.

fpsnum: Convert the source material to constant framerate. Cannot be combined with rff.

fpsden: Convert the source material to constant framerate. Used in conjunction with fpsnum.

rff: Apply RFF flags to the video. If the video doesn't have or use RFF flags the output is unchanged compare to when the option is disabled. Cannot be combined with fpsnum.

threads: Number of threads to use for decoding. Pass 0 to autodetect.

seekpreroll: Number of frames before the requested frame to cache when seeking.

enable_drefs: Option passed to the FFmpeg mov demuxer.

use_absolute_path: Option passed to the FFmpeg mov demuxer.

drc_scale: Apply dynamic range compression to ac3 audio. 0 = None and 1.0 = Normal.

cachemode:

0 = Never read or write index to disk
1 = Always try to read index but only write index to disk when it will make a noticeable difference on subsequent runs and store index files in a subtree of *cachepath*
2 = Always try to read and write index to disk and store index files in a subtree of *cachepath*
3 = Always try to read index but only write index to disk when it will make a noticeable difference on subsequent runs and store index files with *cachepath* used as the base filename with track number and index extension automatically appended 
4 = Always try to read and write index to disk and store index files with *cachepath* used as the base filename with track number and index extension automatically appended

cachepath: The path where cache files are written. Note that the actual index files are written into subdirectories using based on the source location. Defaults to %LOCALAPPDATA% on Windows and $XDG_CACHE_HOME/bsindex if set otherwise ~/bsindex on other operation systems in mode 1 and 2. For mode 3 and 4 it defaults to source.

cachesize: Maximum internal cache size in MB.

hwdevice: The interface to use for hardware decoding. Depends on OS and hardware. On windows d3d11va, cuda and vulkan (H264, HEVC and AV1) are probably the ones most likely to work. Defaults to CPU decoding. Will throw errors for formats where hardware decoding isn't possible.

extrahwframes: The number of additional frames to allocate when hwdevice is set. The number required is unknowable and found through trial and error. The default may be too high or too low. FFmpeg unfortunately is this badly designed.

timecodes: Writes a timecode v2 file with all frame times to the file if specified. Note that this option will produce an error if any frame has an unknown timestamp which would result in an invalid timecode file.

start_number: The first number of image sequences.

viewid: The view id to output, this is currently only used for some mv-hevc files and is quite rare.

showprogress: Print indexing progress as VapourSynth information level log messages.

maxdecoders: The maximum number of decoder instances kept around, defaults to 4 but when decoding high resolution content it may be beneficial to reduce it to 1 to reduce peak memory usage. For example 4k h264 material will use approximately 250MB of ram in addition to the specified cache size for decoder instance. Passing a number outside the 1-4 range will set it to the biggest number supported.

hwfallback: Automatically fall back to CPU decoding if hardware decoding can't be used for the current video track when hwdevice is set. Note that the fallback only happens when a hardware decoder is unavailable and not on any other category of error such as hwdevice having an invalid value.

exporttimestamps: Returns an additional array of all frame timestamps and its timebase in timebasenum and timebaseden containing all frame times addition to the video clip. Note that unknown timestamps can be set to AV_NOPTS_VALUE. Cannot be combined with rff and fpsnum modes.

level: The log level of the FFmpeg library. By default quiet. See FFmpeg documentation for allowed constants. Mostly useful for debugging purposes.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vapoursynth_bestsource-18.0.tar.gz (11.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

vapoursynth_bestsource-18.0-py3-none-win_amd64.whl (12.3 MB view details)

Uploaded Python 3Windows x86-64

vapoursynth_bestsource-18.0-py3-none-musllinux_1_2_x86_64.whl (14.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

vapoursynth_bestsource-18.0-py3-none-musllinux_1_2_aarch64.whl (13.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

vapoursynth_bestsource-18.0-py3-none-manylinux_2_28_x86_64.whl (13.5 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

vapoursynth_bestsource-18.0-py3-none-manylinux_2_28_aarch64.whl (12.1 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

vapoursynth_bestsource-18.0-py3-none-macosx_26_0_x86_64.whl (10.6 MB view details)

Uploaded Python 3macOS 26.0+ x86-64

vapoursynth_bestsource-18.0-py3-none-macosx_26_0_arm64.whl (8.9 MB view details)

Uploaded Python 3macOS 26.0+ ARM64

File details

Details for the file vapoursynth_bestsource-18.0.tar.gz.

File metadata

  • Download URL: vapoursynth_bestsource-18.0.tar.gz
  • Upload date:
  • Size: 11.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vapoursynth_bestsource-18.0.tar.gz
Algorithm Hash digest
SHA256 92d652cdddeb70de9ad14b64d71f30e865f06030921fa0e5a8bb46330c465a80
MD5 843317e51aed815d699e2a6be5767459
BLAKE2b-256 1c5255bcb4b231c334dc5c7a8435414e549da8869fa394ab822b6c052cfce393

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_bestsource-18.0.tar.gz:

Publisher: build.yml on vapoursynth/bestsource

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_bestsource-18.0-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for vapoursynth_bestsource-18.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 eca6d2ea94031201e2d9b2c9ec3b5b9586009ae42f2627363e7a27a71dc6a03a
MD5 6168864dd71cbc023183bd8129d06760
BLAKE2b-256 9024cd26d5342ea941c370d9e72a7f68e7749dc7946f1124c47d5b0bcbfb4903

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_bestsource-18.0-py3-none-win_amd64.whl:

Publisher: build.yml on vapoursynth/bestsource

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_bestsource-18.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for vapoursynth_bestsource-18.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3245498ad108da0f4815d29236d98cc26099f309dbae92b70a4033d95b71b155
MD5 e1c4d2ae20ef5a2b2c639c27ba5ba064
BLAKE2b-256 0fe487eb8f11e76aeafab4f960b94aa73a59e3971a16a3dde45e9137f2b5601f

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_bestsource-18.0-py3-none-musllinux_1_2_x86_64.whl:

Publisher: build.yml on vapoursynth/bestsource

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_bestsource-18.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for vapoursynth_bestsource-18.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 67f782b9e948fa4829e146de6a4102126350b38b97a163fb2c354d56fe5cd01b
MD5 e9195978861e0ba4edd327144a8eba79
BLAKE2b-256 c138dbbf428362da574753ba6c28e985b96d53b97f25bd885fabb77f126052bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_bestsource-18.0-py3-none-musllinux_1_2_aarch64.whl:

Publisher: build.yml on vapoursynth/bestsource

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_bestsource-18.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vapoursynth_bestsource-18.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c032c43d8e325b5ba75a0feb91af3e2867ef83f3adcd382ce8270a541f750ea3
MD5 78e7214989ca57f9b94a3a085e5179a0
BLAKE2b-256 e6a173823513adc02773ff7d2477e0d4130efd7340d21cc2905dbea3fe3a14a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_bestsource-18.0-py3-none-manylinux_2_28_x86_64.whl:

Publisher: build.yml on vapoursynth/bestsource

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_bestsource-18.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for vapoursynth_bestsource-18.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 94f6b605f0b86d9d74e3fcf6176dfa83be3d7323eaf324ccccfa609490f85b8c
MD5 2c73d957b84a946855639662c2866464
BLAKE2b-256 28a99ff6fcc36d995b1503d754af3c7e0a3bf43501049e08656ae9234188b502

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_bestsource-18.0-py3-none-manylinux_2_28_aarch64.whl:

Publisher: build.yml on vapoursynth/bestsource

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_bestsource-18.0-py3-none-macosx_26_0_x86_64.whl.

File metadata

File hashes

Hashes for vapoursynth_bestsource-18.0-py3-none-macosx_26_0_x86_64.whl
Algorithm Hash digest
SHA256 566f8284275b94520ceb7a71d63b7b105b658002d6acca77d3ddfbbe4080ff20
MD5 d5e7bc51b6189b21ed12da799cf3d21a
BLAKE2b-256 81bacb7fa8543e5955d14a5f3c79232d8c6624c9eaf9a2a62063f4a9fde898ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_bestsource-18.0-py3-none-macosx_26_0_x86_64.whl:

Publisher: build.yml on vapoursynth/bestsource

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vapoursynth_bestsource-18.0-py3-none-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for vapoursynth_bestsource-18.0-py3-none-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 2b3e318490e0de0fc070011c9cb2ce3370359f2620b9b82a2a282bf38d0eb14f
MD5 7b7e4eba4725934edc86f5be391bb2b6
BLAKE2b-256 c31e5658222f98c0d048dc72909bed05dae5a39e7601f9e416c0826e02b83452

See more details on using hashes here.

Provenance

The following attestation bundles were made for vapoursynth_bestsource-18.0-py3-none-macosx_26_0_arm64.whl:

Publisher: build.yml on vapoursynth/bestsource

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page