2011-10-21 43 views
0

我设法使用JMF在Java中创建了一个临时视频播放器。源代码如下。我想附加视频效果,比如将每个帧转换为灰度,并使用JMF为每个帧添加文本标题。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()); 
     } 
    } 
} 

回答

1

嗨,这是我在任何论坛的第一篇文章,如此抱歉的错误。

附加你需要使用“处理器”

这里的任何视频效果是一个代码示例处理器添加以及添加效果吧:

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){} 

the link for the effect class :


re:

while(p.getState() != p.Configured); 
while(p.getState() != p.Realized); 
while(p.getState() != p.Prefetched); 

在我的程序的这个地方,我停止了被迫执行,直到处理器达到一个状态,但是如果状态不可行,那么这个prigram gos会进入一个无限循环。 JMF给出了一个StaeHelper类来克服它的谷歌问题。