2013-06-03 32 views
1

我试图运行一个xuggler的InputOutputStreamHandler的例子。我试图将视频转换为FLV并将结果视频写入标准输出。这里的源代码:xuggler InputOutputStreamHandler SIGSEGV

import java.io.IOException; 
import java.io.OutputStream; 

import com.xuggle.mediatool.IMediaReader; 
import com.xuggle.mediatool.IMediaWriter; 
import com.xuggle.mediatool.ToolFactory; 
import com.xuggle.xuggler.io.InputOutputStreamHandler; 
import com.xuggle.xuggler.io.XugglerIO; 

public class Test { 

    public static void main(String[] args) throws IOException { 
     OutputStream outStream = System.out; 
     InputOutputStreamHandler handler = new InputOutputStreamHandler(outStream); 

     IMediaReader reader = ToolFactory.makeReader("myvideo.flv"); 
     IMediaWriter writer = ToolFactory.makeWriter(XugglerIO.map(XugglerIO 
      .generateUniqueName(handler, ".flv"), handler), reader); 
     reader.addListener(writer); 
     while(reader.readPacket() == null); 
    } 
} 

我的问题是,当我尝试运行此程序,它崩溃,我得到以下错误:

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# SIGSEGV (0xb) at pc=0x00007f3ed28442e8, pid=9103, tid=139908218222336 
# 
# JRE version: 7.0_21-b11 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.21-b01 mixed mode linux-amd64  compressed oops) 
# Problematic frame: 
# C [xuggle5976644928112967115.tmp+0x2f02e8] avio_write+0x18 
... 

文件hs_err_pid.log提到:

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) 
j com.xuggle.xuggler.XugglerJNI.IContainer_writeHeader(JLcom/xuggle/xuggler/IContainer;)I+0 
j com.xuggle.xuggler.IContainer.writeHeader()I+5 
j com.xuggle.mediatool.MediaWriter.getStream(I)Lcom/xuggle/xuggler/IStream;+222 
j com.xuggle.mediatool.MediaWriter.encodeAudio(ILcom/xuggle/xuggler/IAudioSamples;)V+17 
j com.xuggle.mediatool.MediaWriter.onAudioSamples(Lcom/xuggle/mediatool/event/IAudioSamplesEvent;)V+16 
j com.xuggle.mediatool.AMediaToolMixin.onAudioSamples(Lcom/xuggle/mediatool/event/IAudioSamplesEvent;)V+31 
j com.xuggle.mediatool.MediaReader.dispatchAudioSamples(ILcom/xuggle/xuggler/IAudioSamples;)V+14 
j com.xuggle.mediatool.MediaReader.decodeAudio(Lcom/xuggle/xuggler/IStreamCoder;Lcom/xuggle/xuggler/IPacket;)V+91 
j com.xuggle.mediatool.MediaReader.readPacket()Lcom/xuggle/xuggler/IError;+131 
j Test.main([Ljava/lang/String;)V+45 
v ~StubRoutines::call_stub 

有谁知道我该怎么绕过这个问题?

预先感谢您!

+0

只是一个快速更新,这似乎是一个Xuggler 5.4的bug。 – ifoukarakis

回答

0

你说你试图将视频转换为FLV,但你的输入文件已经是FLV文件 - myvideo.flv。那是对的吗?

另外,你有没有尝试简化makeWriter调用,以便它只是使用硬编码的文件名?因此,它成为这样的事情:

IMediaWriter writer = ToolFactory.makeWriter("output.flv", reader); 

我很好奇,产生的System.out StreamHandler中的顶部唯一的文件名的全过程是否可能有一些做的问题。也许添加一些代码来记录生成的文件名。

String filename = XugglerIO.map(XugglerIO.generateUniqueName(handler, ".flv"), 
    handler); 
System.out.println(filename); 

更新

其他一些建议你可以尝试缩小问题:

  1. 创建自己的OutputStream的类,它无非就是日志,并将其制成这样的电话你可以更好地了解代码失败的位置。即使在尝试写某些东西之前它会立即失败,还是在它死亡之前达到某个特定点?
  2. 如果这不能让你在任何地方,尝试创建你自己的IURLProtocolHandler类,它除了记录呼叫什么也不做。看看你是否可能接到OutputStream无法处理的电话,例如seek

这可能只是因为xuggler无法将某些格式输出到流中。例如,如果需要将FLV标头写入文件的开头,但只有在写入所有内容(例如文件大小)时才会知道标头中所需的详细信息,则需要输出能够追溯到文件开头的处理程序。你显然不能通过流来完成。

+0

嗨,谢谢你的回答。输入的视频不是问题,我尝试过使用mp4,avi和其他格式,并且遇到同样的问题。我尝试使用简单的作家,它将文件写入输出。我的目标是将转码后的视频写入输出流而不是文件。 System.out就是一个例子,我有和ByteArrayOutputStream或PipedOutputStream相同的问题。 – ifoukarakis

+0

我已经添加了一些其他建议,你可以尝试我的答案。但我怀疑问题是xuggler由于文件格式的结构方式而无法将flv输出到流中。 –