5

I would like to use MediaView to play video streams and video files generated by the Shinobi media server but MediaView does not seem to be able to handle any stream or file generated by Shinobi.

I am using Java 18 and JavaFX 19 (I have tried older versions as well).

I have one sample file generated by Shinobi here.

It plays fine in VLC, which shows that the file has the following attributes:

Codec: H264 - MPEG-4 AVC (part 10) (avc1)
Video resolution: 1280x720
Decoded format: Planar 4:2:2 YUV full scale
Chroma location: left

I have added error handlers to the MediaPlayer, MediaView and Media objects but there are no errors when I attempt to play the file.

Does anybody have any ideas as to why the player wouldn't like the file above?

Has anybody had success playing files from Shinobi (it uses FFMPEG under the covers.)?

It does play other files like:

https://coderslegacy.com/wp-content/uploads/2020/07/Pygame_Platformer-1.mp4";

I expect the video to play without errors or for the player to tell me why it can not play the video.

Here is my code:

package com.example.videotester;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaErrorEvent;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Stage;

import java.io.File;

public class HelloApplication extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        Button button1 = new Button("Play");
        Button button2 = new Button("Pause");
        Button button3 = new Button("Stop");

        String path = "C:/Users/Rob/Desktop/rlrO5DVBJS-2022-10-26T20-52-34.mp4";
        File f = new File(path);
        path = f.toURI().toString();
//        path="http://192.168.1.239:8080/532046fecc8da376f3f32f5518bad33b/videos/NUW6mXm9CF/rlrO5DVBJS/2022-10-26T14-32-07.mp4";
//        path="http://192.168.1.239:8080/2921f1ca7204e640734709e29fc2033f/hls/NUW6mXm9CF/rlrO5DVBJS/s.m3u8";
//        path="http://192.168.1.239:8080/2921f1ca7204e640734709e29fc2033f/h265/NUW6mXm9CF/rlrO5DVBJS/s.hevc";
//        path="http://192.168.1.239:8080/2921f1ca7204e640734709e29fc2033f/mp4/NUW6mXm9CF/rlrO5DVBJS/s.mp4";
//        path="http://192.168.1.239:8080/5ee9ca532fd17f860e3cef43a288b951/mjpeg/NUW6mXm9CF/rlrO5DVBJS"; //mjpeg
//        path="http://192.168.1.239:8080/f7fb8d581d5aab4ebb8732de13b61337/videos/NUW6mXm9CF/rlrO5DVBJS/2022-10-26T15-57-19.mp4";
//        path="http://192.168.1.239:8080/5ee9ca532fd17f860e3cef43a288b951/videos/NUW6mXm9CF/rlrO5DVBJS/2022-10-27T19-49-31.mp4";
//        path="http://192.168.1.239:8080/c6c8a86382548433c505d9e7cf7c2085/videos/NUW6mXm9CF/rlrO5DVBJS/2022-10-26T04-05-00.mp4";
//        path="https://coderslegacy.com/wp-content/uploads/2020/07/Pygame_Platformer-1.mp4";
//        path="https://www.dropbox.com/s/h1ky0he5dvclhkt/rlrO5DVBJS-2022-10-30T20-53-29.mp4?dl=0";
        //Instantiating Media class
//        Media media = new Media(new File(path).toURI().toString());
        //URL url = new URL(path);
        final Media media;
        final MediaPlayer mediaPlayer;
        MediaView mediaView  = null;
        try {
            media = new Media(path);
            if (media.getError() == null) {
                media.setOnError(() -> System.out.println("media player error : " + media.getError()));
                try {
                    mediaPlayer = new MediaPlayer(media);
                    mediaPlayer.setAutoPlay(true);
                    button1.setOnAction(e -> mediaPlayer.play());
                    button2.setOnAction(e -> mediaPlayer.pause());
                    button3.setOnAction(e -> mediaPlayer.stop());

                    mediaPlayer.setOnReady(() -> System.out.println("Video player ready"));

                    if (mediaPlayer.getError() == null) {
                        mediaPlayer.setOnError(() -> System.out.println("media player error : " + mediaPlayer.getError()));
                        mediaView = new MediaView(mediaPlayer);
                        mediaView.setOnError(mee -> System.out.println("media view error : " + t));
                    } else
                        System.out.println("Error in media player: " + mediaPlayer.getError());
                } catch (Exception mediaPlayerException) {
                    System.out.println("media player exception " + mediaPlayerException);
                }
            } else
                System.out.println("Error media creating media " + media.getError());
        } catch (Exception mediaException) {
            // Handle exception in Media constructor.
            System.out.println("Handle exception " + mediaException);
            System.exit(1);
        }

        GridPane layout = new GridPane();
        layout.setHgap(10);
        layout.setVgap(10);

        layout.add(button1, 0, 0);
        layout.add(button2, 1, 0);
        layout.add(button3, 2, 0);
        layout.add(mediaView, 0, 1, 4, 1);

        Scene scene = new Scene(layout, 300, 200);

        stage.setTitle("Video Player Tester");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
0009laH
  • 1,960
  • 13
  • 27

1 Answers1

5

Rob - your file in https://www.dropbox.com/s/h1ky0he5dvclhkt/rlrO5DVBJS-2022-10-30T20-53-29.mp4?dl=0 has a color subsampling of 4:2:2 (color information scaled to 50%) most consumer video is 4:2:0 (color information scaled to 25%).

The file at https://coderslegacy.com/wp-content/uploads/2020/07/Pygame_Platformer-1.mp4 is 4:2:0.

I am guessing that the Java media player is passing the video to the operating system and the OS's default decoder may not support the higher color resolution of 4:2:2.

Markus Schumann
  • 7,636
  • 1
  • 21
  • 27
  • Thanks, I'll look at the color resolution. VLC plays the file without any issues on the same machine though. I also noticed that the player status is "UNKNOWN" after I click play so the player isn't transitioning to a playing state. – Rob Ratcliff Oct 31 '22 at 16:24
  • 1
    @RobRatcliff Regarding your _"VLC plays the file without any issues on the same machine though..."_ is because of VLC using it's own custom decoders and therefore handling any picture format. VLC is powered by FFmpeg... See if there is a setting for outputting as 4:2:0 or YUV420 picture format. – VC.One Nov 01 '22 at 09:47
  • Markus and VC.One , you all were correct. I added this flag to the recording output format "-pix_fmt yuv420p". Thanks for the great input! I haven't figured out yet a streaming setting available in Shinobi that JavaFX's media player can grock yet. It doesn't look like mjpeg is supported by the player. – Rob Ratcliff Nov 01 '22 at 17:10