gpt4 book ai didi

java - JavaFX 不支持 MP4?

转载 作者:搜寻专家 更新时间:2023-10-31 19:47:09 24 4
gpt4 key购买 nike

因此,我最近开始使用 JavaFX 尝试将视频和音频插入到我的 Java 程序中。音频工作正常,但出于某种原因,每次我尝试播放视频文件时,它都会返回 MEDIA_UNSUPPORTED 异常。我已经阅读并看到视频文件需要是 MP4(它是),所以我尝试将其转换为不同的类型,然后使用一些不同的转换器将其重新转换为 MP4(H.264 和 AAC),并且没有任何变化。

这是我正在使用的代码:

import java.net.URL;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.embed.swing.JFXPanel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.util.Duration;


public class CallVideo extends JFrame{

public static final String VID_URL = "file:/C:/Users/Public/Videos/Videos/testCon.mp4"; //http://static.clipcanvas.com/sample/clipcanvas_14348_H264_320x180.mp4

private JFXPanel panel;

public CallVideo(String url)
{
panel = new JFXPanel();
Platform.runLater(new Runnable()
{
public void run()
{
final Media clip = new Media(VID_URL);
final MediaPlayer player = new MediaPlayer(clip);
final MediaView viewer = new MediaView(player);
viewer.setFitHeight(200);
viewer.setFitWidth(200);
final Button button = new Button("Bing Zzzzt!");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event)
{
viewer.getMediaPlayer().seek(Duration.ZERO);
viewer.getMediaPlayer().play();
}
});

setMediaEventHandlers(viewer);
VBox vid = new VBox();
vid.getChildren().addAll(viewer, button);
Scene aScene = new Scene(vid, 200, 200);
panel.setScene(aScene);
}
});
this.add(panel);
this.setSize(500, 500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}

private void setMediaEventHandlers(final MediaView view) {
final MediaPlayer player = view.getMediaPlayer();

System.out.println("Initial: " + player.getStatus());
player.statusProperty().addListener(new ChangeListener<MediaPlayer.Status>() {
@Override
public void changed(ObservableValue<? extends MediaPlayer.Status> observable, MediaPlayer.Status oldStatus, MediaPlayer.Status curStatus) {
System.out.println("Current: " + curStatus);
}
});

if (player.getError() != null) {
System.out.println("Initial Error: " + player.getError());
}

player.setOnError(new Runnable() {
@Override public void run() {
System.out.println("Current Error: " + player.getError());
}
});
}

public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new CallVideo(VID_URL);
}
});
}

错误发生在初始化“媒体”对象的行(构造函数的开头)。我完全不知道问题是什么。我已经看到有关音频播放但视频未显示的问题,但它甚至没有为我做到这一点...

如果有人需要它:

eclipse

JDK 7

JavaFX 2.0

Windows 7 专业版

编辑:

首先,我注意到我实际上使用的是 JavaFX 2.0...这可能是问题所在吗?

我已经测试了答案中提供的两个版本,并且在使用该答案提供的 URL 时都返回此错误(由 statusListener 调用):

Current Error: MediaException: MEDIA_UNSUPPORTED : com.sun.media.jfxmedia.MediaException: "Error enter code herelocator unsupported media format" : com.sun.media.jfxmedia.MediaException: "Error locator unsupported media format"

当使用我自己的文件时,程序会像以前一样在调用媒体构造函数后立即返回此错误:

Exception in thread "AWT-EventQueue-0" MediaException: MEDIA_UNSUPPORTED : Unrecognized file signature!
at javafx.scene.media.Media.<init>(Media.java:382)
at CallVideo.<init>(CallVideo.java:27)
at CallVideo$5.run(CallVideo.java:90)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

我已经更新了上面使用的代码。

已解决!原因实际上是我在工作中使用了不合适的 JavaFX(可能还有 JDK)。我并不能真正控制这些东西,因为这些是学校的电脑,但这把我搞砸了一些好东西……谢谢你的帮助!我用我的最终代码更新了它。

最佳答案

在我稍微修改了您的程序以解决几个问题后,这对我有用。

swingvideoplayer

