2012-10-04 4 views
4

Итак, я пытаюсь записать закодированное буферизированное изображение в поток вывода, но я не могу получить какие-либо данные, чтобы пройти через поток ... Может ли кто-нибудь сказать мне, что я делаю неправильно, и почему я не могу см. любой выход?Как написать outputStream с помощью xuggler?

Я бы ожидал, что когда я вызову метод write.encodeVideo, который он кодирует видео в мой ByteArrayOutputStream ... это предположение неправильно?

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

// video parameters 
final int videoStreamIndex = 0; 
final int videoStreamId = 0; 
final long frameRate = DEFAULT_TIME_UNIT.convert(15, MILLISECONDS); 
final int width = 512; 
final int height = 254; 
long nextFrameTime = 0; 

// create a media writer and specify the output file 
final IMediaWriter writer = ToolFactory.makeWriter("aaa.ogg"); 

IContainer ic = writer.getContainer(); 
ic.open(outputStream, writer.getContainer().getContainerFormat(), true, false); 

ICodec codec = ICodec.guessEncodingCodec(null, null,"aaa.ogg", null, ICodec.Type.CODEC_TYPE_VIDEO); 

// add the video stream 
writer.addVideoStream(videoStreamIndex, videoStreamId, codec, width, height); 

BufferedImage img = null; 
try 
{ 
    img = ImageIO.read(new File("/home/jbkreme/aaa.png")); 
} 
catch (final IOException e) 
{ 
    e.printStackTrace(); 
} 

for(int yy =0; yy < 2048-height; yy=yy+8) 
{ 
    nextFrameTime++; 
    BufferedImage frame = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); 
    frame = img.getSubimage(0, yy, width, height); 
    BufferedImage frame2 = convertToType(frame, BufferedImage.TYPE_3BYTE_BGR); 

    //encode the video 
    writer.encodeVideo(videoStreamIndex, frame2, nextFrameTime, DEFAULT_TIME_UNIT); 

    nextFrameTime += frameRate; 
} 

writer.close(); 
outputStream.flush(); 
outputStream.close(); 
+0

Вы выяснили ответ? –

+0

Не думаю, что я сделал? Извините – Grammin

+0

@PhaniRahul Я отправил ответ, если вы все еще ищете кодировку для OutputStream. – 11101101b

ответ

1

Я считаю, что, как вы создаете IMediaWriter неверен. Вы тоже не хотите открывать контейнер писателя. При использовании OutputStream вместо файла вы можете сделать это с помощью com.xuggle.xuggler.io.XugglerIO картографа так:

// create a media writer and specify the output stream 
final IMediaWriter writer = ToolFactory.makeWriter(XugglerIO.map(outputStream)); 

// manually set the container format (because it can't detect it by filename anymore) 
IContainerFormat containerFormat = IContainerFormat.make(); 
containerFormat.setOutputFormat("ogg", null, "application/ogg"); 
mWriter.getContainer().setFormat(containerFormat); 

// add the video stream 
writer.addVideoStream(videoStreamIndex, videoStreamId, ICodec.ID.CODEC_ID_THEORA, width, height); 

Имейте в виду, что если вы пытаетесь создать формат, который должен быть в состоянии «искать» в выходных байтах как часть его процесса создания (например .mov), то он не будет работать с простым OutputStream, как я показал. Вам нужно будет записать в файл вместо OutputStream.