av_interleaved_write_frame(fmt_ctx, &enc_pkt);返回-22

 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;
}

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值