我应用的一些更改:

  1. A MediaView是观看视频所必需的,因此需要创建一个并将其添加到 Activity 的 JavaFX 场景中,以便观看视频。
  2. 一些 JavaFX 控件需要在 JavaFX 应用程序线程而不是主线程上创建,否则您会得到 java.lang.IllegalStateException: Toolkit not initialized
  3. 监控媒体错误事件并添加一些诊断日志有助于解决媒体编码问题。

仅限 JavaFX 的解决方案

您的程序将 JavaFX 嵌入到 Swing 应用程序中,这比在标准 JavaFX 应用程序中播放媒体要复杂一些。在我的回答中提供了在标准 JavaFX 应用程序中播放 mp4 的相应代码:Can't play mp4 converted file - JavaFX 2.1 .除非您对 Swing 有特定需求(例如将基于 JavaFX 的媒体播放器嵌入到现有的大型 Swing 应用程序中),否则建议仅使用 JavaFX。

Oracle 为Incorporating Media Assets Into JavaFX Applications 提供了很好的教程.


JavaFX media package description记录 JavaFX 支持的媒体播放编码、容器和协议(protocol)。


使用 JavaFX MediaPlayer 从 Swing 应用程序播放 mp4 视频的示例

请注意,示例仅捕获了一部分可能的媒体错误。有关可以捕获和记录所有媒体错误的代码模板,请参阅 JavaFX media error handling documentation .

import javax.swing.*;
import javafx.application.Platform;
import javafx.beans.value.*;
import javafx.embed.swing.JFXPanel;
import javafx.event.*;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.scene.media.*;
import javafx.util.Duration;

public class VideoPlayer extends JFrame {

public static final String VID_URL =
"http://static.clipcanvas.com/sample/clipcanvas_14348_H264_320x180.mp4";

private static final int VID_WIDTH = 320;
private static final int VID_HEIGHT = 180;
private static final int PLAYER_WIDTH = 320;
private static final int PLAYER_HEIGHT = 265;

private void play(final String url) {
final JFXPanel panel = new JFXPanel();
Platform.runLater(new Runnable() {
@Override public void run() {
initFX(panel, url);
}
});
this.add(panel);
this.setSize(PLAYER_WIDTH, PLAYER_HEIGHT);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}

private void initFX(JFXPanel panel, String url) {
MediaView mediaView = createMediaView(url);

final Scene playerScene = new Scene(
createPlayerLayout(mediaView),
PLAYER_WIDTH,
PLAYER_HEIGHT
);

setMediaEventHandlers(
mediaView
);

panel.setScene(playerScene);
}

private MediaView createMediaView(String url) {
final Media clip = new Media(url);
final MediaPlayer player = new MediaPlayer(clip);
final MediaView view = new MediaView(player);
view.setFitWidth(VID_WIDTH);
view.setFitHeight(VID_HEIGHT);
return view;
}

private VBox createPlayerLayout(final MediaView view) {
final Button button = new Button("Play From Start");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
view.getMediaPlayer().seek(Duration.ZERO);
view.getMediaPlayer().play();
}
});

final VBox layout = new VBox(8);
layout.setAlignment(Pos.CENTER);
layout.getChildren().addAll(
view,
button
);

layout.setStyle("-fx-background-color: linear-gradient(to bottom, derive(lightseagreen, -20%), lightseagreen);");

return layout;
}

private void setMediaEventHandlers(final MediaView view) {
final MediaPlayer player = view.getMediaPlayer();

System.out.println("Initial: " + player.getStatus());
player.statusProperty().addListener(new ChangeListener<MediaPlayer.Status>() {
@Override
public void changed(ObservableValue<? extends MediaPlayer.Status> observable, MediaPlayer.Status oldStatus, MediaPlayer.Status curStatus) {
System.out.println("Current: " + curStatus);
}
});

if (player.getError() != null) {
System.out.println("Initial Error: " + player.getError());
}

player.setOnError(new Runnable() {
@Override public void run() {
System.out.println("Current Error: " + player.getError());
}
});
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
VideoPlayer player = new VideoPlayer();
player.play(VID_URL);
}
});
}
}

已解决!

很高兴看到原始发布者能够让视频播放正常工作,最后的错误只是使用不支持 mp4 播放的旧 JavaFX 版本 (2.0)。更新到 JavaFX 2.2+(支持 mp4 播放)解决了这个问题。

关于java - JavaFX 不支持 MP4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16322983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com