Skip to content

7.1.5.5

Choose a tag to compare

@github-actions github-actions released this 30 Oct 14:35
· 14 commits to main since this release
1372e53

What's changed

FFmpeg stays on n7.1.5, now from FFmpegKit release 7.1.7 (previously 7.1.6). The FFmpeg version hasn't moved, so this is the next binding revision, 7.1.5.5. If you use the 7.* range, your next restore moves you onto it.

Update if you use 7.1.5.4: it has two bugs that can stop FFmpeg working in your app.

Fixed: FFmpeg fails to load on some Android versions

On an arm64 Android 12 (API 31) emulator, Min, MinGpl, Https, HttpsGpl and Video from 7.1.5.4 could not run any FFmpeg command. The first one threw:

java.lang.UnsatisfiedLinkError: dlopen failed: can't enable GNU RELRO protection for ".../libswresample.so": Out of memory

This has nothing to do with available memory. In those builds the library's RELRO segment ends past its last loaded segment, so Android's linker tries to protect memory that isn't mapped. Upstream traces this to NDK r26c and now builds with r27c.

All five variants now pass every device check on that emulator. Video from 7.1.5.4 did load on an API 35 emulator and on a Pixel 10 with Android 17, so whether you hit this depends on the Android version. Other versions were not tried. On x86_64, Audio carries the same defect as these five: Audio from 7.1.5.4 failed with the same error on an API 31 emulator.

Fixed: the app freezes after an FFmpeg command

An app on the default Mono runtime could freeze for good at the first garbage collection after it ran an FFmpeg command, usually ending in Android's "isn't responding" dialog. How soon that happened depended on how much the app allocated, so a small test app could run for a long time without showing it. A device check that forces collections after FFmpeg has run never finishes on 7.1.5.4, and passes on this release.

Mono on Android restarts the threads it stopped for a collection with SIGXCPU. FFmpeg installs its own SIGXCPU handler when a command runs, so the restart never reached Mono and those threads stayed suspended. FFmpeg also treats that signal as a request to stop.

The packages now call FFmpegKitConfig.IgnoreSignal(Signal.Sigxcpu) the first time you use FFmpegKit, FFmpegKitConfig or AsyncFFmpegExecuteTask, so you don't need to change any code. If you already make that call yourself, it is harmless and you can remove it. Your own Java code still has to make the call if it starts FFmpeg without going through those types.

Security

Upstream reports that FFmpegKit 7.1.7 backports fixes for two issues onto n7.1.5:

FFmpegKitConfig.FFmpegVersion reports n7.1.5 with or without them, so check the package version instead.

Native changes

  • drawtext is now in Full, FullGpl and Video. FFmpegKit built HarfBuzz but never enabled it, so FFmpeg silently left the filter out. A command using drawtext failed on 7.1.5.4 with No such filter: 'drawtext', and now renders text.
  • A -filter_complex parse error no longer kills the process, according to upstream. This could not be confirmed here: a graph naming an unknown filter returned an error on both 7.1.5.4 and this release.
  • Min and Https now carry libc++_shared.so, as the other variants already did. That adds about 1.7 MB on arm64-v8a and 1.5 MB on x86_64 before compression.
  • libc++_shared.so is now 16 KB-aligned, like every other library in the packages. Upstream notes that Google Play stops accepting updates without 16 KB support on 1 February 2027.

.NET API

The FFmpegKit update changes nothing here: classes.jar is byte-identical between FFmpegKit 7.1.6 and 7.1.7 in all eight variants.

7.1.5.4 came out before 8.1.2.5, so this release also picks up that release's binding changes:

  • FFmpegKitConfig.DisableLogCallback() and DisableStatisticsCallback() clear the global callbacks.
  • The hand-written additions now have nullable reference annotations, which can produce new compiler warnings in projects with nullable checks on.
  • Every package now warns at build time: FFMPEGKIT001 when SupportedOSPlatformVersion is below 24, and FFMPEGKIT002 when a build includes 32-bit runtime identifiers. You can suppress either with NoWarn.

Target frameworks, arm64-v8a and x86_64, minSdkVersion 24 and licensing are unchanged.

FFmpegKit 7.1.6 can no longer be built from main

FFmpegKit 7.1.7 packages the same FFmpeg, and build/native-versions.tsv has one row per FFmpeg version, so it replaces 7.1.6 there. 7.1.5.4 stays on nuget.org, but it has none of the fixes above.

What was tested

