Skip to content
marcomorosi06Public

About

Privacy-first media editor for Android powered by FFmpeg and local AI. Material 3 Expressive, live preview, zero permissions.

Topics

Resources

Security policy

Stars

134 stars

Watchers

6 watching

Forks

Repository files navigation

FFmpeg GUI

The power of FFmpeg, in a Material 3 Expressive app.
Edit and convert video, audio and pictures on your phone, with a live preview of every change. Fully offline.

Android 10+ Kotlin 2.0 Material 3 Expressive No internet permission EUPL v1.2

Support the project on Ko-fi

Get it on GitHub

Get it on Obtainium: stable releases Get it on Obtainium: also pre-releases

With Obtainium installed, a tap adds the app and keeps it updated from the releases here: the first button follows only stable releases, the second one also takes the pre-releases.
There is no stable release yet: for now the first button downloads nothing, but it sets the app up in Obtainium, which downloads it by itself as soon as the first stable release is out.


Video editor Subtitles from speech Subject cut-out
Photo adjustments Filters Equalizer

Why FFmpeg GUI

  • Private by design. No internet, storage, media, camera or microphone permission: files come only through the system's picker or a share. No ads, no trackers, no account.
  • What you see is what you get. Every edit shows live in the preview, which runs ports of the same FFmpeg filters the export uses.
  • FFmpeg, not a black box. The generated command is always in view: edit it by hand, or write your own with suggestions, docs at the cursor and recipes.
  • Made for the phone. Hardware video encoding, background exports and a full Material 3 Expressive interface, laid out for phones, tablets and monitors.

Features

Editor What it does
Video Timeline of clips, speed curves, 101 transitions, keyframes, texts, overlays, effects, chroma key, denoise, subtitles, HDR
Smart features Subtitles from speech, transcripts, subject cut-out (and a long press that lifts a subject off a photo), translation, AI dubbing, stems (dialogue, music, effects, instruments) as separate tracks, magic eraser
Audio Waveform editor, ten-band equaliser, compressor, reverb and more, loudness levelling, tags and cover art
Pictures Photo editor, crop and perspective, filters, layers, shapes and blend modes, SVG editor, ASCII and ANSI art editor, Ultra HDR JPG
GIF Its own editor, with a preview that shows colours and dithering as they will be

The smart features run entirely on the phone. Their models are not in the app: the browser downloads them once, and the app imports them and checks them against pinned SHA-256 hashes. Each one, with its licence and source: docs/MODELS.md.

All the features, in detail

Formats

Kind Formats
Video MP4, MKV, AVI, GIF
Audio MP3, M4A (AAC), OGG (Vorbis), OPUS, FLAC, WAV
Pictures JPG, PNG, WEBP, BMP, TIFF, SVG, ASCII art (TXT), ANSI art (ANS)
Anything else Stream copy, or any FFmpeg command you write

Marked as made with AI

