我用函数解码 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/我的代码有问题吗?
任何帮助表示赞赏。
谢谢和最好的问候。