简体   繁体   English

如何使用xuggler写入outputStream?

[英]How to write to an outputStream using xuggler?

So I'm trying to write my encoded buffered image to an output stream but I can't get any data to come through on the stream... Could anyone tell me what I'm doing wrong and why I can't see any output? 所以我正在尝试将我的编码缓冲图像写入输出流,但我无法通过流来获取任何数据......任何人都可以告诉我我做错了什么以及为什么我看不到任何数据输出?

I would expect that when I call the write.encodeVideo method that it encode's video into my ByteArrayOutputStream... is that assumption wrong? 我希望当我调用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();

I believe the way you are creating the IMediaWriter is incorrect. 我相信你创建IMediaWriter是不正确的。 You don't want to open the writer's container yourself either. 您也不想自己打开编写器的容器。 When you are using an OutputStream instead of a file you can do it by using the com.xuggle.xuggler.io.XugglerIO mapper like this: 当您使用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);

Keep in mind that if you are trying to create a format that has to be able to "seek" within the output bytes as part of it's creation process (eg .mov), then it won't work with a simple OutputStream as I have shown. 请记住,如果您尝试创建一个必须能够在输出字节中“搜索”的格式作为其创建过程的一部分(例如.mov),那么它将无法使用简单的OutputStream因为我有所示。 You would have to write to a file instead of an OutputStream . 您必须写入文件而不是OutputStream

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM