0

JavaCPP av_read_packet を使用して H264 (MPEG4 AVC) ソースから AVPackets を読み取り、ビデオ パケットのみを Android の MediaCodec に渡してデコードし、Surface (表示用) にレンダリングしようとしています。MediaCodec と互換性を持たせるために AVC ソースを使用する場合、h264_mp4toannexb フィルターで av_bitstream_filter_filter を使用する必要があることを読みました。

問題は、dequeueOutputBuffer が常に -1 を返すことです。問題がフィルターの使用時なのか、それとも他の理由なのかはわかりません。

コードフラグメントは次のとおりです。

bsfc = new AVBitStreamFilterContext();
bsfc = av_bitstream_filter_init("h264_mp4toannexb");

public void FilterPacket(AVPacket paquete){

    IntPointer size_pointer = new IntPointer(1);
    size_pointer.put(paquete.size());
    BytePointer data = new BytePointer();

    int sal = av_bitstream_filter_filter(bsfc, video_codec, (BytePointer)null, data, size_pointer, paquete.data(), paquete.size(), paquete.flags() & AV_PKT_FLAG_KEY );

    paquete.size(size_pointer.get());
    paquete.data(data);

}

デコード ループの内容は次のとおりです。

public void DecoderLoop(AVPacket paquete){
    int inputBufferIndex = decoder.dequeueInputBuffer(5000);
    if (inputBufferIndex >= 0) {
        ByteBuffer bufferSalida = inputBuffers[inputBufferIndex]; 
        FilterPacket(paquete);
        bufferSalida.put(paquete.data().asByteBuffer());
        //double presentationTemp = (double)(paquete.pts()/paquete.duration()) * (1000000/30); 
        //long presentationTime = (long)presentationTemp;
        decoder.queueInputBuffer(inputBufferIndex, 0, paquete.size(), 0, 0);

    }

    int outputBufferIndex = decoder.dequeueOutputBuffer(info, 10000);
    if (outputBufferIndex >= 0) {
        // outputBuffer is ready to be processed or rendered.
        decoder.releaseOutputBuffer(outputBufferIndex, true); 
    } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
        outputBuffers = decoder.getOutputBuffers();
    } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
        // Subsequent data will conform to new format.
        format = decoder.getOutputFormat();
    }
}

dequeueInputBuffer は正の値を返し、av_bitstream_filter_filter は 1 を返しますが (動作しているかどうかはわかりません)、dequeueOutputBuffers は常に -1 を返します。どこに問題があるのか​​ 誰かが私を助けることができますか?

問題は次のいずれかにあると思われます。

  • av_bitstream_filter_filter

  • bufferSalida.put(paquete.data().asByteBuffer()); ¿私はこれらの方法を使用できますか?

  • .asByteBuffer を使用する場合、paquete.size() を使用できますか、それとも別のものを使用できますか?

どうもありがとうございました

4

1 に答える 1

1

libavcodec ライブラリのこの JavaCPP ラッピングには詳しくありませんが、プレーンな AVPackets に加えて、AVCodecContext.extradata も必要です (ビットストリーム フィルターを初期化した後、最初のパケットをフィルター処理した後)。最初の AVPacket を送信する前に、extradata からのデータを、構成するために渡す入力 MediaFormat で「csd-0」という名前の ByteBuffer として、または BUFFER_FLAG_CODEC_CONFIG を使用して別のバッファーとして渡す必要があります。

于 2014-10-07T20:02:47.837 に答える