2011-09-14 7 views
2

xuggler를 사용하여 비디오를 3gp 형식으로 인코딩하려고하는데, 어떻게 든 작동하도록 만들었습니다. 프로그램에서 오류 및 예외가 발생하지 않도록 작업했지만 생성 된 새 파일은 그렇지 않습니다. 어떤 비디오 있어요. 이제는 아무런 오류나 예외가 없어서 벽에 걸렸습니다. 편집 : 오디오가 소리 나는대로 작동합니다. xuggler : 인코딩 된 3gp 파일에 비디오 없음

는 청취자 = ToolFactory.makeReader ("/ 홈/HP/MMS/b.flv")

IMediaReader 판독기를 구성하는 주요 기능을위한 코드;

IMediaWriter writer = ToolFactory.makeWriter("/home/hp/mms/xuggle/a_converted.3gp", reader); 

    IMediaDebugListener debugListener = ToolFactory.makeDebugListener(); 
    writer.addListener(debugListener); 

    ConvertVideo convertor = new ConvertVideo(new File("/home/hp/mms/b.flv"), new File("/home/hp/mms/xuggle/a_converted.3gp")); 
    // convertor.addListener(writer); 
    reader.addListener(writer); 
    writer.addListener(convertor); 

    while (reader.readPacket() == null) 
     ; 

는 그리고 이것은 내가 쓴 변환기에 대한 코드입니다.

private IVideoResampler videoResampler = null; 
private IAudioResampler audioResampler = null; 

@Override 
public void onAddStream(IAddStreamEvent event) 
{ 
    if (writer == null) 
    { 
     writer = ToolFactory.makeWriter(outputFile.getAbsolutePath(), reader); 

    } 

    int streamIndex = event.getStreamIndex(); 
    IStreamCoder streamCoder = event.getSource().getContainer().getStream(streamIndex).getStreamCoder(); 

    if (streamCoder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) 
    { 
     streamCoder.setFlag(IStreamCoder.Flags.FLAG_QSCALE, false); 
     writer.addAudioStream(streamIndex, 0, 1, 8000); 
    } 
    else if (streamCoder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) 
    { 
     streamCoder.setFlag(IStreamCoder.Flags.FLAG_QSCALE, false); 
     streamCoder.setCodec(ICodec.findEncodingCodecByName("h263")); 
     writer.addVideoStream(streamIndex, 0, VIDEO_WIDTH, VIDEO_HEIGHT); 

    } 
    super.onAddStream(event); 
} 

// // 
@Override 
public void onVideoPicture(IVideoPictureEvent event) 
{ 
    IVideoPicture pic = event.getPicture(); 
    if (videoResampler == null) 
    { 
     videoResampler = IVideoResampler.make(VIDEO_WIDTH, VIDEO_HEIGHT, pic.getPixelType(), pic.getWidth(), pic.getHeight(), pic.getPixelType()); 
    } 
    IVideoPicture out = IVideoPicture.make(pic.getPixelType(), VIDEO_WIDTH, VIDEO_HEIGHT); 
    videoResampler.resample(out, pic); 

    IVideoPictureEvent asc = new VideoPictureEvent(event.getSource(), out, event.getStreamIndex()); 
    super.onVideoPicture(asc); 
    out.delete(); 
} 

@Override 
public void onAudioSamples(IAudioSamplesEvent event) 
{ 
    IAudioSamples samples = event.getAudioSamples(); 
    if (audioResampler == null) 
    { 
     audioResampler = IAudioResampler.make(1, samples.getChannels(), 8000, samples.getSampleRate()); 
    } 
    if (event.getAudioSamples().getNumSamples() > 0) 
    { 
     IAudioSamples out = IAudioSamples.make(samples.getNumSamples(), samples.getChannels()); 
     audioResampler.resample(out, samples, samples.getNumSamples()); 

     AudioSamplesEvent asc = new AudioSamplesEvent(event.getSource(), out, event.getStreamIndex()); 
     super.onAudioSamples(asc); 
     out.delete(); 
    } 
} 

public ConvertVideo(File inputFile, File outputFile) 
{ 
    this.outputFile = outputFile; 
    reader = ToolFactory.makeReader(inputFile.getAbsolutePath()); 
    reader.addListener(this); 
} 

난 그냥 캔트 어디에 문제가 알아낼. 나는 누군가 wud plz가 올바른 방향으로 나를 가르키면 감사 할 것이다.

EDIT : 새로 인코딩 한 비디오의 속성을 보면 오디오 속성이 설정되고 해당 비디오 속성이 비디오 속성, dimension = 0 x 0, frame rate = N/A 및 codec = h가 아닙니다. 263. 여기서 문제는 0 x 0 차원입니다.

+0

데모를 보여줄 수 있습니까?이 문제는 오랫동안 나를 귀찮게합니다. – user1568340

답변

0

잘 답변을 찾았지만 정확하게 대답은 아니지만 내가하는 일을하는 방법. 지금은 왜 내 코드가 작동하지 않는지 확신 할 수는 없지만 hreU가 나를 위해 효과가있는 해결책을 찾을 수 있습니다. 여기서 작성자는 별도의 resizer 클래스를 작성하여 독자에게 청취자로 추가합니다. onPictureEvent 메소드가 오버라이드 (override)되고 있습니다. 그런 다음 다른 클래스 인 MyVideoListener를 만들고 onAddStream 메서드를 재정의하고이를 수신기로 수신기로 추가합니다. 작가는 작가를 리스너로 추가하여 두 부분을 연결합니다. 매력처럼 작동합니다.