Android使用MediaCodec进行h264硬编码的问题

saliengu 2015-11-03 05:23:02
每次运行到 mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); 这句总会报异常,不知道哪位大神碰到过这种问题,跪求指点。
...全文
537 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
aawc1144 2015-11-30
  • 打赏
  • 举报
回复
楼上无敌,谢谢指教
zhouxionger 2015-11-06
  • 打赏
  • 举报
回复
private MediaCodec mediaCodec; int m_width; int m_height; byte[] m_info = null; int key; private String type = "video/avc"; @SuppressLint("NewApi") public AvcEncoder(int width, int height, int framerate, int bitrate) { m_width = width; m_height = height; mediaCodec = MediaCodec.createEncoderByType(type); MediaFormat mediaFormat = MediaFormat.createVideoFormat(type, width, height); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate); mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, framerate); mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10); mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); mediaCodec.start(); } @SuppressLint("NewApi") public void close() { try { mediaCodec.stop(); mediaCodec.release(); } catch (Exception e) { e.printStackTrace(); } } @SuppressLint("NewApi") public byte[] offerEncoder(byte[] input) { int count = 0; byte[] output = null; int pos = 0; // swapYV12toI420(input, yuv420, m_width, m_height); try { ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers(); Log.i("inputBufferssize", "" + inputBuffers.length); ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers(); int inputBufferIndex = mediaCodec.dequeueInputBuffer(0); Log.i("AvcEncoder inputBufferIndex", inputBufferIndex + ""); if (inputBufferIndex >= 0) { ByteBuffer inputBuffer = inputBuffers[inputBufferIndex]; inputBuffer.clear(); inputBuffer.put(input); mediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0); } MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); int outputBufferIndex = 0; while (count <= 10) { outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 10000); Log.i("AvcEncoder outputBufferIndex", outputBufferIndex + ""); if (outputBufferIndex == -1) { count++; } else { break; } } if (outputBufferIndex >= 0) { ByteBuffer outputBuffer = outputBuffers[outputBufferIndex]; byte[] outData = new byte[bufferInfo.size]; // Log.i("h264.size", outData.length + ""); output = new byte[outData.length]; outputBuffer.get(outData); if (m_info != null) { System.arraycopy(outData, 0, output, pos, outData.length); pos += outData.length; } else { ByteBuffer spsPpsBuffer = ByteBuffer.wrap(outData); if (spsPpsBuffer.getInt() == 0x00000001) { m_info = new byte[outData.length];// 第一帧数据 System.arraycopy(outData, 0, m_info, 0, outData.length); } } mediaCodec.releaseOutputBuffer(outputBufferIndex, false); mediaCodec.flush(); } int key = output[4] & 0x1F; if (key == 5) // key frame2 { System.arraycopy(output, 0, input, 0, pos); output = new byte[output.length + m_info.length]; System.arraycopy(m_info, 0, output, 0, m_info.length); System.arraycopy(input, 0, output, m_info.length, pos); pos += m_info.length; } } catch (Throwable t) { t.printStackTrace(); } return output; } 这是我在网上找的改了下,希望可以帮到你

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