【问题标题】:Encode Images to Video (Mediacodec)将图像编码为视频 (Mediacodec)
【发布时间】:2016-08-03 17:19:08
【问题描述】:

我需要使用 Mediacodec 将一系列 10 个位图编码为视频。我不想使用 FFmpeg 或 Jcodec,因为它非常慢。

我在 Internet 上进行了搜索,但似乎找不到可以修改的完整示例代码。

这是我尝试过的:

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();

 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
 image.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);
   }

【问题讨论】:

  • 您应该编辑您的问题并使用示例代码添加有关您面临的问题的更多详细信息。顺便说一句:10 张图片意味着 10 帧,使用 15 帧/秒的帧速率,您将获得 0.67 秒的视频...

标签: java android mediamuxer


【解决方案1】:

您的代码示例创建了一个需要 YUV420 图像缓冲区的编码器,但您正在向它提供 PNG 压缩数据(顺便说一句,这只是一种美化的 ZIP 文件格式,而不是 image 表示格式)。

您应该将每个位图的 z 像素从 ARGB 转换为 YUV,并将该缓冲区提供给编码器。显然它们应该与编码器设置中的帧宽度和高度相匹配。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2018-07-16
    • 2013-06-10
    • 2014-01-03
    • 2016-03-12
    • 2013-09-18
    • 2011-04-10
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多