2011-09-14 7 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(); 
    } 
} 

私はただ、問題がどこにあるかを把握するように見える傾けます。私は誰かwud plzが正しい方向に私を指していれば感謝します。

EDIT:新しくエンコードされたビデオのプロパティが表示される場合、そのオーディオプロパティが設定され、そのビデオプロパティはビデオプロパティ、dimension = 0 x 0、frame rate = N/Aおよびcodec = hではありません。 263。ここでの問題は0 x 0の次元です。

+0

デモを表示できますか...この問題は長い間迷惑をかけています – user1568340

答えて

0

私は答えを見つけましたが、正確に答えはありませんでしたが、私がやっていたことをする方法でした。今私はなぜ私のコードがうまくいかないのか確かではありませんが、hreあなたが私のために働く解決策を見つけることができます。ここの作者は別のリサイザクラスを作成し、それを読者にリスナーとして追加します。 onPictureEventメソッドがオーバーライドされています。その後、別のクラスのMyVideoListenerを作成し、onAddStreamメソッドをオーバーライドして、それをライターとしてリスナーとして追加します。ライターをリスナーとしてリサイザーに追加して2つの部分をリンクします。魅力のように働く。

関連する問題