Я использую JavaCPP av_read_packet для чтения AVPackets из источника H264 (MPEG4 AVC), тогда я пытаюсь передать только видеопакеты в MediaCodec от Android для их декодирования и рендеринга в Surface (для отображения). Я читал, что вам нужно использовать av_bitstream_filter_filter с фильтром h264_mp4toannexb, когда вы используете источник AVC для совместимости с MediaCodec.AVPacket to Android MediaCodec
Проблема в том, что 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() или могу ли я использовать что-то другое?
Большого спасибо
Возможно, http://bigflake.com/mediacodec/#q3? – fadden
В Q3 они настраивают декодер через MediaExtractor, но в этом случае (без Media Extractor) я настраиваю его так: ' type =" video/avc "; decoder = MediaCodec.createDecoderByType (тип); ... format = MediaFormat.createVideoFormat (тип, codec_input.width(), codec_input.height()); decoder.configure (формат, поверхность, нуль, 0); decoder.start(); \t \t inputBuffers = decoder.getInputBuffers(); outputBuffers = decoder.getOutputBuffers(); ' – WotG
И у меня нет BUFFER_FLAG_CODEC_CONFIG, потому что я не использую MediaDecoder. Пакеты поступают из AVPackets из javacpp – WotG