我在显示NV12格式的原始YUV文件时遇到问题.
我可以显示一个选定的框架,然而,它仍然主要是黑色和白色,具有一定的粉红色和绿色.
以下是我的输出看起来像 alt文本http://i32.tinypic.com/hv0vih.png
无论如何,这是我的程序的工作方式.(这是在cocoa/objective-c中完成的,但我需要你对程序算法的专家建议,而不是语法.)
在程序执行之前,YUV文件存储在名为"test.yuv"的二进制文件中.该文件采用NV12格式,这意味着首先存储Y计划,然后隔行扫描UV计划.我的文件提取没有问题,因为我做了很多测试.
在启动期间,我创建了一个查找表,它将二进制/ 8位/字节/字符转换为受尊重的Y,U,V浮点值
对于Y平面,这是我的代码
-(void)createLookupTableY //creates a lookup table for converting a single byte into a float between 0 and 1
{
NSLog(@"YUVFrame: createLookupTableY");
lookupTableY = new float [256];
for (int i = 0; i < 256; i++)
{
lookupTableY[i] = (float) i /255;
//NSLog(@"lookupTableY[%d]: %f",i,lookupTableY[i]);//prints out the value of each float
}
}
Run Code Online (Sandbox Code Playgroud)
U Plane查找表
-(void)createLookupTableU //creates a lookup table for converting a single byte into a float between 0 and 1
{
NSLog(@"YUVFrame: …Run Code Online (Sandbox Code Playgroud) 我知道这个主题多次出现在主板上,但我无论如何都无法工作......我想保存从预览到jpeg文件的视图帧.它看起来或多或少(代码简化 - 没有额外的逻辑,例外等)像这样......
public void onPreviewFrame(byte[] data, Camera camera) {
int width = camera.getParameters().getPreviewSize().width;
int height = camera.getParameters().getPreviewSize().height;
final int[] rgb = decodeYUV420SP(data, width, height);
Bitmap bmp = Bitmap.createBitmap(rgb, width, height,Bitmap.Config.ARGB_8888);
String filename="/sdcard/file" + (index++)+ ".jpg";
FileOutputStream out;
out = new FileOutputStream(filename);
bmp.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
out=null;
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试转换颜色的方法之一(我相信这个板)
public int[] decodeYUV420SP( byte[] yuv420sp, int width, int height) {
final int frameSize = width * height;
int rgb[]=new int[width*height];
for (int j = 0, yp = 0; j < …Run Code Online (Sandbox Code Playgroud) 如何在C/C++中执行RGB-> YUV转换?
我有一些Bitmap .. RGB我需要将它转换为YUV
库?TUTS?文章?
我正在使用OpenGL ES和ffmpeg为Apple TV编写媒体播放器框架.在OpenGL ES上渲染需要转换为RGBA,使用swscale进行软转换是无法忍受的慢速,因此在互联网上使用信息我提出了两个想法:使用neon(如此处)或使用片段着色器以及GL_LUMINANCE和GL_LUMINANCE_ALPHA.
我几乎对OpenGL一无所知,第二个选项仍然无效:)
你能指点一下如何继续吗?先感谢您.
我正在尝试使用新的相机api.突发捕获速度太慢,因此我在ImageReader中使用YUV_420_888格式并稍后进行JPEG enconding,如以下帖子中所示:
问题是当我尝试使用RenderScript从YUV_420_888编码JPEG时,我得到绿色图像,如下所示:
RenderScript rs = RenderScript.create(mContext);
ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(rs));
Type.Builder yuvType = new Type.Builder(rs, Element.YUV(rs)).setX(width).setY(height).setYuvFormat(ImageFormat.YUV_420_888);
Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);
Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(width).setY(height);
Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);
in.copyFrom(data);
yuvToRgbIntrinsic.setInput(in);
yuvToRgbIntrinsic.forEach(out);
Bitmap bmpout = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
out.copyTo(bmpout);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmpout.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] jpegBytes = baos.toByteArray();
Run Code Online (Sandbox Code Playgroud)
数据变量(YUV_420_888数据)来自:
ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
Run Code Online (Sandbox Code Playgroud)
我在JPEG编码中做错了什么才能使图像只显示为绿色?
提前致谢
编辑:这是我获得的绿色图像的示例:
https://drive.google.com/file/d/0B1yCC7QDeEjdaXF2dVp6NWV6eWs/view?usp=sharing
我完全理解所讨论的NV12格式的大小
现在我正在阅读有关以这种格式存储UV平面的两个来源:一个是https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx
NV12
所有Y样本首先在内存中显示为具有偶数行的无符号字符值数组.Y平面后面紧跟着一组无符号字符值,其中包含打包的U(Cb)和V(Cr)样本.当组合的UV数组作为little-endian WORD值的数组寻址时,LSB包含U值,并且MSB包含V值.NV12是DirectX VA的首选4:2:0像素格式.预计这将是支持4:2:0视频的DirectX VA加速器的中期要求.下图显示了Y平面和包含U和V样本的数组.
我的理解是:在UV平面中,每个U和V都以单字节存储.
当我从维基百科阅读这篇文章时:https: //wiki.videolan.org/YUV#NV12
它说:
NV12
与I420相关,NV12具有一个亮度"亮度"平面Y和一个具有U和V值交错的平面.在NV12中,色度平面(蓝色和红色)在水平和垂直维度上进行二次采样,系数为2.对于2x2像素组,您有4个Y样本和1个U和1个样本.将NV12视为I420与U和V平面交错是有帮助的.这是NV12的图形表示.每个字母代表一位:对于1 NV12像素:YYYYYYYY UVUV对于2像素NV12帧:YYYYYYYYYYYYYYY UVUVUVUV对于50像素NV12帧:Y*8*50(UV)*2*50对于n像素NV12帧:Y*8*n(UV)*2*n
我在这里理解的是:每个U和V在每个字节中逐位交错.因此,UV平面的每个字节将包含4U位和4V位交错.
任何人都可以澄清我的怀疑吗?
我有一个OpenGL ES 2.0 QNX应用程序,它使用相机输入,进行一些处理并呈现屏幕内容.
我的所有着色器都将相机的GL_TEXTURE_EXTERNAL_OES纹理作为输入,其格式为YUV422.
我想使用png格式的RGB图像在目标平台(QNX)上测试我的应用程序.
问题是:如何从RGB图像创建GL_TEXTURE_EXTERNAL_OES纹理,以模拟我的应用程序从相机输入?
我使用AVFoundation捕获了视频.我已设置(视频设置)并获得outputsamplebuffer kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange格式.但我需要YUV420格式进行进一步处理.
我怀疑是
中1.difference 420YpCbCr8BiPlanarVideoRange,420YpCbCr8BiPlanarFULLRange, 420YpCbCr8PlanarFullRange,420YpCbCr8Planar和YUV420?
2.我可以将420YpCbCr8BiPlanarVideoRange转换为YUV420吗?
3.如何将YUV420转换为32BGRA?
4)或其他一些方法来做到这一点??? 这是任何开源库或Apple Framework ....
我已经经历了加速框架......它有以下planar8,planerF,RGBA8888等的图像转换 ...任何方式与这些格式相等 32BGRA/YUV420/ 420YpCbCr8BiPlanarVideoRange 并做我的要求?????
提前致谢
提前致谢
我想将YUV420P图像(从H.264流中接收)转换为RGB,同时也调整大小,使用sws_scale.
原始图像的大小是480 × 800.只需转换相同的尺寸即可.
但是当我尝试更改尺寸时,我得到一个扭曲的图像,具有以下模式:
481 × 800将产生扭曲的B&W图像,看起来像是在中间切割482 × 800 将更加扭曲483 × 800 是扭曲但颜色484 × 800 没问题(缩放正确).现在这个模式如下 - 如果除以4之间的差异,缩放将只能正常工作.
这是我解码和转换图像的方式的示例代码.所有方法都显示"成功".
int srcX = 480;
int srcY = 800;
int dstX = 481; // or 482, 483 etc
int dstY = 800;
AVFrame* avFrameYUV = avcodec_alloc_frame();
avpicture_fill((AVPicture *)avFrameYUV, decoded_yuv_frame, PIX_FMT_YUV420P, srcX , srcY);
AVFrame *avFrameRGB = avcodec_alloc_frame();
AVPacket avPacket;
av_init_packet(&avPacket);
avPacket.size = read; // size …Run Code Online (Sandbox Code Playgroud) 我正在尝试调整(缩小)YUV420sp格式的图像.是否可以在不将其转换为RGB的情况下进行此类图像调整,从而直接操作YUV420sp像素阵列?我在哪里可以找到这样的算法?
谢谢