C++ 从AVPicture中获取RGB值,并更改为FFMPEG中的灰度
我的代码的主要目的是更改FFMPEG中AVPicture的RGB值 我已经能够通过以下文章获得图像数据[0]: 我想知道如何访问RGB格式的pic.data[0]的3个字节。我一直试图以2D矩阵方式通过for循环访问pic.data[I][j],但第j个元素>3 这方面的任何指导都会有所帮助 代码如下:C++ 从AVPicture中获取RGB值,并更改为FFMPEG中的灰度,c++,ffmpeg,C++,Ffmpeg,我的代码的主要目的是更改FFMPEG中AVPicture的RGB值 我已经能够通过以下文章获得图像数据[0]: 我想知道如何访问RGB格式的pic.data[0]的3个字节。我一直试图以2D矩阵方式通过for循环访问pic.data[I][j],但第j个元素>3 这方面的任何指导都会有所帮助 代码如下: AVPicture pic; avpicture_alloc(&pic, PIX_FMT_RGB24, mpAVFrameInput->width,mpAVFram
AVPicture pic;
avpicture_alloc(&pic, PIX_FMT_RGB24, mpAVFrameInput->width,mpAVFrameInput->height);
auto ctxt = sws_getContext(mpAVFrameInput->width,mpAVFrameInput->height,static_cast<PixelFormat>(mpAVFrameInput->format),
mpAVFrameInput->width, mpAVFrameInput->height, PIX_FMT_RGB24, SWS_BILINEAR, nullptr, nullptr, nullptr);
if (ctxt == nullptr)
throw std::runtime_error("Error while calling sws_getContext");
sws_scale(ctxt, mpAVFrameInput->data, mpAVFrameInput->linesize, 0, mpAVFrameInput->height, pic.data,
pic.linesize);
for (int i = 0; i < (mpAVFrameInput->height-1); i++) {
for (int j = 0; j < (mpAVFrameInput->width-1); j++) {
printf("\n value: %d",pic.data[0][j]);
}
}
我是FFMPEG的新手,因此任何指导和帮助都是非常值得赞赏的
非常感谢首先逐行提取每帧的行数据;迭代循环,以查看帧的高度 以下是示例:
int FrameHeight = FrameInput->height;
int FrameWidth = FrameInput->width;
for(int Counter=0; Counter<FrameHeight; Counter++)
{
int RowSize = FrameWidth*sizeof(uint8_t)*3;
uint8_t* RowData = (uint8_t*) malloc(RowSize);
memset(RowData, 0, RowSize);
memcpy(RowData, AVFrameInput->data[0]+Counter*AVFrameInput->linesize[0], RowSize);
for(int k=0;k<AVFrameInput->linesize[0];++k)
{
if(RowData[k]> 200)
{
RowData[k] = RowData[k]/3;
}
else
{
if(RowData[k] > 150)
{
RowData[k] = RowData[k]/3;
}
else
{
RowData[k] = RowData[k]/3;
}
}
}
memcpy(AVFrameInput->data[0]+Counter*AVFrameInput->linesize[0], RowData, RowSize);
}
为什么不使用swscale来执行颜色转换而不是自己做呢?我计划以并行方式移植这个函数,并将其移植到CUDA.Hmm上,然后可能会检查这个-。但是,如果您正在解码H.264或MPEG-4,我建议您跳过FFmpeg,使用NVENC或其他基于GPU的解码技术,如果您已经计划使用CUDA。刚刚发布了答案,希望它也能帮助其他人。
int FrameHeight = FrameInput->height;
int FrameWidth = FrameInput->width;
for(int Counter=0; Counter<FrameHeight; Counter++)
{
int RowSize = FrameWidth*sizeof(uint8_t)*3;
uint8_t* RowData = (uint8_t*) malloc(RowSize);
memset(RowData, 0, RowSize);
memcpy(RowData, AVFrameInput->data[0]+Counter*AVFrameInput->linesize[0], RowSize);
for(int k=0;k<AVFrameInput->linesize[0];++k)
{
if(RowData[k]> 200)
{
RowData[k] = RowData[k]/3;
}
else
{
if(RowData[k] > 150)
{
RowData[k] = RowData[k]/3;
}
else
{
RowData[k] = RowData[k]/3;
}
}
}
memcpy(AVFrameInput->data[0]+Counter*AVFrameInput->linesize[0], RowData, RowSize);
}