【发布时间】:2012-12-04 13:02:22
【问题描述】:
我一直在尝试使用新的低级MediaCodec 让 H264 编码与 Android 平板电脑上的相机捕获的输入一起工作。我在这方面遇到了一些困难,因为 MediaCodecAPI 的文档记录很差,但我终于得到了一些工作。
我将相机设置如下:
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.YV12); // <1>
parameters.setPreviewFpsRange(4000,60000);
parameters.setPreviewSize(640, 480);
mCamera.setParameters(parameters);
对于编码部分,我将 MediaCodec 对象实例化如下:
mediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 640, 480);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 500000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar); // <2>
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mediaCodec.start();
最终目标是创建一个 RTP 流(并与 Skype 对应),但到目前为止,我只是将原始 H264 直接流式传输到我的桌面。在那里,我使用以下 GStreamer 管道来显示结果:
gst-launch udpsrc port=5555 ! video/x-h264,width=640,height=480,framerate=15/1 ! ffdec_h264 ! autovideosink
一切都很好,除了颜色。我需要在计算机中设置 2 种颜色格式:一种用于相机预览(标记为 <1> 的行),另一种用于 MediaCodec 对象(标记为 <2>)
为了确定行<1> 的可接受值,我使用了parameters.getSupportedPreviewFormats()。由此,我知道相机上唯一支持的格式是ImageFormat.NV21和ImageFormat.YV2。
对于<2>,我检索了类型为video/avc 的MediaCodecInfo.CodecCapabilities-object,它是整数值19(对应于MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar 和2130708361(不对应于任何MediaCodecInfo.CodecCapabilities) 的值。
上述以外的任何其他值都会导致崩溃。
结合这些设置会产生不同的结果,我将在下面展示。这是 Android 上的屏幕截图(即“真实”颜色): 以下是 Gstreamer 显示的结果:
<1> = NV21, <2> = COLOR_FormatYUV420Planar
<1> = NV21, <2> = 2130708361
<1> = YV2, <2> = COLOR_FormatYUV420Planar
<1> = YV2, <2> = 2130708361
可以看出,这些都不令人满意。 YV2 色彩空间看起来最有希望,但看起来红色 (Cr) 和蓝色 (Cb) 是颠倒的。我猜 NV21 看起来是交错的(不过,我不是这个领域的专家)。
由于目的是与 Skype 通信,我认为我不应该更改解码器(即 Gstreamer 命令),对吧?这是否要在 Android 中解决?如果是这样:如何解决?或者这可以通过添加某些 RTP 有效负载信息来解决吗?还有什么建议吗?
【问题讨论】:
-
看起来 2130708361 对应于 COLOR_FormatSurface。您必须使用 API 版本 > 17。
标签: android colors h.264 gstreamer rtp