NymphCast is a audio and video casting system with support for custom applications.

Repository Structure · Getting Started · Building From Source · Developer's Guide · SDK · License · Donate

What is NymphCast?

NymphCast is a software solution which turns your choice of Linux-capable hardware into an audio and video source for a television or powered speakers. It enables the streaming of audio and video over the network from a wide range of client devices, as well as the streaming of internet media to a NymphCast server, controlled by a client device.

In addition, the server supports powerful NymphCast apps written in AngelScript to extend the overall NymphCast functionality with e.g. 3rd party audio / video streaming protocol support on the server side, and cross-platform control panels served to the client application that integrate with the overall client experience.

NymphCast requires at least the server application to run on a target device, while the full functionality is provided in conjunction with a remote control device: NymphCast diagram

Client-side core functionality is provided through the NymphCast library.

Features & Status

The current development version is v0.1-alpha4. Version 0.1 will be the first release. The following list contains the major features that are planned for the v0.1 release, along with their implementation status.

  • Streaming media content (files) between client and server.
  • Streaming online content by passing a URL to the server.
  • Support all mainstream audio and video codecs using ffmpeg.
  • Run AngelScript-based apps with a custom API for external communication.
  • Multi-cast media content to multiple servers with good synchronization.
  • Playback of media content shared on the local network.

Timeline for the v0.1 release:

  • Begin implementation.
  • Implemented all features.
  • Validated features.
  • Feature freeze.
  • Beta testing start.
  • Release candidates.
  • Release.

Components

The NymphCast project consists out of multiple components:

Component Purpose Status
NymphCast Server Receiver end-point for clients. Connected to the audiovisual device. v0.1-alpha4
NymphCast Client SDK Software Development Kit for developing NymphCast clients. v0.1-alpha4
NymphCast Client CLI-based NymphCast client. v0.1-alpha4
NymphCast Player Graphical, Qt-based NymphCast client. SDK reference implementation. v0.1-alpha4
NymphCast Player Android Native Android-based NymphCast client. v0.1-alpha0
NymphCast MediaServer Server application for making media content available to NymphCast clients. v0.1-alpha0

NymphCast Player Client

The NymphCast Player provides NymphCast client functionality. It is also a demonstration platform for the NymphCast SDK (see details on the SDK later in this document). It is designed to run on any OS that is supported by the Qt framework.

Server Platforms

The server should work on any platform that is supported by a C++17 toolchain and the LibPoco dependency. This includes Windows, MacOS, Linux and BSD.

FFmpeg and SDL2 libraries are used for audio and video playback. Both of which are supported on a wide variety of platforms, with Linux, MacOS and Windows being the primary platforms. System requirements also depend on whether only audio or also video playback is required. The latter can be disabled, which drops any graphical output requirement.

Memory requirements depend on the NymphCast Server configuration: by default the ffmpeg library uses an internal 32 kB buffer, and the server itself a 20 MB buffer. The latter can be configured using the (required) configuration INI file, allowing it to be tweaked to fit the use case.

Client Platforms

For the Qt-based NymphCast Player, a target platform needs to support LibPoco and have a C++ compiler which supports C++17 ( header supported) or better, along with Qt5 support. Essentially, this means any mainstream desktop OS including Linux, Windows, BSD and MacOS should qualify, along with mobile platforms. Currently Android is also supported, with iOS support planned.

For the CLI-based NymphCast Client, only LibPoco and and C++17 support are required.

Mobile platforms are a work in progress. An Android client (native Java with JNI) is in development.

Repository Structure

The repository currently contains the NymphCast server, client SDK and NymphCast Player client sources.

/
|- android	(Android client app)
|- player 	(the NymphCast demonstration client)
|- src/
|	|- client 		(basic NymphCast client, for testing)
|	|- client_lib 	(NymphCast SDK files)
|	|- server		(the NymphCast server and NymphCast app files)
|- tools	(shell scripts for creating releases, in progress)

Getting Started

To start using NymphCast, you need a device on which the server will be running (most likely a SBC or other Linux system). NymphCast is offered as binaries for selected distros, and as source code for use and development on a variety of platforms.

