internal AudioEncoder(AVStream *stream, AudioFormat inFormat, BitRate bitRate) : base(stream) { try { InFormat = inFormat; Init(codecContext->CodecId, bitRate); } catch { Dispose(); throw; } }
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; } }
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); } }