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

来源:互联网 发布:java soa是什么 编辑:程序博客网 时间:2024/05/16 08:20

Demo项目地址:

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

遇到问题

在海信终端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会报这个错误)

解决停滞不动的问题:

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

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

注意保存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;    }
0 0
原创粉丝点击