首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android,使用媒体解码器和libstreaming

Android,使用媒体解码器和libstreaming
EN

Stack Overflow用户
提问于 2014-04-14 17:27:53
回答 1查看 1.2K关注 0票数 1

我对这个库有个问题

https://github.com/fyhertz/libstreaming

它允许通过无线发送相机的流媒体,它使用三种方式:两种与媒体解码器和一种与媒体录像机。我想要修改它,而且我必须只使用媒体解码器;然而,首先我尝试了库的示例2的代码,但我总是发现相同的错误:日志告诉我,设备可以使用媒体解码器,它设置编码器,当它测试解码器时,它会下降,缓冲区被-1填满。

这就是EncoderDebugger类中发生异常的方法,有没有人可以帮我?

代码语言:javascript
复制
private long decode(boolean withPrefix) {
    int n =3, i = 0, j = 0;
    long elapsed = 0, now = timestamp();
    int decInputIndex = 0, decOutputIndex = 0;
    ByteBuffer[] decInputBuffers = mDecoder.getInputBuffers();
    ByteBuffer[] decOutputBuffers = mDecoder.getOutputBuffers();
    BufferInfo info = new BufferInfo();

    while (elapsed<3000000) {

        // Feeds the decoder with a NAL unit
        if (i<NB_ENCODED) {

            decInputIndex = mDecoder.dequeueInputBuffer(1000000/FRAMERATE);
            if (decInputIndex>=0) {
                int l1 = decInputBuffers[decInputIndex].capacity();
                int l2 = mVideo[i].length;
                decInputBuffers[decInputIndex].clear();

                if ((withPrefix && hasPrefix(mVideo[i])) || (!withPrefix && !hasPrefix(mVideo[i]))) {

                    check(l1>=l2, "The decoder input buffer is not big enough (nal="+l2+", capacity="+l1+").");
                    decInputBuffers[decInputIndex].put(mVideo[i],0,mVideo[i].length);
                } else if (withPrefix && !hasPrefix(mVideo[i])) {

                    check(l1>=l2+4, "The decoder input buffer is not big enough (nal="+(l2+4)+", capacity="+l1+").");
                    decInputBuffers[decInputIndex].put(new byte[] {0,0,0,1});
                    decInputBuffers[decInputIndex].put(mVideo[i],0,mVideo[i].length);
                } else if (!withPrefix && hasPrefix(mVideo[i])) {

                    check(l1>=l2-4, "The decoder input buffer is not big enough (nal="+(l2-4)+", capacity="+l1+").");
                    decInputBuffers[decInputIndex].put(mVideo[i],4,mVideo[i].length-4);
                }

                mDecoder.queueInputBuffer(decInputIndex, 0, l2, timestamp(), 0);
                i++;
            } else {
                if (VERBOSE) Log.d(TAG,"No buffer available !7");
            }
        }

        // Tries to get a decoded image

        decOutputIndex = mDecoder.dequeueOutputBuffer(info, 1000000/FRAMERATE);
        if (decOutputIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
            decOutputBuffers = mDecoder.getOutputBuffers();
        } else if (decOutputIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
            mDecOutputFormat = mDecoder.getOutputFormat();
        } else if (decOutputIndex>=0) {
            if (n>2) {
                // We have successfully encoded and decoded an image !
                int length = info.size;
                mDecodedVideo[j] = new byte[length];
                decOutputBuffers[decOutputIndex].clear();
                decOutputBuffers[decOutputIndex].get(mDecodedVideo[j], 0, length);
                // Converts the decoded frame to NV21
                convertToNV21(j);
                if (j>=NB_DECODED-1) {

                    flushMediaCodec(mDecoder);
                    if (VERBOSE) Log.v(TAG, "Decoding "+n+" frames took "+elapsed/1000+" ms");
                    return elapsed;
                }
                j++;
            }
            mDecoder.releaseOutputBuffer(decOutputIndex, false);
            n++;
        }   
        elapsed = timestamp() - now;
    }

    throw new RuntimeException("The decoder did not decode anything.");

}
EN

回答 1

Stack Overflow用户

发布于 2014-04-15 03:44:49

以下是我的建议:

(1)检查编码器和解码器的设置,确保匹配。例如,旋转和颜色格式是相同的。

(2)确保编码器生成的第一个包已经发送并推送到解码器。此包定义了视频流的基本设置。

(3)解码器通常缓存5-10帧。所以缓冲区中的数据在几百毫秒内是无效的。

(4)在启动解码器时,将表面设置为空。否则,输出缓冲区将被表面读取,并可能自动释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23056531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档