我正在尝试实现一个可以获取下一帧的函数, 但是当我第三次调用这个函数时
int ret = decoder.get_next_frame(mat);
ret = decoder.get_next_frame(mat);
ret = decoder.get_next_frame(mat); // error
ffmpeg avcodec_send_packet 返回err,msg为 [h264 @ 0x8bd2780] NAL 单元大小无效 (10848 > 766)。 [h264 @ 0x8bd2780] 将输入拆分为 NAL 单元时出错。 前缀为'_'的变量都是成员变量
int VideoDecoder::get_next_frame(cv::Mat& mat) {
int ret = 0;
bool got_frame = false;
while (!got_frame && av_read_frame(_p_fmt_ctx, _p_packet) >= 0) {
if (_p_packet->stream_index == _video_stream_index) {
ret = avcodec_send_packet(_p_dec_ctx, _p_packet);
if (ret < 0 || ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
break;
}
while (ret >= 0) {
ret = avcodec_receive_frame(_p_dec_ctx, _p_frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
break;
}
sws_scale(_p_img_convert_ctx, _p_frame->data, _p_frame->linesize,
0, _p_dec_ctx->height, _p_frame_rgb->data, _p_frame_rgb->linesize);
mat = cv::Mat(_p_frame->height, _p_frame->width, CV_8UC3, _p_frame_rgb->data[0]);
got_frame = true;
}
}
av_packet_unref(_p_packet);
}
if (got_frame) {
return _p_dec_ctx->frame_number;
}
return 0;
}
那么问题是什么?
最佳答案
我重新检查代码,终于发现内存错误,视频数据在其他地方意外释放,所以上面的代码似乎没问题
关于c++ - 如何使用ffmpeg实现像get_next_frame一样的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55295618/