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() を使用できますか、それとも別のものを使用できますか?
どうもありがとうございました