1

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

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

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

ffplay -f rawvideo -pix_fmt yuv420p -video_size 1280x720 input_video.yuv 

这是我用于解码 h264 文件并将yuvData缓冲区写入文件 .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;
}

我有一些问题需要澄清:

1/yuvData我从DecodeFrameNoDelay函数中得到的缓冲区真的是yuv420格式吗?

2/我的代码有问题吗?

任何帮助表示赞赏。

谢谢和最好的问候。

4

0 回答 0