使用FFmpeg将解码的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

我读取了用H264编码的帧,对其进行解码,并将其转换为YUV420P,数据存储在
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;