Python package for Near Duplicate Video Detection (Perceptual Video Hashing) - Get a 64-bit comparable hash-value for any video.

Overview

The Python package for near duplicate video detection

Build Status Build Status Build Status codecov Total alerts Language grade: Python pypi Downloads GitHub lastest commit PyPI - Python Version


⭐️ Introduction

Videohash is a Python package for detecting near-duplicate videos (Perceptual Video Hashing). It can take any input video and generate a 64-bit equivalent hash value. Videohash is way more faster than comparing the imagehash values of individual frames of the video and more reliable than hashing keyframes.

The video-hash-values for identical or near-duplicate videos are the same or similar, implying that if the video is resized (upscaled/downscaled), transcoded, watermark added/removed, stabilized, color changed, frame rate changed, changed aspect ratio, cropped, black-bars added or removed, the hash-value should remain unchanged or not vary substantially.

How the hash values are calculated

  • In layman's terms : Every one second, a frame from the input video is extracted, the frames are shrunk to a 144x144 pixel square, a collage is constructed that contains all of the resized frames(square-shaped), the collage's wavelet hash is the video hash value for the original input video.

When not to use Videohash

  • Videohash cannot be used to verify whether one video is a part of another (video fingerprinting). If the video is reversed or rotated by a substantial angle (greater than 10 degrees), Videohash will not provide the same or similar hash result, but you can always reverse the video manually and generate the hash value for reversed video.

How to compare the video hash values stored in a database


🏗 Installation

To use this software, you must have FFmpeg installed. Please read how to install FFmpeg if you don't already know how.

Install videohash

Upgrade pip

python3 -m pip install --upgrade pip

If you do not want to upgrade pip and the installation fails try appending --prefer-binary to the following installation command(s).

  • Install from the PyPi (recommended):
pip install videohash
  • Install directly from the GitHub repository (NOT recommended):
pip install git+https://github.com/akamhy/videohash.git

🌱 Features

  • It is fast!
  • Generate videohash of a video directly from its URL(uses yt-dlp) or its path.
  • Can be used as the core of a scalable Near Duplicate Video Retrieval (NDVR) system.
  • The end-user can access the image representation(the collage) of the video.
  • A videohash instance can be compared to a 64-bit stored hash, its hex representation, bitlist, and other videohash instances.

🚀 Usage

In the following usage example the first three instance of VideoHash class are computing the hash for the same video(not same as in checksum) and the last one is a different video.

>> videohash1 = VideoHash(url=url1) >>> >>> videohash1.hash # video hash value of the file, value is same as str(videohash1) '0b0011010000011111111011111111111110001111011110000000000000000000' >>> >>> #VIDEO:Artemis I Hot Fire Test >>> url2="https://raw.githubusercontent.com/akamhy/videohash/main/assets/rocket.mkv" >>> videohash2 = VideoHash(url=url2) >>> videohash2.hash '0b0011010000011111111011111111111110001111011110000000000000000000' >>> videohash2.hash_hex '0x341fefff8f780000' >>> videohash2.hash_hex '0x341fefff8f780000' >>> videohash1 - videohash2 0 >>> videohash1 == videohash2 True >>> videohash1 == "0b0011010000011111111011111111111110001111011110000000000000000000" True >>> videohash1 != videohash2 False >>> path3 = "/home/akamhy/Downloads/rocket.mkv" #VIDEO: Artemis I Hot Fire Test >>> videohash3 = VideoHash(path=path3) >>> videohash3.hash '0b0011010000011111111011111111111110001111011110000000000000000000' >>> videohash3 - videohash2 0 >>> videohash3 == videohash1 True >>> url4 = "https://www.youtube.com/watch?v=_T8cn2J13-4" #VIDEO: How We Are Going to the Moon >>> videohash4 = VideoHash(url=url4) >>> videohash4.hash_hex '0x7cffff000000eff0' >>> videohash4 - "0x7cffff000000eff0" 0 >>> videohash4.hash '0b0111110011111111111111110000000000000000000000001110111111110000' >>> videohash4 - videohash2 34 >>> videohash4 != videohash2 True">
>>> from videohash import VideoHash
>>> # video: Artemis I Hot Fire Test
>>> url1 = "https://www.youtube.com/watch?v=PapBjpzRhnA"
>>> videohash1 = VideoHash(url=url1)
>>>
>>> videohash1.hash # video hash value of the file, value is same as str(videohash1)
'0b0011010000011111111011111111111110001111011110000000000000000000'
>>>
>>> #VIDEO:Artemis I Hot Fire Test
>>> url2="https://raw.githubusercontent.com/akamhy/videohash/main/assets/rocket.mkv"
>>> videohash2 = VideoHash(url=url2)
>>> videohash2.hash
'0b0011010000011111111011111111111110001111011110000000000000000000'
>>> videohash2.hash_hex
'0x341fefff8f780000'
>>> videohash2.hash_hex
'0x341fefff8f780000'
>>> videohash1 - videohash2
0
>>> videohash1 == videohash2
True
>>> videohash1 == "0b0011010000011111111011111111111110001111011110000000000000000000"
True
>>> videohash1 != videohash2
False
>>> path3 = "/home/akamhy/Downloads/rocket.mkv" #VIDEO: Artemis I Hot Fire Test
>>> videohash3 = VideoHash(path=path3)
>>> videohash3.hash
'0b0011010000011111111011111111111110001111011110000000000000000000'
>>> videohash3 - videohash2
0
>>> videohash3 == videohash1
True
>>> url4 = "https://www.youtube.com/watch?v=_T8cn2J13-4" #VIDEO: How We Are Going to the Moon
>>> videohash4 = VideoHash(url=url4)
>>> videohash4.hash_hex
'0x7cffff000000eff0'
>>> videohash4 - "0x7cffff000000eff0"
0
>>> videohash4.hash
'0b0111110011111111111111110000000000000000000000001110111111110000'
>>> videohash4 - videohash2
34
>>> videohash4 != videohash2
True

