You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX MediaPlayer静默无法播放Shinobi生成的H264/MPEG4视频

问题:JavaFX MediaView无法播放Shinobi生成的视频文件/流

我尝试用MediaView播放Shinobi媒体服务器生成的视频流及文件,但始终无法正常播放。当前使用Java 18搭配JavaFX 19,也试过更低版本,问题依然存在。

我有一个Shinobi生成的MP4示例文件,它能在VLC中正常播放,文件属性如下:

编码格式: H264 - MPEG-4 AVC (part 10) (avc1)
视频分辨率: 1280x720
解码格式: Planar 4:2:2 YUV full scale
色度位置: left

我已经为MediaPlayer、MediaView和Media对象都添加了错误处理器,但尝试播放该文件时,没有任何错误信息输出。

请问有人知道为什么播放器无法播放这类文件吗?有没有人成功播放过Shinobi生成的文件(Shinobi底层基于FFMPEG)?

我的播放器可以正常播放其他MP4文件,比如公开测试视频。我期望视频能正常播放,或者播放器能明确告知无法播放的原因。

以下是我的测试代码:

package com.example.videotester;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.media.Media;
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";
        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 : " + mee));
                    } 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) {
            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();
    }
}

内容的提问来源于stack exchange,提问作者Rob Ratcliff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:45:38