Je continue à avoir un problème étrange ces derniers temps. Selon la configuration de ma configuration audio dans Windows (stéréo / quad / 5.1), un appel ffmpeg à avcodec_open2 () échoue avec l’erreur -22 ou ne fonctionne que. Ne pouvant pas trouver grand chose à propos de cette erreur, j’ai pensé que je devrais poser des questions à ce sujet ici. Le stream principal va comme ceci:
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
Le contexte de codec ‘c’ est configuré comme ceci dans un stream:
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;
La plupart d’entre eux sont copiés à partir de l’un des exemples de multiplexage trouvés dans la documentation. Tout fonctionne comme prévu si dans Windows j’ai réglé la sortie en stéréo.
Si je règle ma configuration d’enceintes sur 5.1 (6 canaux), avcodec_open2 échoue avec l’erreur -22.
Alors j’ai du mal à comprendre ce que je fais mal. Normalement, il ne devrait y avoir aucune relation entre la configuration de mon enceinte et le résultat de avcodec_open2.
Y a-t-il d’autres parameters que je dois définir?
Voici l’en-tête du fichier libavcodec\avcodec.h
tiré de Comment puis-je savoir ce que signifie le code d’erreur ffmpeg?
#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. */
puis en errno.h
tête errno.h
pour le fichier EINVAL
#define EINVAL 22 /* Invalid argument */
PS AVERROR
signifie (-(-22)) = 22
channel_layout.h
fichier d'en-tête de channel_layout.h
/** * @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)