Android 视频 编码....MediaCodec ... 最后20 分 求指导
声明
this.mediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", this.width, this.height);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 300000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 20);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
this.mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
this.mediaCodec.start();
解码线程
EncoderThread = new Thread(new Runnable() {
@Override
public void run() {
isRuning = true;
byte[] input = null;
while (isRuning) {
if (dataListIn != null)
input = dataListIn.poll();
if (input != null) {
try {
ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers();
int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(input);
mediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0);
// inputBuffer.put(yuv420Byte);
// mediaCodec.queueInputBuffer(inputBufferIndex, 0, yuv420Byte.length, 0, 0);
}
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
byte[] outData = new byte[bufferInfo.size];
outputBuffer.get(outData);
if (dataListOut != null)
dataListOut.add(outData);
mediaCodec.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
}
} catch (Throwable t) {
t.printStackTrace();
}
} else {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
mediaCodec.stop();
mediaCodec.release();
}
});
EncoderThread.start();
以上代码 实现的对应解码...在 真机测试 尺寸在800*600 就出现解码 绿屏
另外真机只支持 COLOR_FormatYUV420SemiPlanar
请大大 指点指点...这个 视频编码.解码
android 视频 yuv --------------------编程问答-------------------- 这个用Java实现不会很慢吗?我是用ffmpeg和JNI实现的 --------------------编程问答--------------------
你可以上 640*480 以及 1280*720 么?
双核1.4G 跑的动不? --------------------编程问答-------------------- MediaCodec要求API16以上,我们的项目想用也用不了。
我们的视频都是小视频,编码性能倒是没问题,1280*720的没试过。 --------------------编程问答-------------------- 求大大 帮忙啦... --------------------编程问答--------------------
我上面的处理方式在 800*600 就不行了...悲催的要死. --------------------编程问答-------------------- 你这是什么样的需求,为啥需要自己实现视频编码? --------------------编程问答--------------------
摄像头视频局域网传输. --------------------编程问答-------------------- 虽然不知道这里的分有啥用,但20也太少啦
先试试176*144行不行。另外只有编码没有解码啊 --------------------编程问答-------------------- 你的代码可以解码么?感觉不像。
mediaCodec.releaseOutputBuffer(outputBufferIndex, false); 是false还是ture,这个一句为什么出现2次 outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
--------------------编程问答-------------------- 大神,求个ffmpeg的so文件,表示新手编译不出来ffmpeg的so文件,只需要h263解码的就可以了...QQ:807263015 --------------------编程问答--------------------
看我的主页,我编好了一个上传上去了
补充:移动开发 , Android