Rob*_*iff 5 mp4 javafx media-player h.264 shinobi
我想用来MediaView播放 Shinobi 媒体服务器生成的视频流和视频文件,但MediaView似乎无法处理 Shinobi 生成的任何流或文件。
我正在使用 Java 18 和 JavaFX 19(我也尝试过旧版本)。
我这里有一个由 Shinobi 生成的示例文件。
在VLC中运行良好,这表明该文件具有以下属性:
编解码器: H264 - MPEG-4 AVC(第 10 部分)(avc1)
视频分辨率: 1280x720
解码格式: Planar 4:2:2 YUV 全尺寸
色度位置:左侧
我已向MediaPlayer、MediaView和Media对象添加了错误处理程序,但当我尝试播放该文件时没有错误。
有人知道为什么玩家不喜欢上面的文件吗?
有人成功播放 Shinobi 的文件吗(它在幕后使用 FFMPEG。)?
它确实播放其他文件,例如:
https://coderslegacy.com/wp-content/uploads/2020/07/Pygame_Platformer-1.mp4";
Run Code Online (Sandbox Code Playgroud)
我希望视频能够正常播放,或者让播放器告诉我为什么无法播放视频。
这是我的代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
Rob - https://www.dropbox.com/s/h1ky0he5dvclhkt/rlrO5DVBJS-2022-10-30T20-53-29.mp4?dl=0中的文件的 颜色子采样为 4:2:2(颜色信息缩放)到 50%)大多数消费者视频是 4:2:0(颜色信息缩放到 25%)。
https://coderslegacy.com/wp-content/uploads/2020/07/Pygame_Platformer-1.mp4上的文件为 4:2:0。
我猜测 Java 媒体播放器正在将视频传递给操作系统,而操作系统的默认解码器可能不支持 4:2:2 的更高颜色分辨率。