0

Mediacodec を使用して、一連の 10 個のビットマップをビデオにエンコードする必要があります。FFmpeg や Jcodec は非常に遅いため、使用したくありません。

インターネットで検索しましたが、変更できる完全に機能するサンプル コードが見つからないようです。

これが私が試したことです:

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);
   }
4

1 に答える 1

0

あなたのコード例は、YUV420 画像バッファーを期待するエンコーダーを作成しますが、PNG 圧縮データを供給しています (ところで、これは単なる美化された ZIP ファイル形式であり、画像表現形式ではありません)。

各ビットマップのピクセルを ARGB から YUV に変換し、そのバッファをエンコーダにフィードする必要があります。明らかに、エンコーダーの設定でフレームの幅と高さと一致する必要があります。

于 2016-08-04T23:10:59.430 に答える