我在Android上使用FFMPEG + x264将YUV420帧编码为视频文件。我在每个帧上使用以下代码对它们进行编码:
avcodec_encode_video2(gVideoWriteCodecCtx, &packet, pCurrentFrame, &gotPacket);
在前几次调用中,帧缓冲区被填充,没有任何编码。第一次编码发生时,调用x264_lookahead_get_frames。我可以看到我的框架数组已正确填充,但第一项是NULL。因此,在x264_weights_analyse中,当帧[p0]为NULL时,参考帧得到了,我在那里得到了一个异常。
slicetype.c,“frames”中的第一帧是NULL
if( h->param.analyse.i_weighted_pred && b == p1 )
{
x264_emms();
x264_weights_analyse( h, fenc, frames[p0], 1 );
w = fenc->weight[0];
}
那里发生异常,ref为NULL
static void x264_weights_analyse( x264_t *h, x264_frame_t *fenc, x264_frame_t *ref, int b_lookahead )
{
int i_delta_index = fenc->i_frame - ref->i_frame - 1;
我肯定错过了一些东西,因为我确信这个编码器适用于大多数人:)有没有人知道为什么“frames”数组中的第一帧是空的?
非常感谢
答案 0 :(得分:0)
如果这可以帮助任何人,它看起来像图书馆里的奇怪东西。在lookahead.c line236中反转这两行就完成了这项工作:
x264_stack_align( x264_slicetype_decide, h );
x264_lookahead_update_last_nonb( h, h->lookahead->next.list[0] );
到
x264_lookahead_update_last_nonb( h, h->lookahead->next.list[0] );
x264_stack_align( x264_slicetype_decide, h );