Run the above code @ https://replit.com/@akamhy/videohash-usage-2xx-example-code-for-video-hashing#main.py

Extended Usage : https://github.com/akamhy/videohash/wiki/Extended-Usage

API Reference : https://github.com/akamhy/videohash/wiki/API-Reference


🙏 Credits


🛡 License

License: MIT

Copyright (c) 2021 Akash Mahanty. See license for details.

The VideoHash logo was created by iconolocode. See license for details.

Videos are from NASA and are in the public domain.

NASA copyright policy states that "NASA material is not protected by copyright unless noted".

Comments
  • assets host issue

    assets host issue

    https://user-images.githubusercontent.com/64683866/148959826-9b83c1ad-f9ef-4054-83df-d420ca318de6.mp4

    Translation of the Hindi langauge written in Latin alphabet/Roman alphabet into English is: The third wave of covid-19 is here Again* I will pass the tests without studying**.

    * (exams were canceled in the past year) ** (because of online tests and cheating)

    opened by akamhy 9
  • Design a vector(SVG) logo for this project

    Design a vector(SVG) logo for this project

    Please design a vector logo for this project. The logo must contain the project name 'videohash'.

    You must release the logo under the MIT License(same license as the project).

    I want the output in SVG and PNG formats. The logo must be transparent(the background) and should be professional.

    Examples of logos of some real projects that I like. The new logo can be of a similar design but MUST NOT be exactly copied.

    • https://commons.wikimedia.org/wiki/File:OpenCV_Logo_with_text_svg_version.svg
    • https://commons.wikimedia.org/wiki/File:TensorFlowLogo.svg
    • https://commons.wikimedia.org/wiki/File:NumPy_logo_2020.svg

    Both the PNG and SVG formats should be inside the assets directory in the pull request. This issue is not gonna get assigned before you open a pull request but the one I like the most is gonna be selected. Please open a pull request only if you are good at making vector logos. Thank you!

    hacktoberfest 
    opened by akamhy 8
  • BUG REPORT - MAKE  the -f worst optional

    BUG REPORT - MAKE the -f worst optional

    Describe the bug The download fails on reddit.

    To Reproduce less than or equal to v2.1.7

    Python 3.9.0 (default, Oct 21 2021, 15:27:22) 
    [GCC 10.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> url1 = "https://www.reddit.com/r/IndianDankMemes/comments/rn2yxa/ha_bhai_normi_hu_mai/"
    >>> from videohash import VideoHash
    >>> url1 = "https://www.reddit.com/r/IndianDankMemes/comments/rn2yxa/ha_bhai_normi_hu_mai/"
    >>> url2 = "https://www.reddit.com/r/IndianDankMemes/comments/rmw1o9/i_am_happy_i_am_happy_i_am_happi_today/"
    >>> videohash1 = VideoHash(url=url1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/akamhy/projects/benchmark_videohash/venv/lib/python3.9/site-packages/videohash/videohash.py", line 85, in __init__
        self._copy_video_to_video_dir()
      File "/home/akamhy/projects/benchmark_videohash/venv/lib/python3.9/site-packages/videohash/videohash.py", line 288, in _copy_video_to_video_dir
        Download(
      File "/home/akamhy/projects/benchmark_videohash/venv/lib/python3.9/site-packages/videohash/downloader.py", line 51, in __init__
        self.download_video()
      File "/home/akamhy/projects/benchmark_videohash/venv/lib/python3.9/site-packages/videohash/downloader.py", line 85, in download_video
        raise DownloadFailed(
    videohash.exceptions.DownloadFailed: '/home/akamhy/projects/benchmark_videohash/venv/bin/yt-dlp' failed to download the video at 'https://www.reddit.com/r/IndianDankMemes/comments/rn2yxa/ha_bhai_normi_hu_mai/'.
    [Reddit] rn2yxa: Downloading JSON metadata
    [Reddit] rn2yxa: Downloading m3u8 information
    [Reddit] rn2yxa: Downloading MPD manifest
    
    ERROR: [Reddit] k4nqp99cdc781: Requested format is not available
    
    >>> videohash1 = VideoHash(url=url1, download_worst=False)
    >>> videohash2 = VideoHash(url=url2, download_worst=False)
    >>> videohash1 - videohash2
    4
    >>> 
    
    

    Expected behavior Download the video without any extra arguments.

    Please complete the following information:

    • Operating system: NA
    • Python Version: NA
    • VideoHash version: NA

    Additional context I don't use Reddit but a friend of mine was using videohash to search posts by templates. Both the URLs use the same template.

    • https://www.reddit.com/r/IndianDankMemes/comments/rn2yxa/ha_bhai_normi_hu_mai/
    • https://www.reddit.com/r/IndianDankMemes/comments/rmw1o9/i_am_happy_i_am_happy_i_am_happi_today/
    bug 
    opened by akamhy 5
  • Write FFmpeg installer for windows in Python 3 (should try if you are good at writing installer for windows)

    Write FFmpeg installer for windows in Python 3 (should try if you are good at writing installer for windows)

    If you are good at Python please write a script that would download the latest FFmpeg from https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z

    Uncompress the archive.

    Copy the bin directory from the decompressed folder, and paste inside C:\Program Files\ffmpeg.

    Add C:\Program Files\ffmpeg\bin\ to the Environment Variables.

    See https://github.com/akamhy/videohash/wiki/Install-FFmpeg,-but-how%3F#install-ffmpeg-on-windows.

    I've written a script for testing on windows, you may find it useful. Link : https://github.com/akamhy/videohash/blob/main/assets/windows_ffmpeg_downloader_at_cwd.py

    help wanted 
    opened by akamhy 5
  • Improve grammar and fix typo

    Improve grammar and fix typo

    I am a non-native speaker and I suck at formal grammar. If you are a native speaker or just good at writing doc strings/comments/copy editing please open a pull request. Language must be formal, don't add any jokes or slang.

    Thank you!

    hacktoberfest 
    opened by akamhy 4
  • Long Video might fail to maketile due to the jpeg format

    Long Video might fail to maketile due to the jpeg format

    Problem: When I try to get the hash of a long video (about 90 min), it turns out errors when making tile: "encoder error -2 when writing image file" and "Maximum supported image dimension is 65500 pixels".

    My solution now: Instead of just changing the frame_interval to shorten the width, I found that it might be a limit of the jpeg format. So the solution I am using is to change the default output of the function "make_tile" in "tilemaker.py" to png format: save_tiles(tiles, prefix="tile", directory=tiles_dir, file_format="png")

    Suggestion: Now, there is no error. However, I am not sure if this will affect the hash value (as generated with jpeg format), or if any confilct to any part of this lib. As I notice the default parameter of "file_format" in th function "save_tiles" is already png, I am confused why the jpeg format is explictly given in the function "make_tile". If there is no other problem, maybe using png as the default in "make_tile" is better considering some long videos?

    Thank you!

    bug 
    opened by runck 3
  • BUG REPORT

    BUG REPORT

    Describe the bug Hash collision for some videos of same length

    To Reproduce

    v1 = VideoHash(url="https://canvaz.scdn.co/upload/artist/3PhoLpVuITZKcymswpck5b/video/5e966e9c01f147cdae93a02c61a4bf7c.cnvs.mp4")
    v2 = VideoHash(url="https://canvaz.scdn.co/upload/licensor/7JGwF0zhX9oItt9901OvB5/video/dc047df48f774d1590b61fd38bc082e4.cnvs.mp4")
    print(v1 == v2)
    

    Expected behavior The hash should be different but is same.

    Screenshots NA

    Please complete the following information:

    • Operating system: NA
    • Python Version: NA
    • VideoHash version: NA

    Additional context The issue can probably be resolved by extracting more features such as brightness levels or maybe the most dominant colors of frames extracted at a specific FPS. Increase the number of hash bits to accommodate more data.

    OR

    why not use colorhash + whash and change the bit site to 128( twice of 64, the current size)? They generate hash is very different ways and collisions should be highly unlikely.

    bug 
    opened by akamhy 3
  • Fix installing on Windows by specifying encoding

    Fix installing on Windows by specifying encoding

    In a windows environment, if the encoding is not specified, ASCII is expected. This creates errors when running setup.py when the README (or other files) contain emojis or other non-ascii characters. This fixes this at least for the README, not sure if there are other instances of this.

    bug 
    opened by step21 3
  • Change Frame Interval

    Change Frame Interval

    Would be great to expose access to the frame interval. I quite often work with very long or very short videos and would be great to specifiy the frame interval to check. Alternatively, be able to select a total number of frames and have it randomly select that number of frames from across the video.

    good first issue 
    opened by specky532 3
  • Video paths containing spaces break ffmpeg calls

    Video paths containing spaces break ffmpeg calls

    When using the from_path method of hashing a video, if the path to the video contains any number of spaces, it will break the ffmpeg commands given to subprocess.Popen. This is because:

    1. The paths within the command are not encapsulated by quotation marks, causing ffmpeg to interpret only the part of the path prior to the first whitespace as the target path, and the rest of the given path as additional, invalid arguments
    2. The command given to subprocess.Popen is split on spaces before being interpreted, again forcing the system to interpret different parts of the path as new arguments

    This is easily fixed by inserting escaped quotation marks around any paths in the ffmpeg commands and dropping the .split() on operation in the command and setting shell=True in Popen.

    I've taken the liberty of including the updated functions here:

    def frames(input_file, output_prefix):
        """Extract the frames of the video.
        Export frames as images at output_prefix as a 7 digit padded jpeg file.
        """
        command = "ffmpeg -i \"{input_file}\" -r 1 \"{output_prefix}_%07d.jpeg\"".format(
            input_file=input_file, output_prefix=output_prefix
        )
        process = Popen(command, shell=True, stdout=DEVNULL, stderr=STDOUT)
        output, error = process.communicate()
    
    
    def compressor(input_file, task_dir, task_uid):
        # APPLY : ffmpeg -i input.webm -s 64x64 -r 30  output.mp4
    
        output_file = join(task_dir, task_uid + "compressed.mp4")
        command = "ffmpeg -i \"{input_file}\" -s 64x64 -r 30 \"{output_file}\"".format(
            input_file=input_file, output_file=output_file
        )
        process = Popen(command, shell=True, stdout=DEVNULL, stderr=STDOUT)
        output, error = process.communicate()
    
        return output_file
    

    Hope you find this useful! Thanks for the great module!

    opened by CaileanMParker 3
  • created a module videoduration with func video_duration, videoduratio…

    created a module videoduration with func video_duration, videoduratio…

    …n attr now in VideoHash class instances and video_duration func can also be accesed directly as videohash.video_duration also added tests for the new module

    enhancement 
    opened by akamhy 2
  • Address issue with `subprocess` and `stdint`

    Address issue with `subprocess` and `stdint`

    This is main to address the issue described here: https://github.com/akamhy/videohash/issues/98

    It's mostly an issue with subprocess and ffmpeg, but videohash is susceptible to it. Let me know if you have any questions.

    I also added a bit to allow me to save the ffmpeg logs (which I needed at first to diagnose what was going on). You can keep it at your leisure, but I left it as optional.

    Thanks again for this library. It's a very good idea and I'm looking forward to experimenting more with the various results!

    opened by dale-wahl 0
  • pyhon subprocess inherits stdin by default and causes ffmpeg to fail

    pyhon subprocess inherits stdin by default and causes ffmpeg to fail

    When running videohash as part of a program that has also used subprocess it seems to inherit the stdin and that can result in various failures for ffmpeg.

    I have been documenting it here: https://github.com/digitalmethodsinitiative/4cat/pull/303#issue-1422452417 Essentially, I can use videohash alone, but not with additional subprocesses unless I edit it and provide it with stdin=subprocess.DEVNULL since the default stdin is in use.

    Sending a PR shortly with needed edit.

    bug 
    opened by dale-wahl 0
  • Hashing speed issue.

    Hashing speed issue.

    Describe the bug It takes quite a while to hash a video.

    To Reproduce

    from videohash import VideoHash
    import time
    
    start = time.time()
    
    url = 'https://user-images.githubusercontent.com/47534140/185008752-da1f09c7-a177-4a46-9c64-230744e998c1.mp4'
    v1 = VideoHash(url=url, frame_interval=12)
    
    print(f"Finished in {time.time() - start} secs")
    

    Expected behavior It should realistically be doable in under a second

    Please complete the following information:

    • Operating system: Windows 10
    • Python Version: 3.10.2
    • VideoHash version: 2.1.9

    Additional context Currently takes about 3/4 seconds

    bug 
    opened by Demmenie 0
  • Hash Collision

    Hash Collision

    Describe the bug Hash collision occurs with videos of the same length and with similar colour schemes.

    To Reproduce

    v1 = VideoHash(url='https://user-images.githubusercontent.com/47534140/185008752-da1f09c7-a177-4a46-9c64-230744e998c1.mp4')
    v2 = VideoHash(url='https://user-images.githubusercontent.com/47534140/185008748-b8922142-37cc-48a0-bad9-1385ba016587.mov')
    print (v1 == v2)
    

    Expected behavior The hashes of the videos should be different.

    Screenshots NA

    Please complete the following information:

    • Operating system: NA
    • Python Version: 3.10.5
    • VideoHash version: 3.0.1

    Additional context

    bug 
    opened by MikPisula 6
Releases(3.0.1)
  • 3.0.1(May 29, 2022)

    What's Changed

    • Tiles will now use PNG and not JPEG. jpeg has a max res limit, for longer videos it's a bug - https://github.com/akamhy/videohash/pull/92

    Full Changelog: https://github.com/akamhy/videohash/compare/3.0.0...3.0.1

    Download videohash

    Source code(tar.gz)
    Source code(zip)
  • 3.0.0(May 17, 2022)

    What's Changed

    • Fix hash collision for videos of same length by @akamhy in https://github.com/akamhy/videohash/pull/89

    Full Changelog: https://github.com/akamhy/videohash/compare/2.1.9...3.0.0

    Download videohash

    Source code(tar.gz)
    Source code(zip)
  • 2.1.9(Feb 14, 2022)

    What's Changed

    • Fix installing on Windows by specifying encoding by @step21 in https://github.com/akamhy/videohash/pull/83

    New Contributors

    • @step21 made their first contribution in https://github.com/akamhy/videohash/pull/83

    Full Changelog: https://github.com/akamhy/videohash/compare/2.1.8...2.1.9

    Download videohash

    Source code(tar.gz)
    Source code(zip)
  • 2.1.8(Dec 24, 2021)

    What's Changed

    • BUGFIX: The default behavior to download the worst quality fails for sites like Reddit. Fix by setting download_worst = False by @akamhy in https://github.com/akamhy/videohash/pull/77

    Full Changelog: https://github.com/akamhy/videohash/compare/2.1.7...2.1.8

    Download videohash

    Source code(tar.gz)
    Source code(zip)
  • 2.1.7(Dec 23, 2021)

    What's Changed

    • Update README (added credits and useful links) by @akamhy in https://github.com/akamhy/videohash/pull/74
    • The release is only made to upload the new and more helpful readme with credits to the PyPI.

    Full Changelog: https://github.com/akamhy/videohash/compare/2.1.6...2.1.7

    Download videohash

    Source code(tar.gz)
    Source code(zip)
  • 2.1.6(Nov 29, 2021)

    What's Changed

    • Created a module videoduration with the function video_duration, video_duration attribute now available in VideoHash instances and video_duration function can also be accessed directly as videohash.video_duration. by @akamhy in https://github.com/akamhy/videohash/pull/72

    Full Changelog: https://github.com/akamhy/videohash/compare/2.1.5...2.1.6

    Source code(tar.gz)
    Source code(zip)
  • 2.1.5(Nov 28, 2021)

  • 2.1.4(Nov 11, 2021)

    • Removed youtube-dl from the dependency now the package now solely uses yt-dlp for downloading videos.
    • VideoHash now works on python 3.10 post the 3.10 wheels of SciPy.
    Source code(tar.gz)
    Source code(zip)
  • 2.1.3(Nov 4, 2021)

    • Improved docstrings, useful for IDE/editor autocomplete.
    • FASTER: Use f-strings for String interpolation instead of c-style.
    • FASTER: Extend the rows of the wavelet hash to the instance bit list, no need to waste resources by generating the bit list from the bitstring.
    • Use yt-dlp as the default downloader, yt-dlp avoids throttling issues with YouTube.
    Source code(tar.gz)
    Source code(zip)
  • 2.1.2(Oct 20, 2021)

  • 2.1.1(Oct 20, 2021)

    • More type annotation
    • Avoid changing types of variables in runtime.
    • Avoid changing values of parameters of methods(they stay the same throughout their life).
    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Oct 19, 2021)

    • The videohash code is now type annotated.
    • The black bars in videos are removed before calculating the videohash value.
    • The extension of the downloaded video is set to .mkv if the video lacks an extension because the Matroska container can contain all codecs.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.4(Oct 17, 2021)

  • 2.0.3(Oct 16, 2021)

    • BUGFIX: On Windows, FFmpeg and youtube-dl/yt-dlp could fail because of the space in the directory name. This issue was fixed by quoting the paths of these programs.
    • CHANGE(non-breaking): A new attribute bitlist in the VideoHash class, the attribute is python list containing the bits of the hash value.
    • CHANGE(non-breaking): The package now XOR's the bitlist instead of calculating the Hamming distance the usual way.
    • Retired Python 3.5 is no longer supported.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.2(Oct 13, 2021)

    • All exceptions are now available directly from the videohash import. (imported exceptions in videohash/init.py).
    • Explicitly set collage_image_width=1024 in class MakeCollage, this changes nothing as it was set to 1024 while creating the object in VideoHash class.
    • shlex quote output_dir for POSIX in videohash/framesextractor.py
    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Oct 11, 2021)

    • v2.0.1 is incompatible with the version one of videohash(1.x.x). Sorry!
    • The version 2 usage wavelet-hash(based on Discrete Wavelet Transformation) for hashing the image. wavelet-hash as implemented by Dmitry Petrov in the image hash library. From now on, the whash of the collage is the videohash for the video.
    • Supports both youtube-dl and yt-dlp.
    • Operators such as '-', '==' and '!=' are now supported by the VideoHash class instances. The instance can be compared with other VideoHash class objects and also python string objects of the 64-bit binary hash and its hex representation.
    • The generated collage is now accessible to the end-user and not deleted right after its use to calculate the hash. In fact, the instance doesn't delete the files created by itself unless delete_storage_path() method is called on the instance.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.7(Sep 3, 2021)

  • 1.0.6(Apr 23, 2021)

    • Standardize the videos before calculating the hash.
    • It may be assumed that the standardization will increase the time to calculate the hashes but we are also decreasing the size of file by downscaling and reducing the frame rate.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.5(Jan 21, 2021)

  • 1.0.4(Jan 20, 2021)

    • Make the collage as close to a square close as possible. This change decreased the hashdiff of partially similar files by 15.33%(mean), tested on 164 partially similar NASA public domain files.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.3(Jan 19, 2021)

  • 1.0.2(Jan 18, 2021)

  • 1.0.1(Jan 17, 2021)

  • 1.0.0(Jan 17, 2021)

A tool to fuck a video/audio quality using FFmpeg

Media quality fucker A tool to fuck a video/audio quality using FFmpeg How to use Download the source Download Python Extract FFmpeg Put what you want

Maizena 8 Jan 25, 2022
Cross-platform command-line AV1 / VP9 / HEVC / H264 encoding framework with per scene quality encoding

Av1an A cross-platform framework to streamline encoding Easy, Fast, Efficient and Feature Rich An easy way to start using AV1 / HEVC / H264 / VP9 / VP

Zen 947 Jan 01, 2023
Video Object Segmentation(VOS) From Zero to HeroVideo Object Segmentation(VOS) From Zero to Hero

Video Object Segmentation(VOS) From Zero to Hero! Goal 1:train a two layers cnn model for vos. Finish! see model.py FFNet for more diteal.(2021.9.30)

1 Oct 22, 2021
A Python media index

pyvideo https://pyvideo.org is simply an index of Python-related media records. The raw data being used here comes out of the pyvideo/data repo. Befor

pyvideo 235 Dec 24, 2022
Techie Sneh 17 Nov 23, 2021
Automatic video generator for local news

Automatic video generator for local news

Gabriel Monteiro 2 Jan 11, 2022
Webcam Indicator is an application to recieve and send messages from your own Webcam Server.

Welcome to Webcam Indicator 👋 Webcam Indicator is an application to recieve and send messages from your own Webcam Server. 🏠 Homepage Prerequisites

Lorenzo Carbonell 2 Apr 04, 2022
Video Editor for Linux

Project on break until late March. NEW RELEASE 2.8 IS OUT NOW. INSTALLING: see here. RELEASE NOTES AVAILABLE here. Introduction Features Releases Inst

1.9k Jan 07, 2023
Spotify playlist video generator

This program creates a video version of your Spotify playlist by using the Spotify API and YouTube-dl.

0 Mar 03, 2022
Video stream recording dockerized server using python/ffmpeg.

Stream Recording Server Video stream recording dockerized server using python/ffmpeg. Usage Configuration Prepare .env file, check .env.example for th

GR 2 Jan 14, 2022
Rembg Video Virtual Green Screen Edition

Rembg Virtual Greenscreen Edition is a tool to create a green screen matte for videos

Tim Scarfe 217 Jan 06, 2023
Python application that can be used to generate video thumbnail for mp4 and mkv file types.

Thumbnail Generator 🎬 What is This This is a Python application that can be used to generate video thumbnail for mp4 and mkv file types. Installation

Tharindu N. 13 Jan 03, 2023
A Telegram bot to convert videos into x265/x264 format via ffmpeg.

Video Encoder Bot A Telegram bot to convert videos into x265/x264 format via ffmpeg. Configuration Add values in environment variables or add them in

1 Mar 08, 2022
Youtube-dislikes-adder - Add dislikes to the description of your YouTube videos.

Add number of dislikes to the description of your YouTube videos. Number of dislikes are updated if you let this function as a bot.

fluks 1 Aug 23, 2022
A self-hosted streaming platform with Discord authentication, auto-recording and more!

A self-hosted streaming platform with Discord authentication, auto-recording and more!

John Patrick Glattetre 331 Dec 27, 2022
Splat a video into a mosaic by sampling a frame at regular intervals

Splat a video into a mosaic by sampling a frame at regular intervals. Useful for seeing the changes over time of an entire video or movie.

Ryan Fox 4 Oct 16, 2022
plumi video sharing

December 2017 update We are moving tickets from the Plumi tracker (trac.plumi.org) here, for historical reasons. Plumi video sharing system Plumi is a

Plumi 111 Dec 15, 2022
A telegram bot for compressing/encoding videos in h264 format.

Video-Encoder-Bot a telegram bot for compressing/encoding videos in h264 format. Configuration Add values in environment variables or add them in conf

Weeb >.< 61 Dec 29, 2022
A python generator that converts youtube videos to ascii art in your console.

Video To ASCII A python generator that converts youtube videos to ascii art in your console. This has not been tested for windows! Example Normal mode

Julian Jones 24 Nov 02, 2022
Tautulli - A Python based monitoring and tracking tool for Plex Media Server.

Tautulli A python based web application for monitoring, analytics and notifications for Plex Media Server. This project is based on code from Headphon

Tautulli 4.7k Jan 07, 2023