1

我正在尝试运行 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.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

有谁知道我该如何绕过这个问题?

先感谢您!

4

1 回答 1

0

您说您正在尝试将视频转换为 flv,但您的输入文件已经是 flv 文件 - myvideo.flv. 那是对的吗?

另外,您是否尝试过简化makeWriter调用以使其仅使用硬编码的文件名?所以它变成了这样:

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

我很好奇在流处理程序之上生成唯一文件名的整个过程是否System.out与问题有关。也许添加一些代码来记录生成的文件名。

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

更新

您可以尝试缩小问题范围的其他一些建议:

  1. 创建您自己的OutputStream类,该类仅记录对其进行的调用,以便您更好地了解代码失败的位置。它是在尝试写东西之前立即失败,还是在它死之前到达某个点。
  2. 如果这不能让您到任何地方,请尝试创建您自己的IURLProtocolHandler类,该类除了记录调用之外什么都不做。看看你是否接到了 anOutputStream无法处理的电话,seek例如。

可能只是 xuggler 无法将某些格式输出到流中。例如,如果 FLV 标头是需要写入文件开头的内容,但标头中所需的详细信息只有在其他所有内容都写入后才知道(例如文件大小),则需要输出能够回溯到文件开头的处理程序。你显然不能用流来做到这一点。

于 2013-06-03T22:56:19.623 回答