Why FFmpeg on a Mobile Device?
You're developing a video editing app, and built-in frameworks (AVFoundation, MediaCodec) fall short. You need frame-accurate trimming, concatenation of multiple clips, hardware acceleration, and flexible encoding settings. Sending video to a server is slow and expensive, and users demand privacy. FFmpeg solves these tasks directly on the device. We integrate it into iOS, Android, and Flutter, configure the optimal ffmpeg-kit build, and connect hardware encoders VideoToolbox or MediaCodec. This reduces CPU load and accelerates processing by 5–10x. With over 50 successful media processing integrations, we guarantee compatibility with App Store and Google Play requirements — including app size optimization and license compliance.
What Problems Does FFmpeg Solve on Mobile?
FFmpeg enables any media file operation: transcoding, trimming, concatenation, watermarking, volume adjustment, and more. Here are typical commands:
| Operation | Example Command | Use Case |
|---|---|---|
| Transcoding | -c:v libx264 -preset ultrafast -crf 23 |
Compress video before upload |
| Trimming (frame-accurate) | -ss 00:00:10 -to 00:00:30 |
Creating clips |
| Concatenation | -f concat -safe 0 -i filelist.txt -c copy |
Merging multiple clips |
| Audio extraction | -vn -acodec copy |
Getting a track for podcast |
| Watermark overlay | -filter_complex "overlay=W-w-10:H-h-10" |
Branding content |
| Volume change | -af volume=0.5 |
Audio normalization |
| Image insertion | -i image.png -filter_complex overlay |
Logo overlay on video |
For quick trimming, use -c copy — no re-encoding, keyframe accuracy. For frame-accurate trimming, omit -c copy but it takes longer. In UI, offer a choice: "Fast Trim" and "Accurate Trim".
How to Choose the Optimal ffmpeg-kit Build?
The build choice directly affects app size and available functionality. The minimal build (min) weighs 8–12 MB and includes basic codecs (H.264, AAC) — enough for trimming and conversion. If you need HTTPS support (e.g., downloading files over network) — choose the https build. For H.265, VP9, or audio codecs FLAC/opus, full (~50 MB) is required. For GPL-compatible projects, use full-gpl. We recommend the https build as the optimal balance of functionality and size. More details on variants can be found in the ffmpeg-kit documentation.
| Build | Size | Codecs | Features |
|---|---|---|---|
| min | 8–12 MB | H.264, AAC | Basic, no network |
| https | 12–15 MB | + HTTPS | For upload/download |
| full | up to 50 MB | All | All codecs, heavy |
| full-gpl | up to 50 MB | All | GPL license |
How to Integrate FFmpeg into a Project?
iOS. ffmpeg-kit with CocoaPods — minimal setup in 15 minutes:
// Podfile pod 'ffmpeg-kit-ios-https', '~> 6.0' // Usage FFmpegKit.executeAsync("-i input.mp4 -vn -acodec copy output.aac") { session in guard let returnCode = session?.getReturnCode() else { return } if ReturnCode.isSuccess(returnCode) { print("Done: \(session?.getOutput() ?? "")") } else { print("Error: \(session?.getLogsAsString() ?? "")") } } Android. Via Maven:
implementation("com.arthenica:ffmpeg-kit-android-https:6.0.LTS") FFmpegKit.executeAsync( "-i input.mp4 -vf scale=1280:720 -c:v libx264 -preset ultrafast -crf 23 output.mp4" ) { session -> if (ReturnCode.isSuccess(session.returnCode)) { // process result on main thread } } Flutter. Install the ffmpeg_kit_flutter package from pub.dev — Dart wrapper identical to native API.
Monitoring Processing Progress
FFmpeg writes progress to stderr. ffmpeg-kit provides StatisticsCallback, where getTime() returns the current position in milliseconds. Obtain total duration via FFprobeKit.getMediaInformationAsync.
FFmpegKit.executeAsync(command, withCompleteCallback: { session in /* complete */ }, withLogCallback: nil, withStatisticsCallback: { stats in guard let duration = totalDurationMs else { return } let progress = Double(stats?.getTime() ?? 0) / duration DispatchQueue.main.async { self.progressBar.progress = Float(progress) } } ) Step-by-Step Integration Guide
- Choose a build. Determine required codecs and protocols. For a typical app — https.
- Add dependency. Include the dependency (CocoaPods, Maven, or pub.dev). Test a basic command, e.g., getting file info.
- Optimize performance. Enable hardware acceleration via
h264_videotoolbox(iOS) orh264_mediacodec(Android) with a software fallback.
On iPhone 14 Pro, transcoding a 1-minute 1080p video via libx264 ultrafast takes 45–60 seconds. That's too long for UX. We use hardware encoders: iOS — h264_videotoolbox (via VideoToolbox) — 5–10x faster, but less bitrate control. Android — h264_mediacodec (via MediaCodec) — similar. Add a software fallback:
val command = if (isHardwareEncoderAvailable()) { "-i input.mp4 -c:v h264_mediacodec output.mp4" } else { "-i input.mp4 -c:v libx264 -preset ultrafast output.mp4" } Binary size: the full build adds 30–50 MB to the app, min — 8–12 MB. Choose the minimal one for specific tasks.
What’s Included in the Integration?
- Selection and configuration of the optimal ffmpeg-kit build (considering licenses and size).
- Development of an API for commands (transcoding, trimming, concatenation, etc.).
- Integration of progress monitoring and UI display.
- Hardware acceleration support with fallback.
- ProGuard/R8 configuration (Android) for minification.
- Usage documentation.
- Testing on 5+ real devices.
- Post-deployment support for 30 days.
FFmpeg integration reduces server processing costs by up to 40%, saving infrastructure budget. It pays for itself within 2–3 months. Contact us for a project assessment — we'll prepare a proposal within 1 business day. Request a consultation to discuss details and get a tailored work plan.