Releases

NymphCast is currently in Alpha stage. Experimental releases are available on Github (see the 'Releases' folder).

Some packages also exist for selected distros.

For pacman-based distros (ArchLinux, Manjaro):

For Alpine Linux and postmarketOS:

Player client releases for Android and Windows:

If pre-compiled releases for your target device or operating system are currently not listed above, you may need to build the server and client applications from source.

Running NymphCast

The server binary can be started with just a configuration file. To start the server, execute the binary (from the bin/ folder) to have it start listening on port 4004:

./nymphcast_server -c nymphcast_config.ini.

The server will listen on all network interfaces for incoming connections. It supports the following options:

-h	--help				Get this help message.
-c	--configuration		Path to the configuration file.
-a	--apps				Path to the NymphCast apps folder.
-w	--wallpaper			Path to the wallpapers folder.
-v	--version			Output NymphCast server version and exit.

The client binary supports the following flags:

Usage:
        nymphcast_client 

Options:
-h      --help          Get this help message.
-v      --version       Output the NymphCast client version and exit.
-r      --remotes       Display online NymphCast receivers and quit.
-f      --file          Name of file to stream to remote receiver.
-i      --ip            IP address of the target NymphCast receiver.

The NymphCast Player is a GUI-based application and accepts no command line options.

Building From Source

Note: This section is for building the project from source. Pre-built binaries are provided in the 'Releases' folder.

The steps below assume building the server part on a system running a current version of Debian (Buster) or similarly current version of Arch (Manjaro) Linux or Alpine Linux. The player client demo application can be built on Linux/BSD/MacOS with a current GCC toolchain, or MSYS2 on Windows with MinGW toolchain.

Once the project files have been downloaded, run the setup.sh script in the project root, or install the dependencies and run the Makefile in the client and server folders as described. Either method will output a binary into the newly created bin/ folder.

To build the corresponding client-related parts of NymphCast, in addition to a C++ toolchain with C++17 support, one needs the dependencies as listed below.

Server Dependencies

On Debian & derivatives:

sudo apt -y install libsdl2-image-dev libsdl2-dev libpoco-dev

and

sudo apt -y install libswscale-dev libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev libpostproc-dev libswresample-dev

On Arch & derivatives:

sudo pacman -S --noconfirm --needed sdl2 sdl2_image poco ffmpeg

On Alpine & derivatives:

sudo apk add poco-dev sdl2-dev sdl2_image-dev ffmpeg-dev openssl-dev

Client Library Dependencies

Building The Server

If using a compatible OS (e.g. Debian Buster, Alpine Linux or Arch Linux), one can use the setup script:

  1. Run the setup.sh script in the project root to perform the below tasks automatically.
  2. Run the install_linux.sh script in the project root to install the binaries and set up a systemd/OpenRC service on Linux systems.

Else, use the manual procedure:

  1. Check-out NymphRPC elsewhere and build the library with make lib.
  2. Install NymphRPC with sudo make install.
  3. Change to NymphCast/src/server and execute make command.
  4. Use sudo make install to install the server and associated files.
  5. Use sudo make install-systemd (SystemD) or sudo make install-openrc (OpenRC) to install the relevant service file.

Building The NymphCast Player Client

This demonstration client uses Qt5 to provide user interface functionality. The binary release comes with the necessary dependencies, but when building it from source, make sure Qt5.x is installed or get it from www.qt.io.

For Windows (x64):

  1. Download and extract the binary release.

Or (building and running on Windows & other desktop platforms):

  1. Download or clone the project repository
  2. Build the libnymphcast library in the src/client_lib folder using the Makefile in that folder: make lib.
  3. Execute sudo make install to install the library.
  4. Ensure the Qt5 SDK is installed.
  5. Create player/NymphCastPlayer/build folder and change into it.
  6. Execute qmake .. followed by make.
  7. The player binary is created either in the same build folder or in a debug/ sub-folder.

