| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| 3.6.0 release source code.tar.gz | 2026-08-17 | 392.9 MB | |
| 3.6.0 release source code.zip | 2026-08-17 | 393.0 MB | |
| README.md | 2026-08-17 | 3.9 kB | |
| Totals: 3 Items | 785.9 MB | 0 | |
New features
- Video rotation —
MultimediaInfo.getRotate()reports the angle, in degrees clockwise, that cameras record in the stream metadata when filming in a non native orientation. It is 0 when the file carries no rotation. Thanks to @JinLike (#275). - Finished callback —
EncoderProgressListener.done()is called once an encoding has completed successfully. It is adefaultmethod, so existing listeners keep working unchanged. Thanks to @JinLike (#275). - Stream looping —
EncodingAttributes.setStreamLoop(Integer)maps to ffmpeg-stream_loop, with-1repeating endlessly. Thanks to @supermoonie. - ffmpeg working directory —
ProcessWrapper.setExecFolder(File)sets the directory the ffmpeg process runs in, which matters for paths ffmpeg resolves itself, such as the file list of the concat demuxer. Thanks to @supermoonie. - Source back reference —
MultimediaInfo.getMultimediaObject()points back at the object the information was read from. Thanks to @supermoonie. - Timeout when reading media information —
MultimediaObject.getInfo(long timeoutMillis)gives up after the time you allow, so an unreachable or stalled source can no longer block the calling thread forever (#264).
Fixed
- The extracted ffmpeg binary could be run before it was ready (#281, [#236]). Two races: the
chmodwas started but never waited for, and the binary was copied straight onto its final path, so a second process could pick up a file that was not executable yet or only half written. Both showed up asPermission deniedorCannot run program. The executable bit is now set in process, and the copy is staged in a temporary file that is made executable and only then moved into place atomically. - Thread safety of shared state (#179).
Encoder's global option list threw aConcurrentModificationExceptionwhen it was changed while another thread was encoding, andVideoProcessorreported itself enabled because some earlier instance had been, then failed on a null encoder. - An unparsable source header no longer aborts an encoding. ffmpeg 4.4.x describes some containers in a way the parser does not accept. That information is only used to express progress as a percentage, so it is now a warning. Thanks to @jhsea3do (#209).
- Documentation examples did not compile (#189).
README.mdandExamples.mdcalledattrs.setFormat(...), which does not exist onEncodingAttributes, the method issetOutputFormat(...).
Build and infrastructure
- Publishing moved to the Sonatype Central Portal. The OSSRH service at
oss.sonatype.orgthis project published through has been retired by Sonatype. Releases and snapshots now go through the Central Portal, and the version badges in the README read from it again. - Snapshots are published from
developtohttps://central.sonatype.com/repository/maven-snapshots/. - All published artifacts now carry sources and javadoc jars, which the Central Portal requires.
- CI fixed. The workflow built with JDK 11 while one module targets release 12, so it had been failing before it reached a single test. It now builds with JDK 17 and runs on
masteras well asdevelop. - JUnit 5 annotations now take effect. The test modules had no engine on the classpath and no pinned surefire version, so Maven fell back to a provider that ignores the annotations.
@Disableddid nothing and seven tests had never run at all. Thanks to @Stickerifier for the test rework this uncovered.
Upgrading
No source changes are required. EncoderProgressListener.done() is a default method, so existing implementations compile unchanged.
:::xml
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>3.6.0</version>
</dependency>
Full changelog: https://github.com/a-schild/jave2/blob/master/Changelog.md