Ffmpeg avcodec_open2 returns -22 if I change the speaker configuration

I have had a strange question lately. Depending on how I configured my sound configuration in windows (stereo / quad / 5.1), the ffmpeg call for avcodec_open2 () failed with a -22 error or just works. Unable to find much about this error, I thought I should ask about it here. The main thread is as follows:

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 

The codec context 'c' is set this way in the 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; 

Most of it is copied from one of the multiplexer examples found in the documentation. Everything works as expected if on Windows I set the output to stereo.

If I configure the speaker configuration to 5.1 (6 channels), avcodec_open2 will fail with a -22 error.

So it's hard for me to understand what I'm doing wrong. Usually this should not be any connection between my speaker configuration and the result of avcodec_open2.

Are there any other parameters that I need to set?

+5
source share
1 answer

Here is the header for the libavcodec\avcodec.h , taken from How do I know 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. */ 

then errno.h header file for EINVAL

 #define EINVAL 22 /* Invalid argument */ 

PS AVERROR means (-(-22)) = 22

LAYOUT for channel header channel_layout.h header file

 /** * @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) 
+5
source

Source: https://habr.com/ru/post/1204055/


All Articles