On Android:

  1. Download or clone the project repository.
  2. Compile the dependencies (NymphCast client SDK, NymphRPC & Poco) for the target Android platforms.
  3. Ensure dependency libraries along with their headers are installed in the Android NDK, under /ndk//toolchains/llvm/prebuilt//sysroot/usr/lib/ where TARGET is the target Android platform (ARMv7, AArch64, x86, x86_64). Header files are placed in the accompanying usr/include folder.
  4. Open the Qt project in a Qt Creator instance which has been configured for building for Android targets, and build the project.
  5. An APK is produced, which can be loaded on any supported Android device.

Now you should be able to execute the player binary, connect to the server instance using its IP address and start casting media from a file or URL.

Developer's Guide

The focus of the project is currently on the development of the NymphCast server and the protocol parts. Third parties are encouraged to contribute server-side app support of their services and developers in general to contribute to server- and client-side development.

The current server and client documentation is hosted at the Nyanko website.

SDK

An SDK has been made available in the src/client_lib/ folder. The player project under player/ uses the SDK as part of a Qt5 project to implement a NymphCast client which exposes all of the NymphCast features to the user.

To use the SDK, the Makefile in the SDK folder can be executed with a simple make command, after which a library file can be found in the src/client_lib/lib folder.

Note: to compile the SDK, both NymphRPC and LibPOCO (1.5+) must be installed.

Note: For Android, one can compile for ARMv7 Android using make lib ANDROID=1and for AArch64 Android using ANDROID64=1. This requires that the Android SDK and NDK are installed and on the system path.

After this the only files needed by a client project are this library file and the nymphcast_client.h header file.

License

NymphCast is a fully open source project. The full, 3-clause BSD-licensed source code can be found at its project page on Github, along with binary releases.

Donate

NymphCast is fully free, but its development relies on your support. If you appreciate the project, your contribution, Ko-Fi or donation will help to support the continued development.

