2010-02-08 3 views
0

Java 패키지를 사용하여 비디오 파일을 만드는 데 필요한 몇 가지 권장 사항 만받은 후 JMF로 샘플로 제공되는 JPEGImagesToMovie 파일을 수정하려고했습니다. 나는 모든 것을 컴파일 할 수 있었고 그것이 실행되어야하는 것처럼 보였다. 새로운 클래스는 BufferedImages의 Vector를 취해, 파일로부터 읽어 들여, 이전과 같이 바이트 배열로 변환하는 대신, BufferedImage로부터 바이트 배열로 직접 변환합니다. 문제는 프로세서가 구성하지 않는다는 것입니다 (잠겨 있거나 비슷한 것). 누구든지이 원인이 될 수있는 명백한 결함을 볼 수 있습니까?JPEGImagesToMovie 파일 수정

나는 여전히 더 좋고/더 쉽고/더 간단한 프레임 워크를 제안 할 수 있습니다.

편집 : 실제로 뭔가를 한 몇 가지 코드는 다음과 같습니다. 가독성을 위해 약간 정리했습니다.

class ImageDataSource extends PullBufferDataSource { 

ImageSourceStream streams[]; 

ImageDataSource(int width, int height, int frameRate, Vector images) { 
    streams = new ImageSourceStream[1]; 
    streams[0] = new ImageSourceStream(width, height, frameRate, images); 
} 

/** 
* The source stream to go along with ImageDataSource. 
*/ 
class ImageSourceStream implements PullBufferStream { 

Vector images; 
int width, height; 
VideoFormat format; 

int nextImage = 0; // index of the next image to be read. 
boolean ended = false; 

public ImageSourceStream(int width, int height, int frameRate, Vector images) { 
    this.width = width; 
    this.height = height; 
    this.images = images; 

    format = new VideoFormat(null, 
      new Dimension(width, height), 
      Format.NOT_SPECIFIED, 
      Format.byteArray, 
      (float)frameRate); 
} 

/** 
* This is called from the Processor to read a frame worth 
* of video data. 
*/ 
public void read(Buffer buf) throws IOException { 

    // Check if we've finished all the frames. 
    if (nextImage >= images.size()) { 
    // We are done. Set EndOfMedia. 
    System.err.println("Done reading all images."); 
    buf.setEOM(true); 
    buf.setOffset(0); 
    buf.setLength(0); 
    ended = true; 
    return; 
    } 

    BufferedImage imageFile = (BufferedImage)images.elementAt(nextImage); 
    nextImage++; 


    byte data[] = ImageToByteArray.convertToBytes(imageFile); 
    // Check the input buffer type & size. 

    if (buf.getData() instanceof byte[]) 
    data = (byte[])buf.getData(); 

    // Check to see the given buffer is big enough for the frame. 

    buf.setData(data); 

    buf.setOffset(0); 
    buf.setLength((int)data.length); 
    buf.setFormat(format); 
    buf.setFlags(buf.getFlags() | buf.FLAG_KEY_FRAME); 
} 

VideoFormat의 인코딩으로 무엇을 사용해야하는지 잘 모르겠습니다.

+0

http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/solutions/JpegImagesToMovie.java 원래 JMF와 비교하여 특정 코드에서 아무 것도 변경하지 않았습니다. 예제 코드. ** 실제로 ** 변경된 코드 조각을 보여 주어야합니다! 더 좋고/더 쉽고/더 단순한 프레임 워크를위한 제안에 관해서는 실제로 더 잘할 수는 없지만, Xuggler는 덜 부 풀린다. http://wiki.xuggle.com/MediaTool_Introduction – BalusC

+0

죄송합니다. 내가 오류를 얻는 곳에서 코드를 게시했는데 거기에 아무 것도 변경하지 않았다는 사실을 생각하지 않았습니다. 이 밤새 코딩하는 것을 피하십시오. – WLPhoenix

+0

순수 자바 구현을 위해서는 Werner Randelshofer의 [Monte Media Library] (http://www.randelshofer.ch/monte/)를 사용하십시오. –

답변

0

심각하게는 Xuggler으로 이것을 고려해야합니다.