Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 填充AVFrame.data的最佳方法是什么_Opengl_Ffmpeg_Libavcodec_Avcodec - Fatal编程技术网

Opengl 填充AVFrame.data的最佳方法是什么

Opengl 填充AVFrame.data的最佳方法是什么,opengl,ffmpeg,libavcodec,avcodec,Opengl,Ffmpeg,Libavcodec,Avcodec,我想尽快将opengl帧缓冲区数据传输到AVCodec 我已经使用着色器将RGB转换为YUV,并使用glReadPixels读取它 我仍然需要手动填充AVFrame数据。还有更好的办法吗 AVFrame *frame; // Y frame->data[0][y*frame->linesize[0]+x] = data[i*3]; // U frame->data[1][y*frame->linesize[1]+x] = data[i*3+1]; // V frame-&

我想尽快将opengl帧缓冲区数据传输到AVCodec

我已经使用着色器将RGB转换为YUV,并使用glReadPixels读取它

我仍然需要手动填充AVFrame数据。还有更好的办法吗

AVFrame *frame;
// Y
frame->data[0][y*frame->linesize[0]+x] = data[i*3];
// U
frame->data[1][y*frame->linesize[1]+x] = data[i*3+1];
// V
frame->data[2][y*frame->linesize[2]+x] = data[i*3+2];

您可以使用
sws\u比例

事实上,转换RGB->YUV时不需要着色器。相信我,不会有什么不同的表演

swsContext = sws_getContext(WIDTH, HEIGHT, AV_PIX_FMT_RGBA, WIDTH, HEIGHT, AV_PIX_FMT_YUV, SWS_BICUBIC, 0, 0, 0 );
sws_scale(swsContext, (const uint8_t * const *)sourcePictureRGB.data, sourcePictureRGB.linesize, 0, codecContext->height, destinyPictureYUV.data, destinyPictureYUV.linesize);
destinyPictureYUV
中的数据将准备好进入编解码器

在此示例中,destinyPictureYUV是要填充的
AVFrame
。请尝试这样设置:

AVFrame * frame;
AVPicture destinyPictureYUV;

avpicture_alloc(&destinyPictureYUV, codecContext->pix_fmt, newCodecContext->width, newCodecContext->height);

// THIS is what you want probably
*reinterpret_cast<AVPicture *>(frame) = destinyPictureYUV;
AVFrame*frame;
AVPicture destinyPictureYUV;
avpicture_alloc(&destinyPictureYUV,codeContext->pix_fmt,newcodeContext->width,newcodeContext->height);
//这可能就是你想要的
*重新解释投射(帧)=目标图像UV;

有了这个设置,你也可以填充你已经在GPU中转换成YUV的数据,如果你想。。。您可以选择您想要的方式。

您可以使用
sws\u scale

事实上,转换RGB->YUV时不需要着色器。相信我,不会有什么不同的表演

swsContext = sws_getContext(WIDTH, HEIGHT, AV_PIX_FMT_RGBA, WIDTH, HEIGHT, AV_PIX_FMT_YUV, SWS_BICUBIC, 0, 0, 0 );
sws_scale(swsContext, (const uint8_t * const *)sourcePictureRGB.data, sourcePictureRGB.linesize, 0, codecContext->height, destinyPictureYUV.data, destinyPictureYUV.linesize);
destinyPictureYUV
中的数据将准备好进入编解码器

在此示例中,destinyPictureYUV是要填充的
AVFrame
。请尝试这样设置:

AVFrame * frame;
AVPicture destinyPictureYUV;

avpicture_alloc(&destinyPictureYUV, codecContext->pix_fmt, newCodecContext->width, newCodecContext->height);

// THIS is what you want probably
*reinterpret_cast<AVPicture *>(frame) = destinyPictureYUV;
AVFrame*frame;
AVPicture destinyPictureYUV;
avpicture_alloc(&destinyPictureYUV,codeContext->pix_fmt,newcodeContext->width,newcodeContext->height);
//这可能就是你想要的
*重新解释投射(帧)=目标图像UV;