Comments
  • Player quit immediately after pushing on play button.

    Player quit immediately after pushing on play button.

    Hello,

    Player quit immediately after pushing on the play button. below you can find the trace on Server Side.

    The server is running on Raspberry PI3, and Client as well. Any idea, how can I make it work?

    Thank you in advance for your help :)

    Starting new session for file with size: 392744673 Stopping timer... Destroying texture... Destroying renderer... 6 - 22724.0 NymphRemoteClient 260 Calling callback method: MediaReadCallback - src/remote_client.cpp 6 - 22724.0 NymphMessage 219 Serialising message with flags: 0x4 - src/nymph_message.cpp 6 - 22724.0 NymphSession 217 Sent 46 bytes. - src/nymph_session.cpp Destroying window... Quitting... Erreur de segmentation

  • Assembly failure on armv7

    Assembly failure on armv7

    On armv7, we get an assembly failure on Alpine Linux. See the CI pipeline here.

    The error:

    g++ -Os -fomit-frame-pointer -Wall -fPIC -fno-strict-aliasing -o obj/as_callfunc_arm_gcc.o -c ../../source/as_callfunc_arm_gcc.S
    ../../source/as_callfunc_arm_gcc.S: Assembler messages:
    ../../source/as_callfunc_arm_gcc.S:336: Error: thumb conditional instruction should be in IT block -- `ldrge r0,[r6]'
    ../../source/as_callfunc_arm_gcc.S:338: Error: thumb conditional instruction should be in IT block -- `ldrge r1,[r6,#4]'
    ../../source/as_callfunc_arm_gcc.S:340: Error: thumb conditional instruction should be in IT block -- `ldrge r2,[r6,#8]'
    ../../source/as_callfunc_arm_gcc.S:342: Error: thumb conditional instruction should be in IT block -- `ldrge r3,[r6,#12]'
    ../../source/as_callfunc_arm_gcc.S:413: Error: thumb conditional instruction should be in IT block -- `ldrge r0,[r6]'
    ../../source/as_callfunc_arm_gcc.S:415: Error: thumb conditional instruction should be in IT block -- `ldrge r1,[r6,#4]'
    ../../source/as_callfunc_arm_gcc.S:416: Error: thumb conditional instruction should be in IT block -- `movlt r1,r5'
    ../../source/as_callfunc_arm_gcc.S:418: Error: thumb conditional instruction should be in IT block -- `ldrge r2,[r6,#8]'
    ../../source/as_callfunc_arm_gcc.S:419: Error: thumb conditional instruction should be in IT block -- `movlt r2,r5'
    ../../source/as_callfunc_arm_gcc.S:421: Error: thumb conditional instruction should be in IT block -- `ldrge r3,[r6,#12]'
    ../../source/as_callfunc_arm_gcc.S:422: Error: thumb conditional instruction should be in IT block -- `movlt r3,r5'
    ../../source/as_callfunc_arm_gcc.S:423: Error: thumb conditional instruction should be in IT block -- `movlt r5,#0'
    ../../source/as_callfunc_arm_gcc.S:503: Error: thumb conditional instruction should be in IT block -- `ldrge r1,[r6]'
    ../../source/as_callfunc_arm_gcc.S:505: Error: thumb conditional instruction should be in IT block -- `ldrge r2,[r6,#4]'
    ../../source/as_callfunc_arm_gcc.S:506: Error: thumb conditional instruction should be in IT block -- `movlt r2,r5'
    ../../source/as_callfunc_arm_gcc.S:508: Error: thumb conditional instruction should be in IT block -- `ldrge r3,[r6,#8]'
    ../../source/as_callfunc_arm_gcc.S:509: Error: thumb conditional instruction should be in IT block -- `movlt r3,r5'
    ../../source/as_callfunc_arm_gcc.S:510: Error: thumb conditional instruction should be in IT block -- `movlt r5,#0'
    ../../source/as_callfunc_arm_gcc.S:514: Error: thumb conditional instruction should be in IT block -- `ldrge r7,[r6,#12]'
    ../../source/as_callfunc_arm_gcc.S:515: Error: thumb conditional instruction should be in IT block -- `strge r7,[r6,#8]'
    ../../source/as_callfunc_arm_gcc.S:520: Error: thumb conditional instruction should be in IT block -- `movge r5,#4'
    ../../source/as_callfunc_arm_gcc.S:591: Error: thumb conditional instruction should be in IT block -- `ldrge r1,[r6]'
    ../../source/as_callfunc_arm_gcc.S:593: Error: thumb conditional instruction should be in IT block -- `ldrge r2,[r6,#4]'
    ../../source/as_callfunc_arm_gcc.S:595: Error: thumb conditional instruction should be in IT block -- `ldrge r3,[r6,#8]'
    ../../source/as_callfunc_arm_gcc.S:597: Error: thumb conditional instruction should be in IT block -- `movge r11,#4'
    ../../source/as_callfunc_arm_gcc.S:669: Error: thumb conditional instruction should be in IT block -- `ldrge r2,[r6]'
    ../../source/as_callfunc_arm_gcc.S:671: Error: thumb conditional instruction should be in IT block -- `ldrge r3,[r6,#4]'
    ../../source/as_callfunc_arm_gcc.S:673: Error: thumb conditional instruction should be in IT block -- `movge r11,#4'
    ../../source/as_callfunc_arm_gcc.S:675: Error: thumb conditional instruction should be in IT block -- `movge r11,#8'
    ../../source/as_callfunc_arm_gcc.S:676: Error: thumb conditional instruction should be in IT block -- `ldrlt r7,[r6,#8]'
    ../../source/as_callfunc_arm_gcc.S:677: Error: thumb conditional instruction should be in IT block -- `strlt r7,[r6,#12]'
    
  • NymphCast GUI fails to start due to failing to load fonts

    NymphCast GUI fails to start due to failing to load fonts

    Aug 01 11:46:32 lvl2:   Loading fonts.
    Aug 01 11:46:32 lvl2:   Adding fonts...
    Aug 01 11:46:32 lvl2:   Failed loading resource /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf.
    Aug 01 11:46:32 lvl2:   Failed loading resource /usr/share/fonts/truetype/freefont/FreeMono.ttf.
    Aug 01 11:46:32 lvl2:   Failed loading resource /usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf.
    Aug 01 11:46:32 lvl2:   Try loading resource :/opensans_hebrew_condensed_regular.ttf from: /home/bart/.emulationstation/resources/opensans_hebrew_condensed_regular.ttf
    Aug 01 11:46:32 lvl2:   Try loading resource :/opensans_hebrew_condensed_regular.ttf from: /usr/bin/resources/opensans_hebrew_condensed_regular.ttf
    Aug 01 11:46:32 lvl2:   Try loading resource :/opensans_hebrew_condensed_regular.ttf from: /home/bart/.local/var/pmbootstrap/cache_git/pmaports/resources/opensans_hebrew_condensed_regular.ttf
    Aug 01 11:46:32 lvl2:   Failed loading resource :/opensans_hebrew_condensed_regular.ttf.
    Assertion failed: !err (gui/core/resources/Font.cpp: FontFace: 21)
    fish: Job 1, '/usr/bin/nymphcast_server -c /e…' terminated by signal SIGABRT (Abort)
    

    This system does have a DejaVuSans.ttf but that's installed to /usr/share/fonts/ttf-dejavu/DejaVuSans.ttf. I believe the location differs per distro, but it's always somewhere in /usr/share/fonts. It can't be relied upon to exist in a specific place inside there though.

  • Player can't find server when not on local machine

    Player can't find server when not on local machine

    I've been testing nymphcast_server on a remote machine (still on the local network though) but NymphCastPlayer can't seem to find it. I've made sure avahi is running on both machines (not sure if required) but no matter what I do, nothing appears in the Remote tab.

    However if I run nymphcast_server on my local machine and the Player as well, it can find the local instance perfectly fine.

  • NymphServer Windows Binary

    NymphServer Windows Binary

    I successfully compiled the NymphServer Windows 10 binary under MSYS2 and was happy seeing it working.

    Now I wanted to transfer the binary to another Windows 10 machine, but DLL Hell hit me hard, and I could not get it working.

    Are they any plans to provide a simple portable or installer Windows build without prior compiling?

    Thanks for this very nice project!

  • Support a CLI (non-GUI) mode on the server

    Support a CLI (non-GUI) mode on the server

    I'm thinking of using NymphCast server on a Plasma Bigscreen setup. For that I rather not have the server show it's UI fullscreen on top of the Plasma Bigscreen UI. Rather I have it run on the background (probably with some --cli argument) and only show up when something is being cast to it, then go to the background again when casting is done/over.

  • Errors on Server Launch

    Errors on Server Launch

    Getting these errors when I launch the server. It does still run but videos crash often.

    Starting NyanSD on port 4004 UDP... (0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'bool performHttpQuery(string, string &out)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'bool performHttpsQuery(string, string &out)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'void clientSend(int, string)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'bool streamTrack(string)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'bool readValue(string, string &out, uint64)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'bool storeValue(string, string &in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f()' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(bool)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(int)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(uint)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(float)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(double)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(const string&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(const JSONValue&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f()' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(bool)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(int)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(uint)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(float)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(double)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(const string&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(const JSONValue&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValueType get_valueType() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONNumberType get_numberType() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'string get_valueTypeName() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'string get_numberTypeName() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isNull() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isBool() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isNumber() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isString() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isArray() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isObject() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool getBool(bool defaultValue = false) const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'int getInt(int defaultValue = 0) const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'uint getUInt(uint defaultValue = 0) const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'float getFloat(float defaultValue = 0) const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'double getDouble(double defaultValue = 0) const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'const string getString(const string&in defaultValue = string()) const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue opIndex(uint)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'const JSONValue& opIndex(uint) const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Push(const JSONValue&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Pop()' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Insert(uint, const JSONValue&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Erase(uint, uint length = 1)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Resize(uint)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'uint get_size() const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opIndex(const string&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'const JSONValue& opIndex(const string&in) const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Set(const string&in, const JSONValue&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue get(string&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Erase(const string&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool Contains(const string&in) const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Clear()' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONFile' and 'bool fromString(const string&in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONFile' and 'string toString(const string&in = string(" ")) const' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONFile' and 'JSONValue& getRoot()' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONFile' and 'JSONValue& get_root()' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONFile' and 'void f()' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONFile' and 'void f()' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'RegExp' and 'void f()' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'RegExp' and 'void f()' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'RegExp' and 'void createRegExp(string &in)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'RegExp' and 'int extract(string &in, string &out, int = 0)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'RegExp' and 'int extract(string &in, int offset, string &out, int = 0)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'RegExp' and 'int findall(const string &in, array @+ = null)' (Code: asNOT_SUPPORTED, -7) (0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'RegExp' and 'int findfirst(const string &in, string &out)' (Code: asNOT_SUPPORTED, -7)

  • Allow custom apps directory location

    Allow custom apps directory location

    Since I'm packaging this for Alpine Linux, I'm not following the current file system structure this application expects.

    I install the nymphcast_server binary to /usr/bin/nymphcast_server, the config files (src/server/*.ini) to /etc/nymphcast and apps (src/server/apps) to /usr/share/nymphcast/apps.

    The binary and config files are fine, I just point my (so-far custom) init file to the right binary, and provide the config file with the -c argument. However, I see no current way to specify the location of the apps directory.

    Is there an argument I can pass to the binary which would do this? Btw, supporting -h and/or --help would be nice :wink:

  • Compilation issue

    Compilation issue "conflicting declaration 'const uint32_t nymph_seek_event'"

    NymphCastServer.cpp:223:16: error: conflicting declaration 'const uint32_t nymph_seek_event'
      223 | const uint32_t nymph_seek_event = SDL_RegisterEvents(1);
          |                ^~~~~~~~~~~~~~~~
    In file included from NymphCastServer.cpp:31:
    ffplay/types.h:449:17: note: previous declaration as 'uint32_t nymph_seek_event'
      449 | extern uint32_t nymph_seek_event;
          |                 ^~~~~~~~~~~~~~~~
    

    This happens on Alpine Linux with Musl 1.1.24.

  • Add Alpine support

    Add Alpine support

    Meaning: add Alpine support to setup.sh and install an OpenRC init file rather than systemd when required.

    Note that for the service file to work https://github.com/MayaPosch/NymphCast/issues/5 is required as OpenRC doesn't support a working directory and can thus not find the apps directory.

  • Server crashes (SIGSEGV) on exit

    Server crashes (SIGSEGV) on exit

    ^CShutting down...
    Shutting down data request function...
    Destroying texture...
    Destroying renderer...
    Destroying window...
    Quitting...
    Stopped workers.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    Joined threads.
    fish: Job 1, 'nymphcast_server -c /etc/nymphc…' terminated by signal SIGSEGV (Address boundary error)
    
  • Integration with Plasma Bigscreen

    Integration with Plasma Bigscreen

    This is more an opinion than a specific request.

    PB and NC seem like a natural pair just as Chromecast and Google/Android TV go together. Becoming maybe even an official part of KDE software has the benefit of reaching wider audience by being advertised along with PB, Plasma Desktop and Plasma Mobile.

    I saw that you're working on EmulationStation interface; what do you think about (also) a better integration with PB's settings, media player and browser? Plasma (and PB) also have KDE Connect (smartphone/desktop integration app) which already has controls (among other things) for TV interface (maybe of use for NC's TV apps?).

    I'm not sure how suitable NC is when it comes to local game streaming but Plasma is also on Steamdecks so there's that too.

    I'm sure there are many more other possible intersections but this is just to start things rolling.

    Anyway, I love what you're doing and what KDE is and I'm thankful for both.

  • Client app in Kirigami

    Client app in Kirigami

    Kirigami is KDE's mobile UI framework that works both on Android and GNU-Linux. It would be really nice to have NymphCast client with it as it is good looking and much more touch-friendly than current form.

  • Integration with Home Assistant

    Integration with Home Assistant

    Hello,

    Just like the title says, I am just opening the discussion about the possibility of integration of NymphCast with HA. I have been looking for an open source solution to Chromecast for a while and I find NymphCast to be the one that suits my needs most, even though I don't have it with me yet.

    The idea about this integration is that we could control the NymphCast server from HA. Think about voice-command a movie, or turning on/off the TV following a trigger (voice command, sensor, buttons, etc.). Do you think it's possible to do that? I'm not so knowledgeable about open source technology so sorry if my question stays too vague.

    Thanks!

  • raspberrypi nymphcast_server[9460]: /usr/local/bin/nymphcast_server: error while loading shared libraries: libPocoUtil.so.70: cannot open shared object file: No such file or directory

    raspberrypi nymphcast_server[9460]: /usr/local/bin/nymphcast_server: error while loading shared libraries: libPocoUtil.so.70: cannot open shared object file: No such file or directory

    After installing with sudo ./install.sh I'm getting this error when the service is trying to start.

    Jul 05 18:38:41 raspberrypi systemd[1]: Started NymphCast audio/video casting server.
    Jul 05 18:38:41 raspberrypi nymphcast_server[9460]: /usr/local/bin/nymphcast_server: error while loading shared libraries: libPocoUtil.so.70: cannot open shared object file: No such file or directory
    Jul 05 18:38:41 raspberrypi systemd[1]: nymphcast.service: Main process exited, code=exited, status=127/n/a
    Jul 05 18:38:41 raspberrypi systemd[1]: nymphcast.service: Failed with result 'exit-code'.
    Jul 05 18:38:46 raspberrypi systemd[1]: nymphcast.service: Scheduled restart job, restart counter is at 10.
    Jul 05 18:38:46 raspberrypi systemd[1]: Stopped NymphCast audio/video casting server.
    
Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games.
Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games.

An open source video game library manager and launcher with support for 3rd party libraries like Steam, GOG, Origin, Battle.net and Uplay. Includes game emulation support, providing one unified interface for your games.

Dec 2, 2022
Video stabilization is a software-based approach in real-time to eliminating environmental effects (wind, heavy vehicle etc.) and enhance the visual performance that degrade video streaming quality.
Video stabilization is a software-based approach in real-time to eliminating environmental effects (wind, heavy vehicle etc.) and enhance the visual performance that degrade video streaming quality.

Video Stabilization Contents General Info Installation To Do General Info Video stabilization is a software-based approach in real-time to eliminating

Nov 23, 2022
OpenShot Video Library (libopenshot) is a free, open-source C++ library dedicated to delivering high quality video editing, animation, and playback solutions to the world

OpenShot Video Library (libopenshot) is a free, open-source C++ library dedicated to delivering high quality video editing, animation, and playback solutions to the world

Dec 3, 2022
Vulkan Video Sample Application demonstrating an end-to-end, all-Vulkan, processing of h.264/5 compressed video content.
Vulkan Video Sample Application demonstrating an end-to-end, all-Vulkan, processing of h.264/5 compressed video content.

This project is a Vulkan Video Sample Application demonstrating an end-to-end, all-Vulkan, processing of h.264/5 compressed video content. The application decodes the h.264/5 compressed content using an HW accelerated decoder, the decoded YCbCr frames are processed with Vulkan Graphics and then presented via the Vulkan WSI.

Dec 7, 2022
Minimalist video maker -- simplify your music score video making process!

VisualScores 极简视频制作程序,简化你的乐谱视频制作! 如果需要编译,请解压 lib 文件夹中压缩包。 使用前请参考 manual 文件夹中的用户手册。 请勿修改、移动或删除 resource 文件夹中的任何文件。 VisualScores Minimalist video maker

Sep 7, 2022
yangwebrtc is a self-developed rtc architecture supporting Webrtc/Srt/Rtmp, including a variety of video and audio codecs and processing, etc.
yangwebrtc is a self-developed rtc architecture supporting Webrtc/Srt/Rtmp, including a variety of video and audio codecs and processing, etc.

YangWebrtc Overview yangwebrtc是一个自主研发的支持Webrtc/Srt/Rtmp的rtc架构,包含多种视音频编解码和处理等。 支持视频会议、高清录播直播、直播互动等多种视音频应用。 可用于远程教育、远程医疗、指挥调度、安防监控、影视录播、协同办公、直播互动等多种行业应用

Nov 30, 2022
Axis video analytics example applications

Axis Camera Application Platform (ACAP) 4 example applications that provide developers with the tools and knowledge to build their own solutions based on the ACAP Computer Vision SDK

Nov 15, 2022
This repository contains applications used in my Gameboy LCD video.

Gameboy LCD stuff This repository contains applications used in my Gameboy LCD video. Pin naming LCD pin naming used in this repository matches the Ga

Jul 3, 2022
A WFH utility to visually indicate user engagement of audio and video
A WFH utility to visually indicate user engagement of audio and video

DIY: In meeting indicator - WFH Utility The need for in meeting indicator at home So many of you have gotten accustomed to work from home by now. This

Jun 28, 2021
Dolby AC-4 Audio & ATSC 3.0/HEVC Video Playback
Dolby AC-4 Audio & ATSC 3.0/HEVC Video Playback

VideoPlayer Qt+ffmpeg+SDL2+Dolby+AC-4+AC4+HEVC+ATSC3.0+4K+video This is a fork of the video player found here: https://github.com/yundiantech/VideoPla

Oct 2, 2022
Custom FFMpeg build script which support cross-compile to macOS/iOS/android

FFmpegCompileScript Custom FFMpeg build script which support cross-compile to macOS/iOS/Android Usage: First, init all submodule: git submodule update

Apr 20, 2022
Even newer Custom Firmware for Xiaomi Cameras based on Hi3518ev200 Chipset. It includes free RTSP, ONVIF and other improvements based on the work by roleoroleo
Even newer Custom Firmware for Xiaomi Cameras based on Hi3518ev200 Chipset. It includes free RTSP, ONVIF and other improvements based on the work by roleoroleo

Why this Yi-Hack-V5 firmware? The answer is simple: missing updates, RTSP and not based on the latest stock firmware (which features improvements and

Dec 2, 2022
FFmpeg coding tutorial - learn how to code custom transmuxing, transcoding, metadata extraction, frame-by-frame reading and more

FFmpeg code examples FFmpeg coding tutorial - learn how to code custom transmuxing, transcoding, metadata extraction, frame-by-frame reading and more

Nov 29, 2022
Vireo is a lightweight and versatile video processing library written in C++11

Overview Vireo is a lightweight and versatile video processing library that powers our video transcoding service, deep learning recognition systems an

Dec 8, 2022
Olive is a free non-linear video editor for Windows, macOS, and Linux.
Olive is a free non-linear video editor for Windows, macOS, and Linux.

Olive is a free non-linear video editor for Windows, macOS, and Linux.

Nov 30, 2022
SRS is a simple, high efficiency and realtime video server, supports RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181.
SRS is a simple, high efficiency and realtime video server, supports RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181.

SRS is a simple, high efficiency and realtime video server, supports RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181.

Dec 5, 2022
SortNode is a JS binding for SORT: Simple, online, and real-time tracking of multiple objects in a video sequence.

SortNode is a JS binding for SORT: Simple, online, and real-time tracking of multiple objects in a video sequence.

Aug 2, 2022
ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 scans, annotated with 3D camera poses, surface reconstructions, and instance-level semantic segmentations.

ScanNet is an RGB-D video dataset containing 2.5 million views in more than 1500 scans, annotated with 3D camera poses, surface reconstructions, and instance-level semantic segmentations.

Dec 6, 2022
🎬 ScreenToGif allows you to record a selected area of your screen, edit and save it as a gif or video.
🎬 ScreenToGif allows you to record a selected area of your screen, edit and save it as a gif or video.

ScreenToGif ?? screentogif.com This tool allows you to record a selected area of your screen, live feed from your webcam or live drawings from a sketc

Dec 4, 2022