2

xuggler を使用してビデオを 3gp 形式にエンコードしようとしていますが、何とか動作し、プログラムのように動作し、エラーと例外のスローが停止しましたが、作成された新しいファイルにはビデオがありません。今、私が扱うべきエラーや例外はありませんので、私は壁に立ち往生しています。編集: オーディオが震えながら機能していることに注意してください。

これは、リスナーが構成されているメイン関数のコードです

IMediaReader リーダー = ToolFactory.makeReader("/home/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 次元です。

4

1 に答える 1

0

よく私は答えを見つけました、まあ正確には答えではなく、私がやっていたことをする方法です。今のところ、コードが機能しなかった理由はわかりませんが、うまくいった解決策を見つけることができます。ここでの作成者は、個別のリサイザークラスを作成し、それをリスナーとしてリーダーに追加します。onPictureEventメソッドがオーバーライドされます。次に、彼は別のクラスMyVideoListenerを作成し、onAddStreamメソッドをオーバーライドして、それをリスナーとしてライターに追加します。次に、ライターをリスナーとしてリサイザーに追加することにより、2つの部分をリンクします。チャームのように機能します。

于 2011-09-15T06:40:57.183 に答える