初学了一段时间Java。想做一个应用程序,程序只需要播放一个本地视频,MP4格式,求教怎么做

初学了一段时间Java。想做一个应用程序,程序只需要播放一个本地视频,MP4格式,求教怎么做,第1张

使用javafx的Media,MediaPlayer,MediaView。代码如下:

import javaioFile;

import javafxapplicationApplication;

import javafxbeansbindingBindings;

import javafxbeanspropertyReadOnlyProperty;

import javafxbeansvalueObservableValue;

import javafxeventActionEvent;

import javafxgeometryPos;

import javafxsceneScene;

import javafxscenecontrolButton;

import javafxscenecontrolMenu;

import javafxscenecontrolMenuBar;

import javafxscenecontrolMenuItem;

import javafxscenecontrolSlider;

import javafxsceneimageImage;

import javafxsceneimageImageView;

import javafxscenelayoutBorderPane;

import javafxscenelayoutHBox;

import javafxscenelayoutPane;

import javafxscenelayoutVBox;

import javafxscenemediaMedia;

import javafxscenemediaMediaPlayer;

import javafxscenemediaMediaPlayerStatus;

import javafxscenemediaMediaView;

import javafxstageFileChooser;

import javafxstageFileChooserExtensionFilter;

import javafxstageStage;

import javafxutilDuration;

public class App extends Application {

private MediaView mediaView;

private Slider processSlider;

private static final Object AUTO = new Object(), MANUAL = new Object();

public static void main(String[] args) {

launch(args);

}

@Override

public void start(Stage primaryStage) throws Exception {

primaryStagesetTitle("javafx视频播放器");

        

        BorderPane root = new BorderPane();

        // 菜单栏

        initMenu(root);

        // 视频播放控件

        mediaView = initMediaView(root);

        // 视频功能控件

        initMediaControllView(root);

        

        primaryStagesetScene(new Scene(root, 600, 400));

        primaryStagesetOnCloseRequest(event -> Systemexit(0));

        primaryStageshow();

}

private MenuBar initMenu(final BorderPane parent) {

        Menu menu = new Menu("菜单");

        MenuItem item = new MenuItem("打开");

        itemsetOnAction(event -> {

         FileChooser chooser = new FileChooser();

         choosersetTitle("选择视频文件");

         choosergetExtensionFilters()add(new ExtensionFilter("视频文件", "mp4", "flv"));

         File file = choosershowOpenDialog(parentgetScene()getWindow());

         if (file != null) {

         MediaPlayer player = mediaViewgetMediaPlayer();

         // 关闭当前的player

         if (player != null) {

         playerstop();

         playerdispose();

         }

         processSlidersetValue(0);

         // 创建一个新的player并自动播放

         player = new MediaPlayer(new Media(filetoURI()toString()));

         playercurrentTimeProperty()addListener(this::mediaProcessChanged);

         playersetAutoPlay(true);

         mediaViewsetMediaPlayer(player);

         }

        });

        menugetItems()add(item);

        

        item = new MenuItem("退出");

        itemsetOnAction(event -> parentgetScene()getWindow()hide());

        menugetItems()add(item);

        

        MenuBar menuBar = new MenuBar(menu);

        parentsetTop(menuBar);

        return menuBar;

}

private MediaView initMediaView(final BorderPane parent) {

        MediaView view = new MediaView();

        Pane pane = new Pane(view);

        parentsetCenter(pane);

        // 视频宽高可随着窗口变化而自动缩放

        viewfitWidthProperty()bind(BindingsselectDouble(viewparentProperty(), "width"));

        viewfitHeightProperty()bind(BindingsselectDouble(viewparentProperty(), "height"));

        viewsetPreserveRatio(true);

        

return view;

}

private void initMediaControllView(final BorderPane parent) {

VBox bottom = new VBox(10);

bottomsetAlignment(PosCENTER);

parentsetBottom(bottom);

Slider slider = new Slider(0, 100, 0);

slidervalueProperty()addListener(this::processSliderChanged);

// slidersetOnMouseClicked(this::processSliderClicked);

bottomgetChildren()add(slider);

processSlider = slider;

HBox hbox = new HBox(10);

bottomgetChildren()add(hbox);

hboxsetAlignment(PosCENTER);

Button btn = new Button(null, new ImageView(loadImage("pausepng")));

btnsetOnAction(this::pauseOrPlay);

hboxgetChildren()add(btn);

btn = new Button(null, new ImageView(loadImage("stoppng")));

btnsetOnAction(this::stopPlay);

hboxgetChildren()add(btn);

}

private static Image loadImage(String resPath) {

return new Image(ThreadcurrentThread()getContextClassLoader()getResourceAsStream(resPath));

}

private void pauseOrPlay(ActionEvent event) {

MediaPlayer player = mediaViewgetMediaPlayer();

if (player == null) {

return;

}

Status status = playergetStatus();

if (status == StatusREADY || status == StatusPAUSED) {

playerplay();

((Button) eventgetTarget())setGraphic(new ImageView(loadImage("pausepng")));

} else if (status == StatusPLAYING) {

playerpause();

((Button) eventgetTarget())setGraphic(new ImageView(loadImage("playpng")));

}

}

private void stopPlay(ActionEvent event) {

MediaPlayer player = mediaViewgetMediaPlayer();

if (player == null) {

return;

}

playerstop();

}

// private void processSliderClicked(MouseEvent event) {

// Slider slider = (Slider) eventgetSource();

// if (mediaViewgetMediaPlayer() != null) {

// Duration d = mediaViewgetMediaPlayer()getTotalDuration()multiply(slidergetValue() / slidergetMax());

// mediaViewgetMediaPlayer()seek(d);

// }

// }

private void processSliderChanged(ObservableValue< extends Number> observable, Number oldValue, Number newValue) {

Slider slider = (Slider) ((ReadOnlyProperty< extends Number>) observable)getBean();

if (slidergetUserData() == AUTO) { // 进度条是自动改变的,因此不用设置播放器

slidersetUserData(null);

return;

}

if (mediaViewgetMediaPlayer() != null) {

slidersetUserData(MANUAL);

Duration d = mediaViewgetMediaPlayer()getTotalDuration()multiply(newValuedoubleValue() / slidergetMax());

mediaViewgetMediaPlayer()seek(d);

}

}

private void mediaProcessChanged(ObservableValue< extends Duration> observable, Duration oldValue, Duration newValue) {

if (processSlidergetUserData() == MANUAL) { // 手动点击进度条

processSlidersetUserData(null);

return;

}

MediaPlayer player = (MediaPlayer) ((ReadOnlyProperty< extends Duration>) observable)getBean();

processSlidersetUserData(AUTO);

processSlidersetValue(newValuetoMillis() / playergetTotalDuration()toMillis()  100);

}

}

