当前位置:编程学习 > wap >>

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实现的 --------------------编程问答--------------------
引用 1 楼 youngc527 的回复:
这个用Java实现不会很慢吗?我是用ffmpeg和JNI实现的


你可以上 640*480 以及 1280*720 么?
双核1.4G  跑的动不? --------------------编程问答-------------------- MediaCodec要求API16以上,我们的项目想用也用不了。
我们的视频都是小视频,编码性能倒是没问题,1280*720的没试过。 --------------------编程问答-------------------- 求大大 帮忙啦... --------------------编程问答--------------------
引用 3 楼 youngc527 的回复:
MediaCodec要求API16以上,我们的项目想用也用不了。
我们的视频都是小视频,编码性能倒是没问题,1280*720的没试过。



我上面的处理方式在 800*600 就不行了...悲催的要死. --------------------编程问答-------------------- 你这是什么样的需求,为啥需要自己实现视频编码? --------------------编程问答--------------------
引用 6 楼 youngc527 的回复:
你这是什么样的需求,为啥需要自己实现视频编码?



摄像头视频局域网传输. --------------------编程问答-------------------- 虽然不知道这里的分有啥用,但20也太少啦
先试试176*144行不行。另外只有编码没有解码啊 --------------------编程问答-------------------- 你的代码可以解码么?感觉不像。
mediaCodec.releaseOutputBuffer(outputBufferIndex, false); 是false还是ture,这个一句为什么出现2次                           outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
--------------------编程问答--------------------
引用 1 楼 youngc527 的回复:
这个用Java实现不会很慢吗?我是用ffmpeg和JNI实现的
大神,求个ffmpeg的so文件,表示新手编译不出来ffmpeg的so文件,只需要h263解码的就可以了...QQ:807263015 --------------------编程问答--------------------
引用 10 楼 yy900717 的回复:
Quote: 引用 1 楼 youngc527 的回复:

这个用Java实现不会很慢吗?我是用ffmpeg和JNI实现的
大神,求个ffmpeg的so文件,表示新手编译不出来ffmpeg的so文件,只需要h263解码的就可以了...QQ:807263015

看我的主页,我编好了一个上传上去了
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,