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クラスを作成してみてください。たとえばOutputStream、 では処理できない呼び出しを受けている可能性があるかどうかを確認してください。seek

xuggler が特定の形式をストリームに出力できないだけかもしれません。たとえば、FLV ヘッダーがファイルの先頭に書き込む必要があるものであるが、ヘッダーに必要な詳細は、他のすべて (ファイル サイズなど) が書き込まれて初めてわかる場合、出力が必要になります。ファイルの先頭に戻ることができるハンドラー。明らかに、ストリームではそれを行うことはできません。

于 2013-06-03T22:56:19.623 に答える