赞
踩
https://github.com/sz66cm/CodecCamera.git
在此过程中收集到的错误信息有如下
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字节数据导致浪费带宽,甚至出现花屏.
原因:取出的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;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。