Пример #1
0
 internal AudioEncoder(AVStream *stream, AudioFormat inFormat, BitRate bitRate) : base(stream)
 {
     try {
         InFormat = inFormat;
         Init(codecContext->CodecId, bitRate);
     } catch {
         Dispose();
         throw;
     }
 }
Пример #2
0
        public AudioEncoder(AVCodecID codecID, AudioFormat inFormat, BitRate bitRate) : base(codecID)
        {
            try {
                if (codec->Type != AVMediaType.Audio)
                {
                    throw new ArgumentException($"{codecID}不是音频格式", nameof(codecID));
                }

                codecContext = FF.avcodec_alloc_context3(codec);
                if (codecContext == null)
                {
                    throw new Exception("无法分配编码器上下文");
                }

                InFormat = inFormat;
                Init(codecID, bitRate);
            } catch {
                Dispose();
                throw;
            }
        }
Пример #3
0
        private void Init(AVCodecID codecID, BitRate bitRate)
        {
            outFormat = MatchSupportedFormat(codecID, InFormat);
            if (!InFormat.Equals(OutFormat))
            {
                resampler = new AudioResampler(InFormat, OutFormat);
                tempFrame = new AudioFrame();
            }

            codecContext->SampleFmt     = outFormat.SampleFormat;
            codecContext->SampleRate    = outFormat.SampleRate;
            codecContext->ChannelLayout = outFormat.ChannelLayout;
            codecContext->Channels      = outFormat.Channels;
            codecContext->BitRate       = bitRate.Value;
            var rates = codecContext->Flags;

            int result = FF.avcodec_open2(codecContext, codec, null);

            if (result < 0)
            {
                throw new FFmpegException(result);
            }
        }