2014-10-07 2 views
0

Я использую 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() или могу ли я использовать что-то другое?

Большого спасибо

+0

Возможно, http://bigflake.com/mediacodec/#q3? – fadden

+0

В 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

+0

И у меня нет BUFFER_FLAG_CODEC_CONFIG, потому что я не использую MediaDecoder. Пакеты поступают из AVPackets из javacpp – WotG

ответ

0

Я не знаком с этим JavaCPP оберткой из кодека библиотек, но в дополнении к равнине AVPackets, вам нужно AVCodecContext.extradata, а также (после инициализации битового потока фильтра , и после фильтрации первого пакета). Вам необходимо передать данные из extradata либо в виде ByteBuffer с именем «csd-0» во входном MediaFormat, который вы передаете для настройки, либо как отдельный буфер с BUFFER_FLAG_CODEC_CONFIG перед отправкой первого AVPacket.

+0

fadden, и вы ведете меня к тому же (и правильному) пути. Мне нужно правильно настроить декодер перед отправкой пакетов.Теперь я не знаю, как передать эту информацию в MediaFormat (до вызова метода configure()), и каковы параметры minimun, которые мне нужны, чтобы заставить его работать. Но попробуй. большое спасибо – WotG

Смежные вопросы