2014-10-05 3 views
5

बदलता हूं तो मुझे हाल ही में एक अजीब समस्या है। विंडोज़ (स्टीरियो/क्वाड/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 

कोडेक संदर्भ 'सी' एक धारा में इस तरह की स्थापना की है: इसमें से अधिकांश muxing उदाहरण के उनके एक पाया से नकल है

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; 

दस्तावेज में। सब कुछ अपेक्षित काम करता है अगर विंडोज़ में मैंने आउटपुट को स्टीरियो में सेट किया है।

यदि मैं अपनी स्पीकर कॉन्फ़िगरेशन 5.1 (6 चैनल) पर सेट करता हूं, तो avcodec_open2 त्रुटि -22 के साथ विफल रहता है।

तो मुझे समझ में मुश्किल है कि मैं क्या गलत कर रहा हूं। आम तौर पर यह मेरे स्पीकर कॉन्फ़िगरेशन और avcodec_open2 के परिणाम के बीच कोई संबंध नहीं होना चाहिए।

क्या कुछ अन्य पैरामीटर हैं जिन्हें मुझे सेट करने की आवश्यकता है?

+0

बस अतिरिक्त स्पष्ट होना, खिड़कियां वक्ता विन्यास स्टीरियो करने के लिए सेट है, तो सब कुछ उम्मीद के रूप में काम करता है। – Alex

+0

मैंने गुगल किया और मैंने पाया कि आपको कुछ avvlog_set_level (AV_LOG_VERBOSE) जैसे कुछ प्रयास करना चाहिए; त्रुटि को और अधिक विस्तृत समझने के लिए। फिर 'my_log_callback शून्य करें (शून्य * पीआरटी, int स्तर, कॉन्स char * fmt, va_list vargs) {printf (" \ n% s ", fmt);}' फिर 'av_log_set_callback (my_log_callback);' – SSpoke

+0

लेकिन त्रुटि '-22 'वास्तव में त्रुटि' 22' है क्योंकि किसी भी संभावित संख्या का मतलब है कि कितना बाइट इसे वापस करना चाहिए .. त्रुटि 22 '# परिभाषित करें EINVAL 22/* अमान्य तर्क */'जिसका अर्थ है कि तर्क अमान्य है। – SSpoke

उत्तर

5

यहाँ 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. */ 

से लिया फ़ाइल libavcodec\avcodec.h के लिए शीर्षक है तो EINVAL

#define EINVAL   22  /* Invalid argument */ 

पी एस के लिए errno.h हेडर फाइल AVERROR मतलब है (-(-22)) = 22

लेआउट चैनलों में शीर्ष लेख के लिए 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) 
+1

मैंने इसे उत्तर के रूप में वोट दिया। यह पता चला है कि मैंने एक आकस्मिक गलती की और 5 के लिए एक अलग बिटरेट सेट किया।1 स्पीकर विन्यास। (वास्तविक प्रणाली उपरोक्त उदाहरण कोड की तुलना में थोड़ा अधिक जटिल थी)। इसने मुझे इस मुद्दे को समझने में बहुत मदद की ताकि मैंने इसे जवाब के रूप में वोट दिया हो। धन्यवाद – Alex