-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit d67af36
Showing
18 changed files
with
2,092 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
# MapEngine Media Extension | ||
|
||
<img src="https://i.imgur.com/7YyUEBQ.png" alt="logo" width="200"> | ||
|
||
[![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/TheJoCraftNET/MapEngine-MediaExtension?style=flat-square)](#) | ||
[![AGPLv3 License](https://img.shields.io/badge/License-AGPL%20v3-yellow.svg?style=flat-square)](https://opensource.org/license/agpl-v3/) | ||
[![Status Alpha](https://img.shields.io/badge/Status-Alpha-red?style=flat-square)](#) | ||
|
||
## Description | ||
|
||
MapEngine Media Extension is an extension library for [MapEngine](https://github.com/TheJoCraftNET/MapEngine). | ||
It provides an additional API for playing video and streaming live content using MapEngine. | ||
|
||
The Extension uses [bytedeco/javacv's](https://github.com/bytedeco/javacv) FFmpeg implementation for decode media. | ||
JavaCV, JavaCPP and FFmpeg will be downloaded on server startup and loaded into the classpath. | ||
This plugin downloads only the currently needed libraries for the current operating system and architecture. | ||
|
||
## Features | ||
|
||
- Runtime dependency downloader | ||
- FFmpeg based media decoding | ||
|
||
<details> | ||
<summary><strong>Downloading native libraries</strong></summary> | ||
|
||
This is an example of native libraries being downloaded on server startup. | ||
|
||
![RuntimeDependencyLoading](https://i.imgur.com/GMWH9NW.gif) | ||
|
||
</details> | ||
|
||
<details> | ||
<summary><strong>Live streaming via RTMP</strong></summary> | ||
|
||
This is an example of a live stream on a 7x4 map in Minecraft. | ||
The stream source is 1920x1080@20fps streamed with OBS. | ||
|
||
[![Watch it here](https://i.imgur.com/h1e9ROE.png)](https://youtu.be/5tg_DX84eLw) | ||
|
||
</details> | ||
|
||
## Usage | ||
|
||
`MapMediaExt` has to be added as a dependency to the `plugin.yml` regardless of the build system used. | ||
|
||
<details> | ||
<summary><strong>Maven</strong></summary> | ||
|
||
```xml | ||
<repositories> | ||
<repository> | ||
<id>tjcserver</id> | ||
<url>https://repo.thejocraft.net/releases/</url> | ||
</repository> | ||
</repositories> | ||
``` | ||
|
||
```xml | ||
<dependencies> | ||
<dependency> | ||
<groupId>de.pianoman911</groupId> | ||
<artifactId>mapengine-mediaext</artifactId> | ||
<version>1.0.3</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
</dependencies> | ||
``` | ||
</details> | ||
|
||
|
||
<details> | ||
<summary><strong>Gradle (groovy)</strong></summary> | ||
|
||
```groovy | ||
repositories { | ||
maven { | ||
url = 'https://repo.thejocraft.net/releases/' | ||
name = 'tjcserver' | ||
} | ||
} | ||
dependencies { | ||
compileOnly 'de.pianoman911:mapengine-mediaext:1.0.3' | ||
} | ||
``` | ||
|
||
</details> | ||
|
||
<details> | ||
<summary><strong>Gradle (kotlin)</strong></summary> | ||
|
||
```kotlin | ||
repositories { | ||
maven("https://repo.thejocraft.net/releases/") { | ||
name = "tjcserver" | ||
} | ||
} | ||
|
||
dependencies { | ||
compileOnly("de.pianoman911:mapengine-mediaext:1.0.3") | ||
} | ||
``` | ||
|
||
</details> | ||
|
||
### Example | ||
|
||
```java | ||
public class Bar { | ||
|
||
public void foo(IMapDisplay display, URI streamUri) { | ||
// create a drawing space for the display | ||
IDrawingSpace space = plugin.mapEngine().pipeline().drawingSpace(display); | ||
|
||
// add all online players as receivers | ||
space.ctx().receivers().addAll(Bukkit.getOnlinePlayers()); | ||
|
||
// create a new frame source with a 10 frame buffer and rescaling enabled | ||
FfmpegFrameSource source = new FfmpegFrameSource(streamUri, 10, space, true); | ||
|
||
// start the decoding process | ||
source.start(); | ||
} | ||
} | ||
``` | ||
|
||
More detailed examples can be found in the [TheJoCraftNET/MapEngineExamples](https://github.com/TheJoCraftNET/MapEngineExamples) repository. | ||
|
||
## Building | ||
|
||
1. Clone the project (`git clone https://github.com/TheJoCraftNET/MapEngine-MediaExtension.git`) | ||
2. Go to the cloned directory (`cd MapEngine-MediaExtension`) | ||
3. Build the Jar (`./gradlew build` on Linux/MacOS, `gradlew build` on Windows) | ||
|
||
The plugin jar can be found in the `build` → `libs` directory. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
plugins { | ||
id("java-library") | ||
id("maven-publish") | ||
id("com.github.johnrengelman.shadow") version "7.1.2" | ||
} | ||
|
||
group = "de.pianoman911" | ||
version = "1.0.3" | ||
|
||
repositories { | ||
maven("https://repo.papermc.io/repository/maven-public/") | ||
maven("https://repo.thejocraft.net/releases/") | ||
} | ||
|
||
dependencies { | ||
compileOnlyApi("io.papermc.paper:paper-api:1.19.4-R0.1-SNAPSHOT") | ||
compileOnlyApi("de.pianoman911:mapengine-api:1.4.0") | ||
api("org.bstats:bstats-bukkit:3.0.2") | ||
|
||
compileOnlyApi("org.bytedeco:javacpp:1.5.8") | ||
compileOnlyApi("org.bytedeco:ffmpeg:1.5.8") | ||
compileOnlyApi("org.bytedeco:javacv:1.5.8") | ||
|
||
} | ||
|
||
tasks { | ||
shadowJar { | ||
destinationDirectory.set(rootProject.buildDir.resolve("libs")) | ||
archiveBaseName.set(rootProject.name) | ||
|
||
relocate("org.bstats", "de.pianoman911.mapengine.media.bstats") | ||
} | ||
|
||
assemble { | ||
dependsOn(shadowJar) | ||
} | ||
|
||
processResources{ | ||
filesMatching("paper-plugin.yml") { | ||
expand( | ||
"version" to project.version, | ||
) | ||
} | ||
} | ||
} | ||
|
||
publishing { | ||
publications.create<MavenPublication>("maven${project.name}") { | ||
artifactId = project.name.lowercase() | ||
from(components["java"]) | ||
} | ||
repositories.maven("https://repo.thejocraft.net/releases/") { | ||
name = "tjcserver" | ||
authentication { create<BasicAuthentication>("basic") } | ||
credentials(PasswordCredentials::class) | ||
} | ||
} |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#Tue Apr 04 00:51:08 CEST 2023 | ||
distributionBase=GRADLE_USER_HOME | ||
distributionPath=wrapper/dists | ||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip | ||
zipStoreBase=GRADLE_USER_HOME | ||
zipStorePath=wrapper/dists |
Oops, something went wrong.