我正在尝试使用原始YUV帧数据对MP4视频进行编码,但我不确定如何填充平面数据(最好不使用其他库,如ffmpeg)
帧数据已经在I420中编码,不需要转换。
以下是我要做的事情:
const char *frameData = /* Raw frame data */;
x264_t *encoder = x264_encoder_open(¶m);
x264_picture_t imgInput, imgOutput;
x264_picture_alloc(&imgInput, X264_CSP_I420, width, height);
// how can I fill the struct data of imgInput
x264_nal_t *nals;
int i_nals;
int frameSize = x264_encoder_encode(encoder, &nals, &i_nals, &imgInput, &imgOutput);
我找到的等效命令行是:
x264 --output video.mp4 --fps 15 --input-res 1280x800 imgdata_01.raw
但我无法弄清楚应用程序是如何做到的。
感谢。
答案 0 :(得分:2)
查看libx264 API使用情况example。此示例使用fread()来填充x264_picture_alloc()分配的帧和来自stdin的实际i420数据。如果你已经在内存中有i420数据并希望跳过memcpy步骤而不是它,你可以:
答案 1 :(得分:0)
要完成上述答案,请填写x264_picture_t
图片。
int fillImage(uint8_t* buffer, int width, int height, x264_picture_t*pic){
int ret = x264_picture_alloc(pic, X264_CSP_I420, width, height);
if (ret < 0) return ret;
pic->img.i_plane = 3; // Y, U and V
pic->img.i_stride[0] = width;
// U and V planes are half the size of Y plane
pic->img.i_stride[1] = width / 2;
pic->img.i_stride[2] = width / 2;
int uvsize = ((width + 1) >> 1) * ((height + 1) >> 1);
pic->img.plane[0] = buffer; // Y Plane pointer
pic->img.plane[1] = buffer + (width * height); // U Plane pointer
pic->img.plane[2] = pic->img.plane[1] + uvsize; // V Plane pointer
return ret;
}