Ich habe in letzter Zeit immer wieder ein seltsames Problem. Je nachdem, wie ich meine Audio-Konfiguration in Windows (Stereo/Quad/5.1) einrichten, schlägt ein ffmpeg-Aufruf von avcodec_open2() mit Fehler -22 fehl oder funktioniert einfach. Da ich nicht viel über diesen Fehler herausfinden konnte, dachte ich, ich sollte hier nachfragen. Der Hauptstrom geht so:ffmpeg avcodec_open2 gibt -22 zurück, wenn ich meine Lautsprecherkonfiguration ändere
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
Der Codec Kontext ‚c‘ wird wie folgt in einem Strom ein:
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;
Das meiste davon von ihrem eines der Muxing Beispiele kopiert gefunden in der Dokumentation. Alles funktioniert wie erwartet, wenn ich in Windows den Ausgang auf Stereo eingestellt habe.
Wenn ich meine Lautsprecherkonfiguration auf 5.1 (6 Kanäle) einstelle, schlägt avcodec_open2 mit Fehler -22 fehl.
So habe ich eine schwere Zeit zu verstehen, was ich falsch mache. Normalerweise sollte es keine Beziehung zwischen meiner Lautsprecherkonfiguration und dem Ergebnis von avcodec_open2 geben.
Gibt es einige andere Parameter, die ich einstellen muss? Hier
Nur um zusätzliche klar, wenn die Windows-Lautsprecherkonfiguration auf Stereo-Header gesetzt ist, alles wie erwartet funktioniert. – Alex
Ich googelte und ich fand, Sie sollten etwas wie 'av_log_set_level (AV_LOG_VERBOSE) versuchen;', um den Fehler zu verstehen. dann 'void my_log_callback (void * ptr, int ebene, const char * fmt, va_liste vargs) {printf (" \ n% s ", fmt);}' dann 'av_log_set_callback (mein_log_callback);' – SSpoke
Aber der Fehler '-22 'ist wirklich Fehler' 22', weil jede mögliche Zahl bedeutet, wie viel Bytes es so zurückgeben sollte. Fehler 22 ist '#define EINVAL 22/* ungültiges Argument * /' was bedeutet, dass das Argument ungültig ist. – SSpoke