【发布时间】:2014-11-30 01:13:15
【问题描述】:
我最近总是遇到一个奇怪的问题。 根据我在 Windows (stereo/quad/5.1) 中设置音频配置的方式,对 avcodec_open2() 的 ffmpeg 调用失败并出现错误 -22 或正常工作。 无法找到有关该错误的太多信息,我想我应该在这里问一下。 主要流程是这样的:
c = st->codec;
avformat_alloc_output_context2(&oc, NULL, NULL, "video.mpeg");
oc->fmt->audio_codec = AV_CODEC_ID_MP2;
AVDictionary* dict = NULL;
ret = av_dict_set(&dict, "ac", "2", 0);
c->request_channels = 2;
ret = avcodec_open2(c, codec, &dict); //HERE IT FAILS WITH -22 if speaker configuration is not stereo
编解码器上下文“c”在流中设置如下:
st = avformat_new_stream(oc, *codec);
c = st->codec;
c->channels = 2;
c->channel_layout = AV_CH_LAYOUT_STEREO;
c->sample_fmt = AV_SAMPLE_FMT_S16;
c->codec_id = codec_id;
其中大部分内容是从他们在文档中找到的复用示例之一复制而来的。 如果在 Windows 中我将输出设置为立体声,一切都会按预期工作。
如果我将扬声器配置设置为 5.1(6 个通道),avcodec_open2 会失败并出现错误 -22。
所以我很难理解我做错了什么。通常,我的扬声器配置和 avcodec_open2 的结果之间应该没有任何关系。
还有其他需要设置的参数吗?
【问题讨论】:
-
为了更加清楚,如果 Windows 扬声器配置设置为立体声,一切都按预期工作。
-
我用谷歌搜索,我发现你应该尝试类似
av_log_set_level(AV_LOG_VERBOSE);来更详细地了解错误。然后void my_log_callback(void *ptr, int level, const char *fmt, va_list vargs) { printf ("\n%s",fmt);}然后av_log_set_callback(my_log_callback); -
但是错误
-22确实是错误22因为任何可能的数字都意味着它应该返回多少字节所以.. 错误 22 是#define EINVAL 22 /* Invalid argument */这意味着参数无效。 -
我明白了,我会看看这里传入的参数的差异(立体声与 5.1):avcodec_open2。也许我错过了什么。我记得他们是一样的。我会仔细检查:)
-
我想你想要
AV_CH_LAYOUT_5POINT1而不是AV_CH_LAYOUT_STEREO我猜有 6 个频道。