C++ Openh264解码帧节点延迟输出缓冲区yuv是yuv420格式?

C++ Openh264解码帧节点延迟输出缓冲区yuv是yuv420格式?,c++,yuv,openh264,C++,Yuv,Openh264,我使用DecodeFrameNoDelay函数解码h264文件,并获取yuvData缓冲区 我想将yuvData缓冲区写入file.yuv并使用ffmpeg命令播放。但是当我用ffmpeg命令播放yuv文件时,结果是不正确的 这是我用来播放yuv文件的ffmpeg命令: ffplay -f rawvideo -pix_fmt yuv420p -video_size 1280x720 input_video.yuv 这是我用来解码h264文件并将yuvData缓冲区写入file.yuv的代码

我使用
DecodeFrameNoDelay
函数解码h264文件,并获取
yuvData
缓冲区

我想将
yuvData
缓冲区写入file.yuv并使用ffmpeg命令播放。但是当我用ffmpeg命令播放yuv文件时,结果是不正确的

这是我用来播放yuv文件的ffmpeg命令:

ffplay -f rawvideo -pix_fmt yuv420p -video_size 1280x720 input_video.yuv 
这是我用来解码h264文件并将
yuvData
缓冲区写入file.yuv的代码

void init(int width, int height) {
    WelsCreateDecoder(&decoder);
    decodingParam = {0};
    decodingParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_AVC;
    decoder->Initialize(&decodingParam);
    bufferInfo = {0};
    bufferInfo.iBufferStatus = 1;

    yuvData = new uint8_t*[3];
    yuvData[0] = new uint8_t[width * height];
    yuvData[1] = new uint8_t[width * height / 4];
    yuvData[2] = new uint8_t[width * height / 4];

}

bool decode(const unsigned char* rawEncodedData, int rawEncodedDataLength, uint8_t** yuvData, char *name) {
    int err = decoder->DecodeFrameNoDelay(rawEncodedData, rawEncodedDataLength, yuvData, &bufferInfo);

    int width = bufferInfo.UsrData.sSystemBuffer.iWidth;
    int height = bufferInfo.UsrData.sSystemBuffer.iHeight;

    FILE *pFile = fopen(std::string("screen.yuv").c_str(), "ab");
    fwrite(yuvData[0], 1, width * height, pFile);
    fwrite(yuvData[1], 1, width * height / 4, pFile);
    fwrite(yuvData[2], 1, width * height / 4, pFile);
    fclose(pFile);

    std::cout << width << height << std::endl;

    if (err != 0) {
        std::cout << "H264 decoding failed. Error code: " << err << "." << std::endl;
        parseErrorCode(err);
        return false;
    }

    printf("H264 decoding success, err: %d, name: %s, status: %d\n", err, name, bufferInfo.iBufferStatus);

    return true;
}
void init(整数宽度、整数高度){
WelsCreateDecoder(&decoder);
decodingParam={0};
decodingParam.sVideoProperty.EvideobType=视频\比特流\ AVC;
解码器->初始化(&decodingParam);
bufferInfo={0};
bufferInfo.iBufferStatus=1;
yuvData=新uint8_t*[3];
yuvData[0]=新uint8_t[宽度*高度];
yuvData[1]=新单元8_t[宽度*高度/4];
yuvData[2]=新单元8_t[宽度*高度/4];
}
布尔解码(常量无符号字符*rawEncodedData,int-rawEncodedDataLength,uint8\u t**yuvData,字符*name){
int err=decoder->DecodeFrameNoDelay(rawEncodedData、rawEncodedDataLength、yuvData和bufferInfo);
int width=bufferInfo.UsrData.sSystemBuffer.iWidth;
int height=bufferInfo.UsrData.sSystemBuffer.iHeight;
FILE*pFile=fopen(std::string(“screen.yuv”).c_str(),“ab”);
fwrite(yuvData[0],1,宽度*高度,pFile);
fwrite(yuvData[1],1,宽*高/4,pFile);
fwrite(yuvData[2],1,宽*高/4,pFile);
fclose(pFile);

std::你能解决你的问题吗?如果不能,你能分享一些yuv文件的帧让我看一下吗?@FredrikPihl我刚刚知道
yuvData
来自
DecodeFrameNoDelay
yuv420格式,但仍然不能解决为什么ffmpeg播放错误的yuv文件。你可以使用这个命令
ffmpeg-I input.mp4-vcode copy-bsf h264_mp4toannexb-an-f h264 output.h264
将视频转换为h264格式并使用命令ffmpeg-i input.h264-c:v copy-frames:v1-f h264 frame.h264
解决问题了吗?如果没有,你能共享yuv文件的一些帧以便我可以查看一下吗?@FredrikPihl我刚从
中知道yuvData
>DecodeFrameNodeDelay是yuv420格式,仍然无法解决ffmpeg播放错误的原因。您可以使用此命令
ffmpeg-I input.mp4-vcodec copy-bsf h264\u mp4toanexb-an-f h264 output.h264
将视频转换为h264格式,并使用命令
ffmpeg-I input.h264-c:v copy-frames:v1-f h提取帧264帧。h264