Java xuggler输入输出流处理器SIGSEGV
我正在尝试运行xuggler的InputOutputStreamHandler示例。我正在尝试将视频转换为FLV,并将生成的视频写入标准输出。以下是源代码:Java xuggler输入输出流处理器SIGSEGV,java,xuggler,Java,Xuggler,我正在尝试运行xuggler的InputOutputStreamHandler示例。我正在尝试将视频转换为FLV,并将生成的视频写入标准输出。以下是源代码: import java.io.IOException; import java.io.OutputStream; import com.xuggle.mediatool.IMediaReader; import com.xuggle.mediatool.IMediaWriter; import com.xuggle.mediatool.T
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
有人知道我如何绕过这个问题吗
提前谢谢你 您说您正在尝试将视频转换为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);
更新
您可以尝试缩小问题范围的其他一些建议:
创建自己的OutputStream类,该类只记录对它的调用,以便更好地了解代码失败的地方。它是在尝试写东西之前就失败了,还是在它死之前就达到了某一点。
如果这样做没有任何效果,请尝试创建自己的类,该类除了记录调用之外什么都不做。看看您是否收到OutputStream无法处理的调用,例如seek。
可能只是Xugler无法将某些格式输出到流。例如,如果FLV头是需要写入文件开头的内容,但只有在写入其他内容(例如文件大小)后,才知道头中需要的详细信息,则需要能够返回文件开头的输出处理程序。显然,你不能用流来实现这一点。嗨,谢谢你的回答。输入视频没有问题,我尝试过mp4、avi和其他格式,也遇到了同样的问题。我尝试使用simple writer,它将文件写入输出。我的目标是将转码后的视频写入输出流,而不是文件。例如System.out,我对ByteArrayOutputStream或PipedOutputStream也有同样的问题。我已经添加了一些其他建议,您可以尝试对我的答案进行修改。但我怀疑问题在于,由于文件格式的结构,Xugler无法将flv输出到流。