Hi all,
I´m having trouble with awful looking transitions.
What I do is take two pictures and create a movie from each with a set duration.
The code for creating the image movies is taken from a C example, though I´ve managed to do it with a different approach the result remains, awful.
I then use the movies for a transition(this code might look familiar to you). I used the code from 'Quicktime for Java' because I am sure this works. I have tried to set the AtomContainer by dialogue and create it myself, same difference :( - I had orginally converted the code for making the transition from the C example ´Slideshow´. But still the result is awful.
By awful I mean the Transition seems to halt at the begining of the tween and at the end, also the underlying tracks seems to differ in colour, making a very ´un´seemsless transition. I am running this with jre1.5.0_05 on Windows XP pro on a AMD Athlon 2500+.
Can any tell me why the resulting transition turns out that bad?
package com.joollu.quicktime.utils;
import java.io.File;
import java.io.IOException;
import quicktime.QTException;
import quicktime.QTSession;
import quicktime.io.IOConstants;
import quicktime.io.OpenMovieFile;
import quicktime.io.QTFile;
import quicktime.qd.QDConstants;
import quicktime.std.StdQTConstants;
import quicktime.std.image.GraphicsImporter;
import quicktime.std.image.ImageDescription;
import quicktime.std.movies.Atom;
import quicktime.std.movies.AtomContainer;
import quicktime.std.movies.EffectsList;
import quicktime.std.movies.Movie;
import quicktime.std.movies.ParameterDialog;
import quicktime.std.movies.Track;
import quicktime.std.movies.media.DataRef;
import quicktime.std.movies.media.HandlerInfo;
import quicktime.std.movies.media.Media;
import quicktime.std.movies.media.SampleInfo;
import quicktime.std.movies.media.VideoMedia;
import quicktime.std.qtcomponents.MovieExporter;
import quicktime.util.EndianOrder;
import quicktime.util.QTHandle;
import quicktime.util.QTUtils;
import quicktime.util.RawEncodedImage;
public class QTJTransition implements QDConstants, StdQTConstants, IOConstants{
public static final int VIDEO_TRACK_WIDTH = 800;
public static final int VIDEO_TRACK_HEIGHT = 600;
public static final int VIDEO_TRACK_VOLUME = 0;
public static final int KEY_FRAME_RATE = 30;
public static final int timeScale = 600;
public static final int CODEC_TYPE = kSorensonCodecType;
int curtainDuration = 200;
int effectDuration = 1500;
int videoDuration = effectDuration;
int effectStart = curtainDuration;
int TRANSITION_DURATION = effectDuration;
public QTJTransition() throws QTException, IOException {
File f1 = new File("img-2.mov");
File f2 = new File("img-3.mov");
Movie mA = createImageMovie(new File("2big.jpg"),f1,TRANSITION_DURATION * 2,VIDEO_TRACK_WIDTH,VIDEO_TRACK_HEIGHT);
Movie mB = createImageMovie(new File("3big.jpg"),f2,TRANSITION_DURATION * 2,VIDEO_TRACK_WIDTH,VIDEO_TRACK_HEIGHT);
saveMovie(mA,f1);
saveMovie(mB,f2);
File fTran = new File("t.mov");
Movie movTran = createEmptyMovie(fTran);
makeTransition(movTran,mA,mB,"2");
saveMovie(movTran,fTran);
}
/**
* from ´Quicktime for Java´ by Chris Adamson
*/
public void makeTransition(Movie movie,Movie sourceAMovie,Movie sourceBMovie,String type) throws QTException {
AtomContainer inputMap = new AtomContainer();
ImageDescription effectDesc = null;
AtomContainer ac = new AtomContainer();
ac.insertChild(Atom.kParentIsContainer, kEffectSourceName, 1, 0, EndianOrder.flipNativeToBigEndian32(QTUtils.toOSType("srcA")));
ac.insertChild(Atom.kParentIsContainer, kEffectSourceName, 2, 0, EndianOrder.flipNativeToBigEndian32(QTUtils.toOSType("srcB")));
EffectsList effectsList = new EffectsList (2, 2, 0);
AtomContainer effect =
ParameterDialog.showParameterDialog (effectsList,
0, // dialogOptions
null, // parameters
"Pick an effect", // title
null //pictArray
);
// find out the effect type by getting the "what" atom,
// whose data is a FOUR_CHAR_CODE
Atom what = effect.findChildByIndex_Atom (null,
StdQTConstants.kParameterWhatName,
1);
int effectType = effect.getAtomData(what).getInt(0);
effectType = EndianOrder.flipBigEndianToNative32(effectType);
System.out.println ("User chose " +
QTUtils.fromOSType(effectType) +
" effect type");
// make a sample description for the effect description
effectDesc = ImageDescription.forEffect (effectType);
//effectDesc = ImageDescription.forEffect(kWipeTransitionType);
effectDesc.setHeight(VIDEO_TRACK_HEIGHT);
effectDesc.setWidth(VIDEO_TRACK_WIDTH);
// ac.insertChild (Atom.kParentIsContainer, kEffectWipe, 1, 0, EndianOrder.flipNativeToBigEndian32(71));
Track preEffectTrack = addVideoTrack (sourceAMovie,
movie,
0,
sourceAMovie.getDuration( ) - TRANSITION_DURATION,
0);
Track sourceATrack = addVideoTrack (sourceAMovie,
movie,
sourceAMovie.getDuration( ) - TRANSITION_DURATION,
TRANSITION_DURATION,
sourceAMovie.getDuration( ) - TRANSITION_DURATION);
Track sourceBTrack = addVideoTrack (sourceBMovie,
movie,
0,
TRANSITION_DURATION,
movie.getDuration( ) - TRANSITION_DURATION);
Track postEffectTrack = addVideoTrack (sourceBMovie,
movie,
TRANSITION_DURATION,
sourceBMovie.getDuration( ) - TRANSITION_DURATION,
movie.getDuration( ));
Track effectTrack = movie.addTrack (VIDEO_TRACK_WIDTH,
VIDEO_TRACK_HEIGHT,
0);
int trackARef =
effectTrack.addReference (sourceATrack,
StdQTConstants.kTrackModifierReference);
int trackBRef =
effectTrack.addReference (sourceBTrack,
StdQTConstants.kTrackModifierReference);
Atom aInputAtom =
inputMap.insertChild (null,
StdQTConstants.kTrackModifierInput,
trackARef,
0);
inputMap.insertChild (aInputAtom,
StdQTConstants.kTrackModifierType,
1,
0,
EndianOrder.flipNativeToBigEndian32(StdQTConstants.videoMediaType));
inputMap.insertChild (aInputAtom,
StdQTConstants.kEffectDataSourceType,
1,
0,
EndianOrder.flipNativeToBigEndian32(QTUtils.toOSType ("srcA")));
Atom bInputAtom =
inputMap.insertChild (null,
StdQTConstants.kTrackModifierInput,
trackBRef,
0);
inputMap.insertChild (bInputAtom,
StdQTConstants.kTrackModifierType,
1,
0,
EndianOrder.flipNativeToBigEndian32(StdQTConstants.videoMediaType));
inputMap.insertChild (bInputAtom,
StdQTConstants.kEffectDataSourceType,
1,
0,
EndianOrder.flipNativeToBigEndian32(QTUtils.toOSType ("srcB")));
VideoMedia videoMedia = new VideoMedia(effectTrack,timeScale);
videoMedia.beginEdits();
videoMedia.addSample(ac,
0,
ac.getSize(),
TRANSITION_DURATION,
effectDesc,
1,
0
);
videoMedia.setInputMap(inputMap);
videoMedia.endEdits();
effectTrack.insertMedia (sourceAMovie.getDuration( ) - TRANSITION_DURATION, // trackStart
0, // mediaTime
TRANSITION_DURATION, // mediaDuration
1); // mediaRate
}
public Movie createImageMovie(File imgFile,File movieFile, int duration, int width, int height) throws QTException, IOException{
QTFile imageFile = new QTFile(imgFile);
Movie movie = createEmptyMovie(movieFile);
//GraphicsImporter gi = new GraphicsImporter();
//System.out.println(gi.getDataHandle());
DataRef dr = new DataRef(imageFile);
Movie refMovie = Movie.fromDataRef(dr,newMovieDontResolveDataRefs);
Track refTrack = refMovie.getIndTrack(1);
Media media = refTrack.getMedia();
//SampleDescription desc = new SampleDescription(0);
//System.out.println(desc.getSize());
GraphicsImporter importer = new GraphicsImporter(imageFile); // importer grafik fra billede
ImageDescription id = importer.getImageDescription();
SampleInfo si = media.getSampleReference(0,1);
HandlerInfo hi = media.getHandlerDescription();
Track imageTrack = movie.addTrack(width,height,VIDEO_TRACK_VOLUME);
VideoMedia vm = new VideoMedia(imageTrack,timeScale);
vm.addDataRef(dr);
vm.beginEdits();
int sampleDur = vm.addSampleReference(0,importer.getDataSize(),duration,id,1,0);//,duration,desc,1,0);
vm.endEdits();
imageTrack.insertMedia(0,0,duration,1);
saveMovie(movie,movieFile);
return movie;
}
public static void saveMovie(Movie movie,File file) throws QTException, IOException{
OpenMovieFile omf = OpenMovieFile.asWrite (new QTFile(file));
movie.addResource (omf,
movieInDataForkResID,
file.getName());
}
public static Track addVideoTrack (Movie sourceMovie,
Movie targetMovie,
int srcIn,
int srcDuration,
int targetTime) throws QTException {
// find first video track
Track videoTrack =
sourceMovie.getIndTrackType (1,
videoMediaType,
movieTrackMediaType);
if (videoTrack == null)
throw new QTException ("can´t find a video track");
// add videoTrack to targetMovie
Track newTrack =
targetMovie.newTrack (videoTrack.getSize( ).getWidthF( ),videoTrack.getSize( ).getHeightF( ),1.0f);
VideoMedia newMedia = new VideoMedia (newTrack,videoTrack.getMedia( ).getTimeScale( ), new DataRef(new QTHandle( )));
videoTrack.insertSegment (newTrack,
srcIn, // 0
srcDuration, // videoTrack.getDuration( )
targetTime);
return newTrack;
}
public Movie createEmptyMovie(java.io.File file) throws QTException, IOException{
QTFile movFile = new QTFile (file);
return
Movie.createMovieFile(movFile,
kMoviePlayer,
createMovieFileDeleteCurFile |
createMovieFileDontCreateResFile);
}
public static void main (String[] args) {
try {
QTSession.open();
new QTJTransition();
} catch (Exception e) {
e.printStackTrace();
} finally{
QTSession.close();
}
}
}
regards,
- Kenneth Nielsen
____________________________________________________________
Bestil lige nu TDC Bredbånd for 0 kr.
- Læs mere på http://tdc.dk/bredbaand/
Denne mail er sendt via Mail på TDC Online
- Læs mere om TDC's mailtjeneste på http://mail.tdconline.dk/
____________________________________________________________
_______________________________________________
Do not post admin requests to the list. They will be ignored.
QuickTime-java mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quicktime-java/email@hidden
This email sent to email@hidden