我使用JMF在Java中创建了一个临时视频播放器。源代码如下所示。我想要附加视频效果,例如将每一帧转换为灰度,并使用JMF向每一帧添加文本标题。
有关JMF视频效果的信息似乎令人惊讶地缺乏。我将如何创建过滤器(或编解码器,或任何它们被称为)来执行上述任务?
import java.awt.*;
import javax.swing.*;
import javax.media.*;
import javax.media.format.*;
import javax.media.protocol.*;
import javax.media.control.*;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.*;
public class MediaPlayer extends JFrame
{
public MediaPlayer()
{
}
public static void main (String[] args)
{
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
try {
URL mediaURL = new File("video.avi").toURI().toURL();
Player mediaPlayer = Manager.createRealizedPlayer(mediaURL);
Component video = mediaPlayer.getVisualComponent();
Component controls = mediaPlayer.getControlPanelComponent();
frame.add(video,BorderLayout.CENTER);
frame.add(controls,BorderLayout.SOUTH);
frame.setVisible(true);
}
catch (MalformedURLException e) {
System.out.println(e.toString());
}
catch (IOException e) {
System.out.println(e.toString());
}
catch (NoPlayerException e) {
System.out.println(e.toString());
}
catch (CannotRealizeException e) {
System.out.println(e.toString());
}
}
}发布于 2012-05-21 11:53:44
嗨,这是我在任何论坛上的第一篇帖子,对错误感到抱歉。
要附加任何视频效果,您需要使用“处理器”。
下面是添加处理器并向其添加效果的代码示例:
String strDevName = "your Media MRL";
CaptureDeviceInfo devInfo = CaptureDeviceManager.getDevice(strDevName);
MediaLocator ml = devInfo.getLocator();
DataSource ds;
Processor p;
try{
ds = Manager.createDataSource( ml);
p = Manager.createProcessor(ds);
p.configure();
while(p.getState() != p.Configured);
p.setContentDescriptor(null);
TrackControl[] controls = p.getTrackControls();
controls[0].setFormat(new VideoFormat( VideoFormat.YUV ));//Specify the Video format of the video specified in the MRL
Codec codec[]= { new comp311.jmf.effect.GreyEffect() };//class GrayEffect is a implementation of javax.media.Effect (the link for the class given below)
controls[0].setCodecChain(codec);
p.realize();
while(p.getState() != p.Realized);
p.prefetch();
while(p.getState() != p.Prefetched);
video = p.getVisualComponent();
if ( video != null ) {System.out.println("Prefetched2");
pnlVideo.add( video, BorderLayout.CENTER );//pnlVideo is a JPanel
p.start();
}
}catch(Exception e){}effect类的链接:
关于:
while(p.getState() != p.Configured);
while(p.getState() != p.Realized);
while(p.getState() != p.Prefetched);在我的程序的这个地方,我停止了执行直到处理器achives一个状态,但如果状态是不可实现的,那么素数到无限循环。JMF提供了一个StaeHelper类来克服google的问题。
https://stackoverflow.com/questions/7847217
复制相似问题