对声音媒体的直接支持可以说是Java的一大特色,尤其是在动画中配上声音效果,就可以使人在视觉上和听觉上均得到美的享受,那才叫过瘾。Java中播放声音文件与显示图像文件一样方便,同样只需要先将声音文件装载进来,然后播放就行了。

Java目前支持的声音文件只有一种格式,那就是SUN公司的AU格式(AU文件),也称为u-law格式。由于AU格式的声音仅有8KHz的采样频率且不支持立体声效果,所以音质不算太好。唯一的好处就是AU声音文件的尺寸比其它格式小,有利于网上传输。一般,我们较熟悉的大都是WAV格式的声音文件,因此必须先将它们转换为AU格式(可以选用Goldwave软件来进行这种格式转换)。

声音文件准备好以后,就可以考虑将它装载进来并播放。在Applet类中提供的play( )方法可以将声音文件的装载与播放一并完成,其调用格式如下:

void play(URL url)

void play(URL url, String name)

可见,play( )方法的调用格式与getImage( )方法是完全一样的,也采用URL来定位声音文件。例如,某声音文件audioau与applet文件存放在同一目录下,可以这样写:

play(getCodeBase( ),"audioau");

一旦play( )方法装载了该声音文件,就立即播放。如果找不到指定URL下的声音文件,play( )方法不返回出错信息,只是听不到想听的声音而已。

由于play( )方法只能将声音播放一遍,若想循环播放某声音作为背景音乐,就需要用到功能更强大的AudioClip类,它能更有效地管理声音的播放 *** 作。因为它被定义在javaapplet程序包中,所以使用该类的话,不要忘了在程序头部加上:

import javaappletAudioClip;

为了得到AudioClip对象,我们可以调用Applet类中的getAudioClip( )方法。它能装载指定URL的声音文件,并返回一个AudioClip对象,其调用格式如下:

AudioClip getAudioClip(URL url)

AudioClip getAudioClip(URL url, String name)

