Видеоэффекты в JMF - PullRequest
       28

Видеоэффекты в JMF

0 голосов
/ 21 октября 2011

Мне удалось создать импровизированный видеопроигрыватель на 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 Ответ

1 голос
/ 21 мая 2012

привет, это мой первый пост на любом форуме, извините за ошибки.

для прикрепления любого видеоэффекта необходимо использовать «процессор»

Вот пример кода для добавления процессора и добавления к нему эффекта:

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

ссылка для класса эффекта:


re:

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

в этих местах моей программы я прекращал выполнение, пока процессор не достигнет состояния, но если состояние не достижимо, то приграмма попадает в бесконечный цикл. JMF предоставляет класс StaeHelper, чтобы решить проблему с Google для этого.


...