2011-09-14 75 views
2

我想用xuggler將視頻編碼成3gp格式,我以某種方式讓它工作,像在程序中一樣停止拋出錯誤和異常,但創建的新文件不有任何視頻。現在,我沒有任何錯誤或例外,所以我卡住了牆。 編輯:請注意,音頻正在工作,因爲它打。。xuggler:在編碼的3gp文件中沒有視頻

這對於其中聽衆被配置

IMediaReader讀者= ToolFactory.makeReader( 「/家/ HP/MMS/b.flv」)的主要功能的代碼;

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) 
     ; 

這是爲我寫的轉換器的代碼。

public ConvertVideo(File inputFile, File outputFile) 
{ 
    this.outputFile = outputFile; 
    reader = ToolFactory.makeReader(inputFile.getAbsolutePath()); 
    reader.addListener(this); 
} 
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(); 
    } 
} 

我只是不能似乎找出問題的所在。如果有人向我指出正確的方向,我會感激不盡。

編輯:如果我看到我最近編碼的視頻的屬性,它的音頻屬性被設置,它的視頻屬性不在視頻屬性中,維度= 0 x 0,幀率= N/A,編解碼器= h。 263。這裏的問題是0 x 0維度。

+0

你可以展示你的演示...這個問題困擾了我很長一段時間 – user1568340

回答

0

好吧,我找到了答案,以及不完全是答案,但一種方式來做我在做什麼。現在我不確定爲什麼我的代碼不工作,但hre你可以找到適合我的解決方案。作者在這裏只是做了一個單獨的resizer類,把它作爲聽衆添加到讀者中。它覆蓋了onPictureEvent方法。然後他創建另一個類MyVideoListener並覆蓋onAddStream方法,並將其作爲偵聽器添加到作者中。然後他通過添加書寫器作爲調整器的偵聽器來鏈接這兩部分。工作就像一個魅力。