我最近一直有一個奇怪的問題。 根據我在windows(stereo/quad/5.1)中設置音頻配置的方式,對avcodec_open2()的ffmpeg調用失敗,出現錯誤-22或者正常工作。 無法找到有關該錯誤的更多信息,我想我應該在此處詢問。 主流程是這樣的:ffmpeg avcodec_open2返回-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揚聲器配置設置爲立體聲,一切正常。 – Alex 2014-10-05 17:02:53
我GOOGLE了,我發現你應該嘗試像'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);' – SSpoke 2014-10-05 17:05:26
但是錯誤'-22 '真是錯誤'22',因爲任何可能的數字意味着它應該返回多少字節,所以..錯誤22是'#define EINVAL 22/*無效參數* /'這意味着參數無效。 – SSpoke 2014-10-05 17:11:10