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
- Android硬编实战之采集编码解码
- GPU编解码 - 硬编码
- Android硬编解码并播放
- Android实战技巧之三十七:图片的Base64编解码
- 1.27Android 学习+进度之二十七-视频聊天(硬编解码)
- Android MediaCodec实现摄像头数据硬编解码全过程
- GPU编解码 - 硬解码---CUVID
- GPU编解码 - 硬解码 - CUVID
- 视频编码解码学习之二:编解码框架
- 基于6410的H264采集、硬编码、软解码的源代码解析
- android 音频编解码 混音 mp3编码解码 pcm编码解码
- Android硬编
- Android 硬编实例
- 基于CUDA的硬编解码
- 基于NVIDIA显卡的硬编解码
- 视频硬编解码初级篇
- android 下硬解码
- 音视频编解码技术之视频编码基本概念介绍
- HIVE和HBASE区别
- spring注解-定时
- Java网络编程_基于UDP协议的网络编程
- MT6589][AAL]巧用dumpsys处理AAL工作异常问题
- 移动H5前端性能优化指南
- Android硬编实战之采集编码解码
- 管道和FIFO
- angularjs自定义过滤器
- 自旋锁spinlock
- python 转码报错decoding Unicode is not supported
- 高仿小米日历,美柚日历,支持月周切换,支持scrollview、listview等拖动切换
- NandFlash控制器参数TACLS、TWRPH0和TWRPH1的确定
- MFC绘图常用
- iOS ARC环境下dealloc的使用