private void NewStreams(Codec[] codecs) { try { foreach (var codec in codecs) { var stream = FF.avformat_new_stream(formatContext, codec.codec); if (stream == null) { throw new InvalidOperationException("无法创建流"); } FF.avcodec_copy_context(stream->Codec, codec.codecContext).CheckFFmpegCode(); stream->Codec->CodecTag = 0; if (outputFormat->Flags.HasFlag(AVFmt.GlobalHeader)) { stream->Codec->Flags |= AVCodecFlag.GlobalHeader; } stream->TimeBase = codec.codecContext->TimeBase; FF.avcodec_parameters_from_context(stream->Codecpar, stream->Codec).CheckFFmpegCode(); } FF.avformat_write_header(formatContext, null).CheckFFmpegCode(); } catch { Dispose(); throw; } }
public MediaWriter Initialize() { if (readyEncoders != null) { throw new InvalidOperationException($"该{nameof(MediaWriter)}对象已经初始化"); } if (outputFormat == null) { throw new InvalidOperationException("无法确定媒体的输出格式"); } int result = FF.avformat_write_header(formatContext, null); if (result < 0) { throw new FFmpegException(result, "写入头部错误"); } readyEncoders = new List <Encoder>(encoders); fixedQueues = new FixedAudioFrameQueue[encoders.Count]; for (int i = 0; i < encoders.Count; i++) { if (encoders[i] is AudioEncoder audioEncoder) { fixedQueues[i] = new FixedAudioFrameQueue(audioEncoder.RequestSamples); } } return(this); }