使用FFmpeg将解码的YUV420P数据写入文件?
我读取了用H264编码的帧,对其进行解码,并将其转换为YUV420P,数据存储在使用FFmpeg将解码的YUV420P数据写入文件?,ffmpeg,yuv,Ffmpeg,Yuv,我读取了用H264编码的帧,对其进行解码,并将其转换为YUV420P,数据存储在frameYUV420->data,(帧类型为AVFrame)。我想将这些数据保存到一个可以用GIMP显示的文件中 我知道如何保存RGB25像素格式,但我不太确定如何做YUV420P。虽然我知道Y分量将占用宽度x高度,而Cb/Cr将占用(宽度/2)x(高度/2)保存数据所需的空间量。所以我猜我需要先写Y数据,然后再写Cb和Cr数据。有人完成了我可以看一看的代码吗?void SaveAvFrame(AVFrame*AV
frameYUV420->data
,(帧类型为AVFrame
)。我想将这些数据保存到一个可以用GIMP显示的文件中
我知道如何保存RGB25像素格式,但我不太确定如何做YUV420P。虽然我知道Y分量将占用宽度x高度,而Cb/Cr将占用(宽度/2)x(高度/2)保存数据所需的空间量。所以我猜我需要先写Y数据,然后再写Cb和Cr数据。有人完成了我可以看一看的代码吗?void SaveAvFrame(AVFrame*AVFrame)
void SaveAvFrame(AVFrame *avFrame)
{
FILE *fDump = fopen("...", "ab");
uint32_t pitchY = avFrame->linesize[0];
uint32_t pitchU = avFrame->linesize[1];
uint32_t pitchV = avFrame->linesize[2];
uint8_t *avY = avFrame->data[0];
uint8_t *avU = avFrame->data[1];
uint8_t *avV = avFrame->data[2];
for (uint32_t i = 0; i < avFrame->height; i++) {
fwrite(avY, avFrame->width, 1, fDump);
avY += pitchY;
}
for (uint32_t i = 0; i < avFrame->height/2; i++) {
fwrite(avU, avFrame->width/2, 1, fDump);
avU += pitchU;
}
for (uint32_t i = 0; i < avFrame->height/2; i++) {
fwrite(avV, avFrame->width/2, 1, fDump);
avV += pitchV;
}
fclose(fDump);
}
{
文件*fDump=fopen(“…”,“ab”);
uint32_t pitchY=avFrame->linesize[0];
uint32_t pitchU=avFrame->linesize[1];
uint32_t pitchV=avFrame->linesize[2];
uint8_t*avY=avFrame->data[0];
uint8_t*avU=avFrame->data[1];
uint8_t*avV=avFrame->data[2];
对于(uint32_t i=0;iheight;i++){
fwrite(avY,avFrame->width,1,fDump);
avY+=沥青;
}
对于(uint32_t i=0;iheight/2;i++){
写入(avU,avFrame->宽度/2,1,fDump);
avU+=pitchU;
}
对于(uint32_t i=0;iheight/2;i++){
fwrite(avV,avFrame->宽度/2,1,fDump);
avV+=pitchV;
}
fclose(fDump);
}
int saveYUVFrameToFile(AVFrame*frame,int-width,int-height)
{
文件*文件句柄;
int y,writeError;
字符文件名[32];
静态int frameNumber=0;
sprintf(文件名,“帧%d.yuv”,帧号);
fileHandle=fopen(文件名,“wb”);
if(fileHandle==NULL)
{
printf(“无法打开%s…。\n”,文件名);
返回误差;
}
/*将Y平面数据写入文件*/
对于(y=0;y<高度;y++)
{
writeError=fwrite(帧->数据[0]+y*帧->线宽[0],1,宽度,文件句柄);
if(writeError!=宽度)
{
printf(“无法写入Y平面数据!\n”);
返回误差;
}
}
/*除以2*/
高度>>=1;
宽度>>=1;
/*将U平面数据写入文件*/
对于(y=0;y<高度;y++)
{
writeError=fwrite(帧->数据[1]+y*帧->行大小[1],1,宽度,文件句柄);
if(writeError!=宽度)
{
printf(“无法写入U平面数据!\n”);
返回误差;
}
}
/*将V平面数据写入文件*/
对于(y=0;y<高度;y++)
{
writeError=fwrite(帧->数据[2]+y*帧->线宽[2],1,宽度,文件句柄);
if(writeError!=宽度)
{
printf(“无法写入V平面数据!\n”);
返回误差;
}
}
fclose(文件句柄);
frameNumber++;
返回无错误;
基本上,这就是我使用FFmpeg和stackoverflow用户提供的几个示例得出的结论
int saveYUVFrameToFile(AVFrame* frame, int width, int height)
{
FILE* fileHandle;
int y, writeError;
char filename[32];
static int frameNumber = 0;
sprintf(filename, "frame%d.yuv", frameNumber);
fileHandle = fopen(filename, "wb");
if (fileHandle == NULL)
{
printf("Unable to open %s...\n", filename);
return ERROR;
}
/*Writing Y plane data to file.*/
for (y = 0; y < height; y++)
{
writeError = fwrite(frame->data[0] + y*frame->linesize[0], 1, width, fileHandle);
if (writeError != width)
{
printf("Unable to write Y plane data!\n");
return ERROR;
}
}
/*Dividing by 2.*/
height >>= 1;
width >>= 1;
/*Writing U plane data to file.*/
for (y = 0; y < height; y++)
{
writeError = fwrite(frame->data[1] + y*frame->linesize[1], 1, width, fileHandle);
if (writeError != width)
{
printf("Unable to write U plane data!\n");
return ERROR;
}
}
/*Writing V plane data to file.*/
for (y = 0; y < height; y++)
{
writeError = fwrite(frame->data[2] + y*frame->linesize[2], 1, width, fileHandle);
if (writeError != width)
{
printf("Unable to write V plane data!\n");
return ERROR;
}
}
fclose(fileHandle);
frameNumber++;
return NO_ERROR;