我一直在尝试使用新的低级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);
最终目标是创建一个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>,我检索的MediaCodecInfo.CodecCapabilities -object类型视频/ AVC,作为整数值19(与对应MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar和2130708361(其不与任何值对应MediaCodecInfo.CodecCapabilities)。
除上述以外的任何其他值都将导致崩溃。
组合这些设置会得出不同的结果,我将在下面显示。这是Android上的屏幕截图(即“真实”颜色): 在Android平板电脑上输入 这是Gstreamer显示的结果:
<1>= NV21,<2>= COLOR_FormatYUV420Planar NV21-COLOR_FormatYUV420Planar的Gstreamer输出
<1>= NV21,<2>= 2130708361 NV21-2130708361的Gstreamer输出
<1>= YV2,<2>= COLOR_FormatYUV420Planar YV2-COLOR_FormatYUV420Planar的Gstreamer输出
<1>= YV2,<2>= 2130708361 YV2-2130708361的Gstreamer输出
可以看出,这些都不令人满意。YV2色彩空间看起来是最有前途的,但看起来像红色(Cr)和蓝色(Cb)是倒置的。我猜NV21看起来是隔行扫描的(但是,我不是该领域的专家)。
由于目的是与Skype通信,因此我认为我不应该更改解码器(即Gstreamer命令),对吗?这是否需要在Android中解决?如果可以,如何解决?还是可以通过添加某些RTP有效负载信息来解决?还有其他建议吗?
繁花不似锦
桃花长相依
饮歌长啸
相关分类