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

    xiaoxiao2021-12-12  2

    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; }
    转载请注明原文地址: https://ju.6miu.com/read-900195.html

    最新回复(0)