gpt4 book ai didi

android - 使用 mediacodec 从位图文件创建视频

转载 作者:行者123 更新时间:2023-11-29 17:35:24 24 4
gpt4 key购买 nike

我的 SD 卡上有位图文件列表。现在,我想使用 mediacodec 创建视频。我检查了MediaCodec文档。我找不到创建视频的方法。我不想使用 FFmpeg。我试过下面的代码。任何帮助,将不胜感激!!

protected void MergeVideo() throws IOException {
// TODO Auto-generated method stub
MediaCodec mMediaCodec;
MediaFormat mMediaFormat;
ByteBuffer[] mInputBuffers;
mMediaCodec = MediaCodec.createEncoderByType("video/avc");
mMediaFormat = MediaFormat.createVideoFormat("video/avc", 320, 240);
mMediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000);
mMediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mMediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
mMediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mMediaCodec.configure(mMediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mMediaCodec.start();
mInputBuffers = mMediaCodec.getInputBuffers();
//for (int i = 0; i<50; i++) {
int i=0;
int j=String.valueOf(i).length()<1?Integer.parseInt("0"+i) : i;
File imagesFile = new File(Environment.getExternalStorageDirectory() + "/VIDEOFRAME/","frame-"+j+".png");

Bitmap bitmap = BitmapFactory.decodeFile(imagesFile.getAbsolutePath());
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); // image is the bitmap
byte[] input = byteArrayOutputStream.toByteArray();

int inputBufferIndex = mMediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = mInputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(input);
mMediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0);
}

最佳答案

您遗漏了一些内容。 this question的答案有一些您需要的信息,但它是为专门希望获得 API 16 支持的人编写的。如果您愿意以 API 18 及更高版本为目标,您的生活会更轻松。

最大的问题是来自 ByteBuffer 的 MediaCodec 输入总是未压缩的 YUV 格式,但您似乎正在传递压缩的 PNG 图像。您需要将位图转换为 YUV。确切的布局和执行此操作的最佳方法因设备而异(有些使用平面,有些使用半平面),但您可以找到这样做的代码。或者看看在 EncodeDecodeTest 的缓冲区到缓冲区部分中生成帧的方式.

或者,使用 Surface 输入到 MediaCodec。将 Canvas 附加到输入表面并在其上绘制位图。 EncodeAndMuxTest本质上是这样做的,但使用 OpenGL ES。

一个潜在的问题是您为帧时间戳传递了 0。您应该传递一个真实的(生成的)时间戳,以便该值与编码帧一起转发到 MediaMuxer。

在最新的设备 (API 21+) 上,MediaRecorder 可以接受 Surface 输入。这可能比 MediaCodec 更容易使用。

关于android - 使用 mediacodec 从位图文件创建视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30658415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com