当前位置:   article > 正文

Android硬编实战之采集编码解码_hardware buffer 采集编码

hardware buffer 采集编码

Demo项目地址:

https://github.com/sz66cm/CodecCamera.git
  • 1

遇到问题

在海信终端android 4.4.2:可长期运行,预览,与编解码界面都正常.

在180终端以及186终端,都是android 4.4.4:开始一段时间正常,随后,预览界面正常,编解码界面停滞不动

在此过程中收集到的错误信息有如下
1. Stream not supported [dec->codec->decode]
2. ASYNC:error while processing buffers:OMX_ErrorNotImplemented.
3. Codec reported an error (omx error 0x80001006, internalError -2147483648)
4. MediaCodec dequeueoutputbuffer illegalstateexception (网上找到例子,部分机型没有配置SPS,PPS会报这个错误)
  • 1
  • 2
  • 3
  • 4
  • 5

解决停滞不动的问题:

在编码发送数据时,遇到I帧,就在I帧前添加SPS,PPS.解决问题.
  • 1

存在的问题,如果需要把编码后的文件写到本地,请注意

注意保存h264过程中,取数据的数组并不一定占满,所以要记住每一个帧的长度,写到本地的时候fileOutputStream.write(byte[] buffer, int offset, int frameLength);来保证传输过程中没有多余的0x00字节数据导致浪费带宽,甚至出现花屏.

Demo项目

这里写图片描述

编解码端花屏解决

原因:取出的H264数据的时候,长度取多了代码如下

    /**
     * 同步编码方法
     * @param dst
     * @param src
     * @return
     */
    public int syncEncode(byte[] src) {
        int len = -1;
        long startTime = SystemClock.elapsedRealtime();
        //喂数据
        int ii = encoder.dequeueInputBuffer(ENCODE_TIME_OUT);
        if(ii >= 0) {
            ByteBuffer inBuffer = encoder.getInputBuffers()[ii];
            inBuffer.clear();
            inBuffer.put(src, 0, src.length);
            encoder.queueInputBuffer(ii, 0, src.length, presentationTimeUs += 3600, MediaCodec.BUFFER_FLAG_CODEC_CONFIG);
        }
        //取数据
        BufferInfo info = new BufferInfo();
        int oi = encoder.dequeueOutputBuffer(info, ENCODE_TIME_OUT);
        while (oi == -2) {
            oi = encoder.dequeueOutputBuffer(info, ENCODE_TIME_OUT);
        }
        if (oi >= 0) {
            //取数据
            ByteBuffer outBuffer = encoder.getOutputBuffers()[oi];
//这个长度是outBuffer的最大容量长度,并非H264数据实际长度.
//H264数据实际长度应该从MediaCodec.BufferInfo对象的成员变量size去取.
//如果使用了outBuffer.capacity()的长度,出现编解码端花屏
//并且十分的卡顿,打印发现H264的实际长度比outBuffer.capacity()小很多
//这个得十分注意,如下错误代码已注释
            len = outBuffer.capacity();
//          byte[] dst = new byte[len];
//          outBuffer.get(dst, 0, len);
            byte[] dst = new byte[info.size];
            outBuffer.get(dst);
            Log.i(TAG, "syncEncode() cost time = " + (SystemClock.elapsedRealtime() - startTime) + " ms" 
                    + " info.size = " + info.size + " outBuffer.capacity() = " + len);
            //传输数据
            prepareOffer(dst);
            //释放数据
            encoder.releaseOutputBuffer(oi, false);
        }
        return len;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/46093
推荐阅读
相关标签
  

闽ICP备14008679号