av_interleaved_write_frame(fmt_ctx, &enc_pkt);返回-22,
原因之一:
各处寻找答案,都说是:pts和dts的问题。
我跟踪了pts和dts, 发现这两个值第一次是随机一个相等数,比如pts = dts = 486400. 然后第二次就是pts=dts = 487424, 可以看出,这是递增了1024.
所以,并不是pts和dts出了问题。毕竟官网的 音频编码和视频编码 的例子,最后也没有处理pts和dts。
原因之二:
enc_pkt.stream_index的值,设置错了。
是因为enc_pkt.stream_index 默认的是0。
而我合成音视频后,音频的索引是1,
所以,需要给enc_pkt.stream_index = stream_index; 需要重新赋值一下。
参考链接:
https://blog.csdn.net/shizheng163/article/details/80476489
正确代码如下:
// 做录制音视频项目
// 此函数是:保存最后几帧音频数据
static int flush_encoder(AVFormatContext *fmt_ctx, unsigned int stream_index)
{
int ret = 0;
int got_frame = 0;
AVPacket enc_pkt;
av_init_packet(&enc_pkt);
if(!(pFormatCtx_Out->streams[stream_index]->codec->codec->capabilities & AV_CODEC_CAP_DELAY))
return 0;
while(1)
{
enc_pkt.data = NULL;
enc_pkt.size = 0;
ret = avcodec_encode_audio2(fmt_ctx->streams[stream_index]->codec, &enc_pkt, NULL, &got_frame);
if (ret < 0)
break;
if (!got_frame)
{
ret = 0;
break;
}
enc_pkt.stream_index = stream_index;// 这一行一定要加上。
ret = av_interleaved_write_frame(fmt_ctx, &enc_pkt);
if (ret < 0)
{
break;
}
}
return ret;
}