When a file holds what an AI model made (a dub's voice, a picture the magic eraser changed), FFmpeg GUI says so inside it, in a form programs can read and detect, as the EU AI Act asks (Regulation (EU) 2024/1689, Article 50(2)).

A mark that cannot be seen or heard, in the sound and the picture themselves: AudioSeal (Meta, MIT) on every voice a model says, and again on the whole sound of a file a dub is heard in (mixed with music and effects, a voice's own mark sinks under them), TrustMark (Adobe, MIT) on every picture the magic eraser changes, written as they are made and read back before they are kept; what was made before them gets them at export. It holds through compression and resizing. Their files are imported before the models that make voices and pictures (the dub's and the magic eraser's): without them none of those can be imported, and none stays on the phone. The other smart features (subtitles, transcripts, translation, cut-out, stems) make nothing that is marked, so they work without them; until the marks are set up, the dub and the magic eraser are greyed out in Settings > Smart features.

And the metadata: IPTC's Digital Source Type in the file's XMP, and tags of its own (AI_GENERATED, DIGITAL_SOURCE_TYPE) where the format has them. The marks are written after FFmpeg, so neither the metadata settings nor a command written by hand can leave them out; a format with no place for them (BMP, for example) is not written. Subtitles, transcripts, translations, subject cut-outs and stem separation are not marked: they do not make anything that passes for real.

A file can be checked from the home ("Check a file for AI"): a picture, a sound or a video. The app looks for both marks, the metadata and the invisible one (TrustMark in a picture, AudioSeal in a voice, so a dub is found), on your phone. It finds only these marks, the ones it writes itself: a file without them may still have been made with AI.

The marks say only that ("AI-generated voice", "AI-generated inpainting"; the invisible marks carry a fixed payload, the same for everyone): not which model or voice, not which app, no date, nothing about you or your phone, nothing random. They are the same in every file of every user: they are made to carry no fingerprint of any kind, so as not to tell one file, phone or person from another.

That they carry none is not certain, and you should take it into account before sharing what must not lead back to you. The fixed payload and the metadata say that a file was made with software that marks this way, and with few people using it that alone narrows down who made it. The invisible marks come from neural models that nobody can fully see into: no one can prove that a mark says nothing more than its bits, nor that it does not tell which version of the models or of the app wrote it. And much else in a file can point to its maker: the place and the device in its metadata (kept unless you choose "Remove sensitive"), the names and settings of the encoders FFmpeg writes, its dates, what it shows.

Please do not remove these marks from the files you share: they tell people what was not recorded.

Security

FFmpeg GUI is in alpha, and its FFmpeg runtime is due for an update: some of the libraries it bundles are older than their fixed releases. What that means, what is already in place, and how to report a vulnerability privately: SECURITY.md.

Development transparency

AI tools were extensively used during development. System architecture, technical decisions, code review, and verification were handled by a human.

Don't trust AI-generated code? Verify it yourself or don't install it at all.

Requirements

  • Android 10 (API 29) or higher
  • arm64-v8a or x86_64 (64-bit only, as the FFmpeg runtime)

Build

You need JDK 17 or newer, the Android SDK, git and bash.

git clone https://github.com/marcomorosi06/FFmpegGUI
cd FFmpegGUI
./scripts/fetch-sherpa-onnx.sh     # speech recognition AAR, if app/libs does not have it
./scripts/fetch-ffmpeg-kit-next.sh # the pinned FFmpeg runtime, checked by its SHA-256
./gradlew assembleDebug            # APK in app/build/outputs/apk/debug/

Building FFmpeg yourself, troubleshooting and the reproducible release process: Building and releasing.

Architecture

Three Gradle modules, with dependencies pointing one way (app -> media -> core):

  • :core: pure Kotlin. Request model, FFmpeg command generation, output naming, the conversion workflow and the CPU ports of the filters used by the preview, all unit tested without Android.
  • :media: Android implementations of the interfaces :core asks for: the FFmpeg runtime, media probing, file staging, fonts.
  • :app: Compose UI, ConversionViewModel, the smart features and the dependency wiring.

Details, data flow and a "where do I change X" table are in docs/ARCHITECTURE.md.

Libraries

Library Version Purpose
FFmpegKitNext (built from source) 6.1.1 FFmpeg engine (FFmpeg 6.1.6)
Jetpack Compose + Material 3 BOM 2026.09.00 (Compose 1.12.1), Material 3 1.5.0-beta01 UI
Navigation Compose 2.9.8 Screen navigation
Media3 ExoPlayer 1.10.1 Media preview
AndroidX Core Splashscreen 1.2.0 Splash screen
sherpa-onnx (with ONNX Runtime) 1.13.8 Speech recognition (release AAR in app/libs)
ONNX Runtime (Java API) 1.28.0 Subject cut-out
AndroidSVG 1.4 Opening SVG files, drawing parts of SVGs in the SVG editor

Star history

Star history of FFmpeg GUI

Support the project

FFmpeg GUI is made by one person, in spare time, and will stay free and open source. If it is useful to you, you can buy me a coffee on Ko-fi: it keeps the project going.

Credits

  • FFmpeg (LGPL 2.1+ / GPL 2+), through FFmpegKitNext (GPL 3.0 with the GPL libraries), built with:
    • x264, x265, Xvid and vid.stab (GPL 2+)
    • LAME, FriBidi and libiconv (LGPL)
    • libass, dav1d, FreeType, HarfBuzz, Fontconfig, Opus, Vorbis, Ogg, zimg, Expat, libpng and cpu_features (permissive licences)
  • sherpa-onnx (Apache 2.0, with eSpeak NG, GPL 3.0 or later, inside it; repacked as described in app/src/main/assets/licenses/ffmpeg-gui/NOTICE.txt) and ONNX Runtime (MIT)
  • Jetpack Compose, AndroidX and Media3 (Apache 2.0)
  • AndroidSVG by Cave Rock Software (Apache 2.0)
  • Okio by Square and kotlinx.serialization by JetBrains (Apache 2.0), used by AndroidX
  • Parakeet TDT 0.6B v3 by NVIDIA (CC BY 4.0), as converted to int8 ONNX by sherpa-onnx, served unchanged from this project's releases with its licence and notice, downloaded by the user; its token list ships with the app. Its SmoothQuant build (by pantinor) was offered before; the app now deletes it from the phone
  • IS-Net and U2-Net by Xuebin Qin et al. (Apache 2.0), as converted by rembg (MIT)
  • BiRefNet by Zheng Peng et al. (MIT), its lite general-use weights, converted to ONNX by this project (scripts/export-birefnet.py) and served from its releases with its licence and notice, downloaded by the user
  • Opus-MT by the University of Helsinki (CC BY 4.0), as converted to ONNX by Xenova, downloaded by the user
  • Bandit v2 by Karn N. Watcharasupat, Chih-Wei Wu and Iroro Orife (weights CC BY-SA 4.0, code Apache 2.0), its multilingual weights, converted to ONNX by this project (scripts/export-bandit.py; the attribution and the changes are in its NOTICE, the ONNX file is under CC BY-SA 4.0 too) and served from its releases, also in int8 (scripts/export-bandit-int8.py, its release, the default), downloaded by the user; its spectrogram and masks are computed in the app's own Kotlin
  • Spleeter by Deezer (MIT), its five-stem model, converted to ONNX by this project (scripts/export-spleeter.py) and served from its releases, downloaded by the user. Its two-stem model (as sherpa-onnx converted it) set voices apart before; the app now deletes it from the phone
  • Kokoro-82M by hexgrad (Apache 2.0), in the multi-language build of sherpa-onnx, with eSpeak NG's data (GPL 3.0), downloaded by the user
  • Piper voices (the format: MIT; each voice under its own licence, see its card), as published on Hugging Face or packed by sherpa-onnx, downloaded by the user
  • MI-GAN by Picsart AI Research (MIT) and LaMa by Samsung AI Center (Apache 2.0, ONNX by Carve), downloaded by the user
  • EdgeTAM by Meta (Apache 2.0), a Segment Anything 2 for phones, converted to ONNX by this project (scripts/export-edgetam.py; what changed is in its NOTICE) and served from its releases, downloaded by the user
  • anti-vocale (Apache 2.0), where the idea of on-device transcription and the way to run the model come from
  • Google Sans Flex (SIL Open Font License)
  • AudioSeal by Meta (MIT, the weights included), converted to ONNX by this project (scripts/export-ai-markers.py), and TrustMark by Adobe (MIT, the model files included; T. Bui, S. Agarwal, J. Collomosse, ICCV 2025), Adobe's ONNX files unchanged (redistribution confirmed): the AI marks, served from this repository's releases with their licences and NOTICE, downloaded by the user
  • Two identifiers of IPTC's Digital Source Type vocabulary (CC BY 4.0), in the AI marks of exported files
  • The Obtainium logo by ImranR98 (GPL 3.0), in this page's Obtainium buttons only (its licence)
  • The photos and the video inside the store screenshots, from Pexels (free to use, no attribution required): winter forest, gerbera, Victoria Street, puppy; not part of the app (credits)

The splash screen comes from WiFi Audio Streaming for Android, and the audio editor's spectrum from WiFi Audio Streaming for desktop, both by the same author and under the same licence (EUPL 1.2).

The video effects are made by the project's own scripts/generate-effects.py (the punches' 3D fist and the sound of its blow by scripts/punch3d.py, the math formulas by scripts/math_effect.py with its own stroke font, the TV break's test card and tune by scripts/tv_break.py) and are part of FFmpeg GUI, under its licence.

Each component stays under its own licence.

The AI models are recorded one by one in docs/MODELS.md: who made each, its licence, where its files come from, the SHA-256 the app checks them against and what it was trained on, and how the licences of the two models this project converts and serves itself are kept. scripts/check-model-pins.py checks, before every release, that the app, the record and the licences agree. It is a record, not legal advice.

License

Copyright (c) 2026 Marco Morosi.

The source code of FFmpeg GUI is licensed under the EUPL v1.2, which is available in all the official languages of the EU, each version equally valid.

The APK also contains FFmpeg built with GPL libraries (x264, x265, Xvid, vid.stab), eSpeak NG (GPL 3.0 or later, inside sherpa-onnx's libsherpa-onnx-jni.so) and other third-party components (see Credits). As allowed by Article 5 of the EUPL (compatibility clause), the APK as a whole is distributed under the GNU GPL v3. Each third-party component stays under its own licence.

FFmpeg GUI is provided "as is", without any warranty, to the extent permitted by law.

About

Privacy-first media editor for Android powered by FFmpeg and local AI. Material 3 Expressive, live preview, zero permissions.

Topics

Resources

Security policy

Stars

134 stars

Watchers

6 watching

Forks

Releases

Packages

Contributors

Languages