【问题标题】:How to get RGB color-format frames using MediaCodec encoder如何使用 MediaCodec 编码器获取 RGB 颜色格式帧
【发布时间】:2014-09-03 03:54:17
【问题描述】:

我使用 Android 的 MediaCodec API 创建了一个编码器,代码如下:

MediaFormat mMediaFormat = MediaFormat.createVideoFormat("video/avc", width, height);
            mMediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
            mMediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
            mMediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,     MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
            mMediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10);
            Log.i(TAG, "Starting encoder");
            encoder = MediaCodec.createByCodecName(Utils.selectCodec("video/avc").getName());
            encoder.configure(mMediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
            Surface surface = encoder.createInputSurface();
            encoder.start();

我正在使用createInputSurface() 将输入传递给编码器。问题是我希望在后续调用dequeueOutputBuffer() 时使用 RGB 颜色格式帧,但由于我已将颜色格式设置为MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface,所以我认为我没有得到 RGB 帧。我需要将这些帧传递给 OpenCv 进行图像处理。 有没有办法从dequeueOutputBuffer() 获取 RGB 帧?

注意:由于不支持RGB,所以在配置编码器时无法设置RGB作为颜色格式。

【问题讨论】:

    标签: android opencv colors video-processing android-mediacodec


    【解决方案1】:

    编码器的输出是 AVC 编码的帧。不是 RGB 或 YUV,是 AVC。

    颜色格式指定您输入编码器的帧的格式,而不是输出的格式,因此它对您从@获得的内容没有影响987654323@.

    如果您需要处理原始帧,您应该在将它们传递到编码器之前这样做。

    【讨论】:

    • 另外,我想问一下,我可以从这些 AVC 编码的帧中创建一个位图,还是需要先将它们传递给解码器?
    • 您需要将编码流输入解码器。帧可能被编码为先前帧的增量,因此您不能单独对待它们(参见例如en.wikipedia.org/wiki/Video_compression_picture_types)。有关从 AVC 流中提取帧的示例,请参阅bigflake.com/mediacodec/#ExtractMpegFramesTest
    • 你能以某种方式指示编码器或解码器编码/解码为 RGB 帧吗?您提到帧是 AVC,但我的最终目标是获得 RGB 解码帧。
    猜你喜欢
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2017-04-12
    • 1970-01-01
    • 2021-12-14
    • 2015-05-09
    相关资源
    最近更新 更多