2013-06-03 67 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輸出到流中。 –