有了这个设置,你也可以填充你已经在GPU中转换成YUV的数据,如果你想。。。您可以选择您想要的方式。

我认为应该可以将数据读回PBO并将其映射到客户端地址空间,并在AVFrame结构中引用该内存方向。但是数据格式是YUV数组。我需要单独的阵列您可以根据需要在着色器中组织数据。一开始可能看起来有点不直观,但这是完全可能的。我认为应该可以将数据读回PBO并将其映射到客户端地址空间,并在AVFrame结构中引用该内存方向。但数据格式是YUV数组。我需要单独的阵列您可以根据需要在着色器中组织数据。一开始它可能看起来有点不直观,但它确实是可能的<代码>sws_比例经过高度优化。检查我上次写的更新。。。设置destinyPictureYUV/frame[使用石膏,它们是相同的东西],然后尝试直接填充YUV。比较两种方法的性能。我想不会有太大的不同。我相信这种差异会被注意到,这取决于你照片的大小。请记住,当在GPU上完成时,您有很多GPU内核,而CPU上的内核较少。但是,1个CPU核比一个GPU核快。这就是为什么有时候
sws\u scale
比GPU更快的原因。对于非常大的图像,GPU可能会有所不同,速度更快。。但这只是打赌,我从来没有在这方面做过精确的基准测试。@WagnerPatriota:好吧,sws_scale的性能可能相当高,但任何基于GPU的实现都会在数量级上击败它。此外,人们甚至可以直接在GPU上应用一些色度子采样,减少必须读回客户机内存的内存量。@WagnerPatriota:内核的数量与此转换无关。CPU和GPU操作都会限制带宽。但是GPU对于此类操作具有架构优势。内存带宽要高得多,并且图像数据是按2D缓存位置组织的。一个现代的GPU可以轻松地以200到300GB/s的速度处理这个问题,而在一个像样的桌面CPU上,你可以得到其中的十分之一——如果你运气好的话。@derhass,我同意。。。你是对的。正如我在回答“它不会有非常不同的表现”时所说的那样,但它当然会有,而且我从未对此进行过基准测试。但是,我对GPU和CPU上的一些算法的计时有很好的经验,我确信
sws\u scale
确实很快<代码>sws_比例对于小图像来说肯定更快。我敢打赌,对于大图像,GPU会更快。但这只是我的打赌,我建议做个测试!比打赌好:-)实际上不是<代码>sws_比例经过高度优化。检查我上次写的更新。。。设置destinyPictureYUV/frame[使用石膏,它们是相同的东西],然后尝试直接填充YUV。比较两种方法的性能。我想不会有太大的不同。我相信这种差异会被注意到,这取决于你照片的大小。请记住,当在GPU上完成时,您有很多GPU内核,而CPU上的内核较少。但是,1个CPU核比一个GPU核快。这就是为什么有时候
sws\u scale
比GPU更快的原因。对于非常大的图像,GPU可能会有所不同,速度更快。。但这只是打赌,我从来没有在这方面做过精确的基准测试。@WagnerPatriota:好吧,sws_scale的性能可能相当高,但任何基于GPU的实现都会在数量级上击败它。此外,人们甚至可以直接在GPU上应用一些色度子采样,减少必须读回客户机内存的内存量。@WagnerPatriota:内核的数量与此转换无关。CPU和GPU操作都会限制带宽。但是GPU对于此类操作具有架构优势。内存带宽要高得多,并且图像数据是按2D缓存位置组织的。一个现代的GPU可以轻松地以200到300GB/s的速度处理这个问题,而在一个像样的桌面CPU上,你可以得到其中的十分之一——如果你运气好的话。@derhass,我同意。。。你是对的。正如我在我的回答中所说的,“它不会有非常不同的表现”,但它会的,当然