Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
pianoman911 committed Apr 5, 2023
0 parents commit d67af36
Show file tree
Hide file tree
Showing 18 changed files with 2,092 additions and 0 deletions.
456 changes: 456 additions & 0 deletions .gitignore

Large diffs are not rendered by default.

661 changes: 661 additions & 0 deletions LICENSE

Large diffs are not rendered by default.

135 changes: 135 additions & 0 deletions README.md
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.
57 changes: 57 additions & 0 deletions build.gradle.kts
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 added gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
6 changes: 6 additions & 0 deletions gradle/wrapper/gradle-wrapper.properties
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
Loading

0 comments on commit d67af36

Please sign in to comment.