2014-10-05 9 views
5

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

+0

Nur um zusätzliche klar, wenn die Windows-Lautsprecherkonfiguration auf Stereo-Header gesetzt ist, alles wie erwartet funktioniert. – Alex

+0

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

+0

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

Antwort

5

ist der Header für Datei libavcodec\avcodec.h genommen von How can I find out what this ffmpeg error code means?

#if EINVAL > 0 
#define AVERROR(e) (-(e)) /**< Returns a negative error code from a POSIX error code, to return from library functions. */ 
#define AVUNERROR(e) (-(e)) /**< Returns a POSIX error code from a library function error return value. */ 
#else 
/* Some platforms have E* and errno already negated. */ 
#define AVERROR(e) (e) 
#define AVUNERROR(e) (e) 
#endif 
#define AVERROR_UNKNOWN  AVERROR(EINVAL) /**< unknown error */ 
#define AVERROR_IO   AVERROR(EIO)  /**< I/O error */ 
#define AVERROR_NUMEXPECTED AVERROR(EDOM) /**< Number syntax expected in filename. */ 
#define AVERROR_INVALIDDATA AVERROR(EINVAL) /**< invalid data found */ 
#define AVERROR_NOMEM  AVERROR(ENOMEM) /**< not enough memory */ 
#define AVERROR_NOFMT  AVERROR(EILSEQ) /**< unknown format */ 
#define AVERROR_NOTSUPP  AVERROR(ENOSYS) /**< Operation not supported. */ 
#define AVERROR_NOENT  AVERROR(ENOENT) /**< No such file or directory. */ 
#define AVERROR_EOF   AVERROR(EPIPE) /**< End of file. */ 
#define AVERROR_PATCHWELCOME -MKTAG('P','A','W','E') /**< Not yet implemented in FFmpeg. Patches welcome. */ 

dann errno.h Headerdatei für die EINVAL

#define EINVAL   22  /* Invalid argument */ 

P. S. AVERROR bedeutet (-(-22)) = 22

LAYOUT für Kanäle channel_layout.h Header-Datei

/** 
* @file 
* audio conversion routines 
*/ 

/* Audio channel masks */ 
#define AV_CH_FRONT_LEFT    0x00000001 
#define AV_CH_FRONT_RIGHT   0x00000002 
#define AV_CH_FRONT_CENTER   0x00000004 
#define AV_CH_LOW_FREQUENCY   0x00000008 
#define AV_CH_BACK_LEFT    0x00000010 
#define AV_CH_BACK_RIGHT    0x00000020 
#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040 
#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080 
#define AV_CH_BACK_CENTER   0x00000100 
#define AV_CH_SIDE_LEFT    0x00000200 
#define AV_CH_SIDE_RIGHT    0x00000400 
#define AV_CH_TOP_CENTER    0x00000800 
#define AV_CH_TOP_FRONT_LEFT   0x00001000 
#define AV_CH_TOP_FRONT_CENTER  0x00002000 
#define AV_CH_TOP_FRONT_RIGHT  0x00004000 
#define AV_CH_TOP_BACK_LEFT   0x00008000 
#define AV_CH_TOP_BACK_CENTER  0x00010000 
#define AV_CH_TOP_BACK_RIGHT   0x00020000 
#define AV_CH_STEREO_LEFT   0x20000000 ///< Stereo downmix. 
#define AV_CH_STEREO_RIGHT   0x40000000 ///< See AV_CH_STEREO_LEFT. 

/** Channel mask value used for AVCodecContext.request_channel_layout 
    to indicate that the user requests the channel order of the decoder output 
    to be the native codec channel order. */ 
#define AV_CH_LAYOUT_NATIVE   0x8000000000000000LL 

/* Audio channel convenience macros */ 
#define AV_CH_LAYOUT_MONO    (AV_CH_FRONT_CENTER) 
#define AV_CH_LAYOUT_STEREO   (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) 
#define AV_CH_LAYOUT_2_1    (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) 
#define AV_CH_LAYOUT_SURROUND   (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) 
#define AV_CH_LAYOUT_4POINT0   (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) 
#define AV_CH_LAYOUT_2_2    (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) 
#define AV_CH_LAYOUT_QUAD    (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) 
#define AV_CH_LAYOUT_5POINT0   (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) 
#define AV_CH_LAYOUT_5POINT1   (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) 
#define AV_CH_LAYOUT_5POINT0_BACK  (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) 
#define AV_CH_LAYOUT_5POINT1_BACK  (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) 
#define AV_CH_LAYOUT_7POINT0   (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) 
#define AV_CH_LAYOUT_7POINT1   (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) 
#define AV_CH_LAYOUT_7POINT1_WIDE  (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) 
#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) 
+1

Ich wählte dies als die Antwort. Es stellt sich heraus, dass ich einen zufälligen Fehler gemacht habe und eine andere Bitrate für 5 gesetzt habe.1 Lautsprecherkonfiguration. (Das tatsächliche System war etwas komplizierter als der obige Beispielcode). Das half mir sehr dabei, das Problem zu verstehen, also habe ich es als Antwort gewählt. Vielen Dank – Alex

Verwandte Themen