1
mediacodec init:
mediaCodec = MediaCodec.createDecoderByType("video/avc");
mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height);
mediaFormat.setInteger("color-format", 19);
mediaCodec.configure(mediaFormat, paramSurface, null, 0);
int i = mediaCodec.dequeueOutputBuffer(this.bufferInfo, 0L);

    if (i >= 0)
    {
        int j = i;             

        mediaCodec.releaseOutputBuffer(j, true);

        if ((this.bufferInfo.flags & 0x4) != 0)
            Log.d(TAG, "BUFFER_FLAG_END_OF_STREAM");

        return ;

    }
    else if (i == -3)
    {
        Log.d(TAG, "INFO_OUTPUT_BUFFERS_CHANGED");
        outputBuffers = mediaCodec.getOutputBuffers();
    }
    else if (i == -2)
    {
        MediaFormat localMediaFormat = mediaCodec.getOutputFormat();
        Log.d(TAG, "Output format has changed to " + localMediaFormat);
        Log.d(TAG, "Output format width:" + localMediaFormat.getInteger("width"));
        Log.d(TAG, "Output format height:" + localMediaFormat.getInteger("height"));                    
    }
    else if(i==-1){         
        Log.d(TAG, "dequeueOutputBuffer timeout pts is " + pts);        
    }
4

1 回答 1

1

假设您在评论中指的是 ZTE V987,我发现的规格说它运行带有 PowerVR GPU 的 Android 4.1.2,但没有说明视频 IP 来自谁,所以它给出了明确的答案。但是,我认为问题在于您将颜色格式硬编码为 19(平面 YUV 420),而某些设备不支持该格式。

例如,如果 PVR GPU 与 TI 视频配对(就像在 Galaxy Nexus 中一样),您可能需要COLOR_TI_FormatYUV420PackedSemiPlanar(半平面格式)。您可能会在 logcat 输出中看到一些相关消息。

如果您查看encodeDecodeVideoFromBuffer()CTS EncodeDecodeTest中的方法,您可以看到它如何使用selectColorFormat()方法来选择颜色格式。如果您无法将 ffmpeg 配置为以这种格式提供数据,则您必须自己进行转换。有关布局的信息,请参见generateFrame()方法。

于 2013-11-22T15:45:27.290 回答