Videoeffekt Algorithmus

nautiLus`

Erfahrenes Mitglied
Hallo,
ich bin auf der Suche nach einer Möglichkeit, einen Videoeffekt mit Java zu programmieren. Im Programm selbst kann man eine Videodatei auswählen und über Slider kann man Effektparameter setzen. Folgende Parameter sollen dem Videoeffekt mitgegeben werden: Helligkeit und Geschwindigkeit
Es handelt sich dabei um einen, durch das Bild wandernden Flimmerbalken!

Hat wer eine Idee wie man da am besten vorgeht?

Danke, Nauti
 
Hallo!

Schau mal hier:
Code:
/*
 * Created on 01.01.2005@19:32:11
 *
 * TODO Licence info
 */
package de.tutorials;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferStrategy;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

/**
 * @author Administrator
 * 
 * TODO Explain what I do...
 */
public class MovieEffect extends JFrame {

	private final static Dimension DIM = new Dimension(320, 240);

	private BufferStrategy strategy;

	private Image img;

	private int y, effectWidth = DIM.width, effectHeight = 75;

	private float alpha = 0.33F; //"Helligkeit"

	private Thread runner = new Thread() {
		 {
		 setPriority(MIN_PRIORITY);
		 }

		public void run() {

			int tmpH = 0;
			int tmpY = 0;

			while (true) {

				Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
				g.clearRect(0, 0, DIM.width, DIM.height);
				g.drawImage(img, 0, 0, DIM.width, DIM.height, null);
				g.setColor(Color.GRAY);

				AlphaComposite composite = AlphaComposite.getInstance(
						AlphaComposite.SRC_OVER, alpha);
				g.setComposite(composite);

				g.fillRect(0, y, effectWidth, effectHeight);

				y += 3; // "Geschwindigkeit"
				y %= DIM.height;
				g.dispose();
				strategy.show();

				try {
					sleep(50L);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	};

	public MovieEffect() {
		super("MovieEffect");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(DIM);
		setVisible(true);
		createBufferStrategy(2);
		strategy = getBufferStrategy();
		try {
			img = ImageIO.read(new File("c:/rose.jpg"));
			// img = img.getScaledInstance(DIM.width, DIM.height,
			// Image.SCALE_SMOOTH);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public static void main(String[] args) {
		new MovieEffect().start();
	}

	/**
	 * 
	 */
	private void start() {
		runner.start();
	}
}

Gruß Tom
 
Hallo,

danke mal für die Hilfe, schaut sehr nett aus...

Da hab ich gleich mal eine Frage dazu. Da ich es ja nicht mit einen Bild in Verbindung machen soll, sondern mit einem Video, stell ich mir die Frage, obs nun vernünftiger wäre, den Code so abzuändern, dass es mit einem Video funktioniert, oder ob ich einfach das Video im Hintergrund des Effektes abspielen lassen soll?

Sind beide Varianten grundsätzlich möglich?

Ciao, Nauti

//edit: um Videos abzuspielen, benutze ich z.B. den Code hier: class PlayVideo in Verbindung mit dem JMF
 
Zuletzt bearbeitet:
Hallo, also ich habe nun versucht obige Codeteile von PlayVideo und MovieEffect zu vereinen, was auch geht, nur leider ist der Effekt hinter dem Video und der Kontroll Component vom Video "flackert" immer auf und ab.

Code:
import javax.swing.*;
import javax.media.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.awt.image.BufferStrategy;

public class MediaPlayer extends JFrame 
{
    Player player;
    Component center;
    Component south;
	private static Dimension DIM = new Dimension(340, 240);
	private BufferStrategy strategy;
	private int y, effectWidth = DIM.width, effectHeight = 75;
	private float alpha = 0.44F; //"Helligkeit"
	
	private Thread runner = new Thread() 
	{
		 {
		 setPriority(MIN_PRIORITY);
		 }

		public void run() {

			int tmpH = 0;
			int tmpY = 0;

			while (true) 
			{
				Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
				g.clearRect(0, 0, DIM.width, DIM.height);
				g.setColor(Color.GRAY);

				AlphaComposite composite = AlphaComposite.getInstance(
						AlphaComposite.SRC_OVER, alpha);
				g.setComposite(composite);

				g.fillRect(0, y, effectWidth, effectHeight);

				y += 20; // "Geschwindigkeit"
				y %= DIM.height;
				
				g.dispose();
				strategy.show();
				try {
					sleep(50L);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	};
    
	public static void main(String[] args) 
	{
		new MediaPlayer("f:/java/videos/test.mpg").runner.start();		
	}

	public MediaPlayer(String f) 
	{
		setDefaultCloseOperation(EXIT_ON_CLOSE);
						
		File file = new File(f);

		setSize(DIM);
		setVisible(true);
		createBufferStrategy(2);
		strategy = getBufferStrategy();
				
        try {
            process(file);
        } catch (Exception e) {
            System.err.println("Try again: " + e);
        }
        pack();
        show();
        
	}
    public void process(final File file) throws Exception {
    	
        URL url = file.toURL();
        
        final Container contentPane = getContentPane();
        
        if (player != null) {
            System.out.println("Try again2: ");
            player.stop();
        }
        
        player = Manager.createPlayer(url);
        
        ControllerListener listener = new ControllerAdapter() 
        {
            public void realizeComplete(
      
            RealizeCompleteEvent event) 
            {
                Component vc = player.getVisualComponent();
                
                if (vc != null) {
                    contentPane.add(vc, BorderLayout.CENTER);
                    center = vc;
                }
                else {
                    if (center != null) {
                        contentPane.remove(center);
                        contentPane.validate();
                    }
                }
                
                Component cpc = player.getControlPanelComponent();
                
                if (cpc != null) {
                    contentPane.add(cpc, BorderLayout.SOUTH); south = cpc;
                } else {
                    if (south != null) {
                        contentPane.remove(south);
                        contentPane.validate();
                    }
              	}
                pack();
                setTitle(file.getName());
            }
        };

        player.addControllerListener(listener);
        player.start();

    }
}


Weiters wüsst ich noch gerne, wie ich kontrolliere, ob die Videogröße verändert wurde, damit in den Flimmerbalken anpassen kann. Nach was muss ich da suchen?

Ciao, Nauti

//edit: ist die Lösung mit dem Video als Hintergrund und dem Flimmerbalken im Vordergrund doch nicht so gut? Problematisch würds dann werden, wenn ichs per RTP Sendem muss, denn ich vermute, dass der Effekt dann direkt im Video sein muss richtig?
 
Zuletzt bearbeitet:
Hallo!

Also ich habe bisher noch nicht allzuviel mit dem JMF gemacht jedoch würde ich trotzdem sagen, dass du für den Effekt direkt an die Bilddaten der einzelnen Videoframes ran müsstest und ja, wenn du den Effekt streamen willst musst dieser natürlich im Videostrom mitintegriert sein.

Gruß Tom
 
Hallo,

ohne jetzt detailliert deine Frage zu lesen. Hast Du dich schonmal mit dem JavaMedia Framework (JMF) auseinandergesetzt?

Kann mich erinnern mittels dieses Frameworks während meines Studiums auch einen Video-Server und player programmiert zu haben. vielleicht hilft dir das weiter. Hat auch funktionen wie graustufen etc.


Gruss

Torsten.
 
Hallo, danke für die Tipps.

Mittlerweile hab ich den Effekt schon direkt im Video.
Geholfen hat mit dabei diese (Beispiel)Klasse von Sun: RotationEffect
Darin gibt es eine Methode process(), welche denm Effekt mithilfe von 2 for Schleifen in das Video "einarbeitet". Ein paar Änderungen und Rechnungen ergeben dann einen Flimerbalken.

@torsch: Ja, ich beschäftige mich gerade damit :)
Wir machen zur Zeit auf der Uni einen solchen Video Player, der halt einiges können muss.

Ciao Nauti
 
Zurück