3 回答
TA贡献1851条经验 获得超4个赞
我通过使用一个简单的函数在Android级别上交换字节平面解决了该问题:
public byte[] swapYV12toI420(byte[] yv12bytes, int width, int height) {
byte[] i420bytes = new byte[yv12bytes.length];
for (int i = 0; i < width*height; i++)
i420bytes[i] = yv12bytes[i];
for (int i = width*height; i < width*height + (width/2*height/2); i++)
i420bytes[i] = yv12bytes[i + (width/2*height/2)];
for (int i = width*height + (width/2*height/2); i < width*height + 2*(width/2*height/2); i++)
i420bytes[i] = yv12bytes[i - (width/2*height/2)];
return i420bytes;
}
TA贡献1860条经验 获得超8个赞
我认为将价值交换到位会更有效。
int wh4 = input.length/6; //wh4 = width*height/4
byte tmp;
for (int i=wh4*4; i<wh4*5; i++)
{
tmp = input[i];
input[i] = input[i+wh4];
input[i+wh4] = tmp;
}
甚至更好,您可以代替
inputBuffer.put(input);
以正确的顺序排列3个平面切片
inputBuffer.put(input, 0, wh4*4);
inputBuffer.put(input, wh4*5, wh4);
inputBuffer.put(input, wh4*4, wh4);
我认为那应该只有很小的开销
TA贡献1951条经验 获得超3个赞
似乎Android正在使用YV12进行传输,但在H264标头中设置的格式为YUV420。除了U和V通道的顺序不同之外,这些格式是相同的,这说明了红色和蓝色的交换。
最好当然是将设置固定在Android端。但是,如果无法为相机和编码器设置兼容设置,则必须在GStreamer端强制使用该格式。
这可以通过capssetter在ffdec_h264
... ! ffdec_h264 ! capssetter caps="video/x-raw-yuv, format=(fourcc)YV12" ! colorspace ! ...
- 3 回答
- 0 关注
- 1072 浏览
添加回答
举报