2013-06-03 4 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의 버그 인 것 같습니다. – 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); 

업데이트

어떤 다른 제안을 당신이 문제를 좁힐 시도 할 수 : 그래서 그것을 만든 호출을 기록보다 더 아무것도하지 않는 자신의 OutputStream 클래스를 만듭니다

  1. 당신 코드가 실패한 곳을 더 잘 이해할 수 있습니다. 뭔가를 쓰려고 시도하기도 전에 즉시 실패합니까 아니면 죽기 전에 어떤 지점에 도달합니까?
  2. 아무데도 들지 않으면 로그 호출 외에 아무것도 수행하지 않는 자신의 IURLProtocolHandler 클래스를 만들어보십시오. 예를 들어 seek과 같이 OutputStream에서 처리 할 수없는 전화를 받고 있는지 확인하십시오.

xuggler가 특정 형식을 스트림으로 출력 할 수없는 경우 일 수 있습니다. 예를 들어, FLV 헤더가 파일의 시작 부분에 작성되어야하지만 헤더에 필요한 세부 정보는 다른 모든 것이 작성된 후에 만 ​​(예 : 파일 크기) 알려지면 출력이 필요합니다 처리기는 파일의 시작 부분으로 돌아갈 수있었습니다. 당신은 분명히 스트림으로 할 수 없습니다.

+0

안녕하세요, 답에 감사드립니다. 입력 비디오가 문제가되지 않습니다, 나는 mp4, avi 및 다른 형식으로 시도하고 동일한 문제가있어. 나는 간단한 작가를 사용하여 시도하고 출력에 파일을 씁니다. 제 목적은 변환 된 비디오를 파일 대신 출력 스트림에 작성하는 것입니다. System.out을 예로 들자면 ByteArrayOutputStream 또는 PipedOutputStream과 동일한 문제가있었습니다. – ifoukarakis

+0

나는 내 대답을 시도 할 수있는 다른 제안을했습니다. 그러나 문제는 파일 형식이 구조화되어 있기 때문에 xuggler가 스트림에 flv를 출력 할 수 없다는 것입니다. –