GithubHelp home page GithubHelp logo

zfleeman / ffmpeg4discord Goto Github PK

View Code? Open in Web Editor NEW
41.0 41.0 1.0 620 KB

ffmpeg4discord is a Python package tailored for Two-Pass encoding, enabling efficient video compression to meet desired file sizes. Ideal for users seeking to compress videos for Discord sharing within file size limitations.

Home Page: https://pypi.org/project/ffmpeg4discord/

License: GNU General Public License v3.0

Python 72.87% HTML 27.13%
codecs discord encoding ffmpeg ffmpeg-python flask h264 libx264 video video-processing vp9 webm x264

ffmpeg4discord's Introduction

Hi there ๐Ÿ‘‹, I'm Zach Fleeman

๐Ÿ’ป Software Engineer
๐Ÿ“ˆ Data Scientist
๐Ÿ Python
๐Ÿ” DevOps
๐Ÿ“น Audio/Video scripting
๐Ÿ‘จโ€๐Ÿ”ง Former Industrial Engineer & manufacturing leader
๐ŸŸ Pisces

ffmpeg4discord's People

Contributors

zfleeman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

anonusername

ffmpeg4discord's Issues

Better error handling around `ffprobe` call

There are a lot of assumptions that I make about the metadata available in the video file. I've fixed the "display_aspect_ratio" problem in this commit, but I should check for more issues like:

  • "display_aspect_ratio" is not always tagged on a video file
  • ["format"]["duration"]
  • ["streams"]
  • No audio stream video files break in the self.run() function

Allow framerate modification

Currently, the output that ff4d creates uses the same framerate as its input. A lower framerate may result in better image quality after compression.

Add support for overlays with cropped video or image stills

It would be fun to add support for overlaying parts of the video file on top of the output video. Ultrawide+ monitor captures that are cropped to a more reasonable aspect ratio may have important segments of their video that are cropped out. This would allow users to select rectangular sections to overlay onto the final output.

This would be an addition to the video filters section.

File name jobs and web ui jobs have different file size outputs.

During an encoding run, I noticed that the target file size was not being reached on the first attempt when dragging and dropping a file that had a single timestamp as its file name. But when I ran the exact same file with the same timestamp in the Web UI, the job finished in one run.

This has to do with the "to" timestamp not being generated when the file name job is only given one (starting) timestamp. Generate a "to" timestamp regardless of whether or not it is specified.

"to" can be the timestamp_from_seconds() value of the total clip duration in this case.

File Path Issues

First off, thanks for this. There are other discord scripts out there but none this robust.

Apologies if this pollutes your repo: I know I have scripts that work perfectly for me, that I have no interest in supporting for others. But in case this helps you or anyone else:

I am running on Windows 10 x64 and Python 3.12. My ffmpeg version is vintage 2023:

ffmpeg version 6.1-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --pkg-config=pkgconf --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

I can split these into separate issues if you want.

Config file conflicts with parser defaults

The argparse module at utils/arguments.py sets defaults (e.g. 8mb file max). i think it would be more intuitive to pull these from conf.json.

Poor parsing of paths on windows

I spent about an hour trying to track this down, with no luck. I originally was trying to drag a file from g:\ onto the batch file on my c:\ drive. The batch then looked for a config file in the folder on g:. I iterated on this error many times, trying to shave it into something more manageable. You can set a path type in argparse, but it's kind of annoying - the discussion is over my head but you can see more here and here

What eventually worked was hardcoding the config path and passing a fake config file in the command line. I kept seeing my conf.json getting overwritten. Presumably this was from the "with open()" code but I couldn't get to the bottom of that either. (You'd think it wouldn't happen with "r" mode, but idk.) You need to have the fake config file to trigger the init_from_config() part of the code path.

I also had to put the video file in the same folder as the script. Anything more complicated seemed fraught.


    def init_from_config(self, config_file: str) -> None:
        """
        Set the Class values from a json file
        :param config_file: path to a json file containing parameters for TwoPass()
        """
        # with open(cc.name) as f:
        import pathlib

        pp = pathlib.Path(r"c:/apps/ffmpeg4discord/conf.json")
        with open(pp, "r", encoding="utf-8") as f:

Discord free limit is now 25 MB

So the default should change accordingly.

Make audio codec configurable

So opus can be set.


These are subjective:

VP9 + Opus are maximum quality supported on discord

At the expense of encode time, VP9 and Opus are better than h264 and aac.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.