video - ffmpeg avcodec_receive_packet 返回 -11
问题描述
我尝试使用 ffmpeg API 从一系列输入图像创建视频。
首先我从输入文件中读取 AVFrame 然后传递给avcodec_send_frame()
,但是当我调用avcodec_get_packet()
以获取编码数据包时,它返回 -11 (在当前状态下输出不可用)。
我只是一个初学者,所以我不知道我的代码是否有问题。
这是我的源代码:
for (unsigned int i = 0; i < nb_input; ++i) {
const char *item = input[i];
ret = open_input_file(item);
if(ret < 0) {
goto end;
}
packet = av_packet_alloc();
if(packet == NULL) {
_log_e("Cannot allocate packet");
goto end;
}
ret = av_read_frame(_ifmt_ctx, packet);
if(ret < 0) {
goto end;
}
av_packet_rescale_ts(packet,
_ifmt_ctx->streams[0]->time_base,
_decode_ctx->time_base);
ret = avcodec_send_packet(_decode_ctx, packet);
if (ret < 0) {
goto end;
}
frame = av_frame_alloc();
if(frame == NULL) {
ret = AVERROR(ENOMEM);
_log_e_2("Failed to allocate frame variable for this file : %s ", item);
goto end;
}
ret = avcodec_receive_frame(_decode_ctx, frame);
if (ret == 0) {
/*
* DO FILTER PROCESSING HERE
*/
}
for (int j = 0; j < 25; ++j) {
ret = avcodec_send_frame(_encode_ctx, frame);
if (ret < 0) {
_log_e_2("Failed to send frame at pts = %d", pts);
goto end;
}
AVPacket *out_packet;
out_packet = av_packet_alloc();
if(out_packet == NULL) {
_log_e_2("Failed to allocate output packet at pts = %d" , pts);
goto end;
}
ret = avcodec_receive_packet(_encode_ctx, out_packet);
if(ret < 0) {
_log_e_2("Failed to receive encoded packet at pts = %d" , pts);
if (ret == AVERROR(EAGAIN)) {
_log_e(" output is not available in the current state - user must try to send input");
}
else if (ret == AVERROR_EOF) {
_log_e(" the encoder has been fully flushed, and there will be no more output packets");
}
else if (ret == AVERROR(EINVAL)) {
_log_e(" codec is not opened");
}
av_packet_unref(out_packet);
goto end;
}
_log_v_2("Write encoded packet at pts = %d to output file", pts);
ret = av_interleaved_write_frame(_ofmt_ctx, out_packet);
if (ret < 0) {
_log_e_2("Failed to write encoded packet at pts = %d to output file", pts);
goto end;
}
av_packet_unref(out_packet);
pts++;
}
解决方案
编码器在输出第一个编码帧之前需要几帧输入。您必须忽略 EAGAIN 并只提供下一个输入帧。
推荐阅读
- java - 尝试自动装配时在弹簧托管类上获取空指针
- laravel - Laravel:调用字符串上的成员函数 move()
- c - 禁用优化的 c alloca 函数的奇怪汇编代码 - gcc 使用 DIV 和 IMUL 为常数 16,并转换?
- django - 不在 PyCharm 中制作 Django 项目
- rust - 在 Rust 中,如何解决编译错误无法返回临时值?
- php - 反应联系表不通过 PHP 发送电子邮件
- java - 确定已解析时间的精度(有效数字)
- javascript - 在 Vue 模板中按类别组循环遍历产品项
- prometheus - 如何在 Splunk 中解压缩 snappy 编码文件
- django - 如何将表单的 ModelMutiplechoiceField 引用到 Django 中的 foreignKey?