得到AudioClip对象以后,就可以调用AudioClip类中所提供的各种方法来 *** 作其中的声音数据,这些方法如表4-4所示。

如果getAudioClip( )方法没有找到所指定的声音文件,就会返回null值。所以,在调用表4-4中所列的方法前,应该先检查一下得到的AudioClip对象不是null,因为在null对象上调用上述方法将导致出错。

如果需要的话,我们还可以在applet中同时装载几个声音文件来一起播放,到时候,这些声音将混合在一起,就象二重奏一样。另外还有一点要说明的是,如果我们使用AudioClip对象的loop( )方法来重复播放背景音乐时,千万不要忘记在适当的时候调用AudioClip对象的stop( )方法来结束放音,否则的话,即使用户离开这一Web页面,该声音也不会停止,这无疑将会惹恼用户。因此,一般我们都在applet的stop( )方法中添上停止播放的代码。

例如,下面这段程序将播放两段声音,一段是连续播放的背景音乐,另一段是讲话录音。

import javaappletAudioClip;

public class Audios extends javaappletApplet{

AudioClip bgmusic,speak;

public void init(){

bgmusic=getAudioClip(getDocumentBase(),"spaceau");

speak=getAudioClip(getDocumentBase(),"introau");

}

public void start(){

if(bgmusic!=null)

bgmusicloop();

if(speak!=null)

speakplay();

}

public void stop(){

if(bgmusic!=null)

bgmusicstop(); //关闭背景音乐,切记。

}

}

package comhongyuantest;

import javaioFile;

import javaioIOException;

import javaxsoundsampledAudioFormat;

import

javaxsoundsampledAudioInputStream;

import

javaxsoundsampledAudioSystem;

import

javaxsoundsampledDataLine;

import

javaxsoundsampledLineUnavailableException;

import

javaxsoundsampledSourceDataLine;

import

javaxsoundsampledUnsupportedAudioFileException;

public class MusicTest {

public static final String MUSIC_FILE = "相逢一笑wav";

public static void main(String[] args) throws

LineUnavailableException,

UnsupportedAudioFileException, IOException {

// 获取音频输入流

AudioInputStream audioInputStream =

AudioSystem

getAudioInputStream(new File(MUSIC_FILE));

//

获取音频编码对象

AudioFormat audioFormat = audioInputStreamgetFormat();

// 设置数据输入

DataLineInfo dataLineInfo = new

DataLineInfo(SourceDataLineclass,

audioFormat,

AudioSystemNOT_SPECIFIED);

SourceDataLine sourceDataLine =

(SourceDataLine)

AudioSystem

getLine(dataLineInfo);

sourceDataLineopen(audioFormat);

sourceDataLinestart();

/

从输入流中读取数据发送到混音器

/

int count;

byte tempBuffer[]

= new byte[1024];

while ((count = audioInputStreamread(tempBuffer, 0,

tempBufferlength)) != -1) {

if (count > 0)

{

sourceDataLinewrite(tempBuffer, 0, count);

}

}

//

清空数据缓冲,并关闭输入

sourceDataLinedrain();

sourceDataLineclose();

}

}

你好!我们所说的mp4仅仅只是一种视频封装格式,里面的视频流却有各种编码格式!就像瓶子装水一样,“瓶子”有各种形状,如mp4 avi wmv rmvb等等…而其中装的是什么液体就不一定了!所以,看似都是mp4文件,它的编码格式可能是H246编码,也可能是

Java可以使用第三方Java Media Framework(JMF)库来判断视频是否可播放,JMF支持多种视频格式,可以通过JMF的Player对象的getDuration()方法来判断视频是否可播放,如果getDuration()方法返回的值大于0,则说明视频是可播放的,反之则不可播放。步骤如下:

1、通过URL构造一个MediaLocator对象;

2、创建一个Player对象;

3、通过调用Player对象的getDuration()方法,判断视频是否可播放;

4、如果可以播放,调用Player对象的start()方法开始播放;

5、调用Player对象的stop()方法结束播放;

6、关闭Player对象。

以上就是关于初学了一段时间Java。想做一个应用程序,程序只需要播放一个本地视频,MP4格式,求教怎么做全部的内容,包括:初学了一段时间Java。想做一个应用程序,程序只需要播放一个本地视频,MP4格式,求教怎么做、java如何播放声音、谁知道如何用纯JAVA代码播放视频文件(可以播放一种视频文件,如mp4,就可以了)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9479454.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存