Against the packed packages:

  • An arm64 API 35 emulator and a Pixel 10 with Android 17: all eight variants on net10.0-android36.0, plus Full and Video on net8.0-android34.0. Every device check passes, including the garbage collection check, and FFmpegKitConfig.FFmpegVersion reports n7.1.5.
  • An arm64 API 31 emulator: Min, MinGpl, Https, HttpsGpl and Video on net10.0-android36.0.
  • The example app on both of the first two devices, on net10.0-android36.0, net9.0-android35.0 and net8.0-android34.0: media probe, resize, grayscale and audio extraction, then playback of the result.
  • drawtext in Video, Full and FullGpl.
  • All 190 package tests.

x86_64 emulators ran a build of the same FFmpegKit 7.1.7 libraries after this release went out. Audio and Video on net8.0-android34.0 pass every device check on API 31 and 35, and the example app, which uses Full, completes a conversion on net10.0-android36.0 on API 35. Min, MinGpl, Https, HttpsGpl and FullGpl have not run on x86_64.

Full changelog: v8.1.3.1...v7.1.5.5

Native build

FFmpegKit 7.1.7, which packages FFmpeg n7.1.5 — the two version
numbers are not the same thing. Read from the shipped libavcodec.so.

Built from the upstream release v7.1.7 LTS Android (Free), published 2026-09-26.

Upstream's summary of that build:

Free tier of the 7.1 LTS line. Nine artifacts, arm64-v8a + x86_64, built from FFmpeg n7.1.5 with the two CVE backports applied.

Seven of the nine tiers could not be loaded before this release

On 7.1.6, dlopen failed before a single function was called:

dlopen failed: can't enable GNU RELRO protection for
  ".../jni/x86_64/libswresample.so": Out of memory

It was not a memory shortage. PT_GNU_RELRO, rounded up to the 16 KB page size, extended past the last PT_LOAD; the loader's mprotect covered unmapped memory and answered ENOMEM. The cause was NDK r26c, whose lld rounds RELRO up to max-page-size without padding the final LOAD. It only affected small libraries, so full and full-gpl worked and it looked intermittent.

free, min, min-gpl, https, https-gpl, audio and video were affected. All nine tiers load in 7.1.7.

The same NDK shipped libc++_shared.so aligned on 4 KB, which would have failed on 16 KB-page devices — Google Play stops accepting updates without 16 KB support on 2027-02-01. And free, https and min shipped no libc++_shared.so at all, while libffmpegkit.so links against it unconditionally.

Also in this release

  • drawtext is present in full, full-gpl and video. Since FFmpeg 6.1 it depends on libharfbuzz, and configure drops a filter silently when its flag is absent; harfbuzz was built and linked all along but --enable-libharfbuzz was never passed.
  • A filtergraph parse error no longer kills the process. init_complex_filtergraph() left an AVFilterInOut * uninitialised and freed it on the error path.
  • CVE-2026-64830 (vobsub) and CVE-2026-64835 (adx), backported to n7.1.5.

Toolchain

NDK r27c (27.2.12479018), as on the 8.1 line. Do not go back: r26c produces libraries that cannot be loaded.

Verification

Read from these artifacts, not from the build:

  • every .so: p_align 16 KB and PT_GNU_RELRO inside the last PT_LOAD
  • libc++_shared.so present in both ABIs of all nine
  • the pin, per ABI: libavutil n7.1.5
  • 18 capability lists compared against 7.1.6 for the two tiers that could be loaded before: one difference, drawtext added; nothing removed
  • 189 acceptance checks (21 × 9 tiers) on a device: 0 failures. The 41 skipped are tiers genuinely without the encoder or filter involved, cross-checked against each artifact's own capability tables.

Packages

Targeting net8.0-android34.0, net9.0-android35.0 and net10.0-android36.0.

Package License NuGet
FFmpegKit.Net.Audio.Android MIT AND LGPL-3.0-only 7.1.5.5
FFmpegKit.Net.Full.Android MIT AND LGPL-3.0-only 7.1.5.5
FFmpegKit.Net.FullGpl.Android MIT AND GPL-3.0-only 7.1.5.5
FFmpegKit.Net.Https.Android MIT AND LGPL-3.0-only 7.1.5.5
FFmpegKit.Net.HttpsGpl.Android MIT AND GPL-3.0-only 7.1.5.5
FFmpegKit.Net.Min.Android MIT AND LGPL-3.0-only 7.1.5.5
FFmpegKit.Net.MinGpl.Android MIT AND GPL-3.0-only 7.1.5.5
FFmpegKit.Net.Video.Android MIT AND LGPL-3.0-only 7.1.5.5
dotnet add package FFmpegKit.Net.Video.Android --version 7.1.5.5

Licensing

The binding code is MIT, but the bundled native FFmpeg binaries are not.
The -gpl variants enable x264/x265/xvid/vidstab and are GPL-3.0; the rest
are LGPL-3.0. If your app is closed-source, use a non-GPL variant.
Each package ships the applicable texts under licenses/.