示例#1
0
        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;
            }
        }
示例#2
0
        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);
        }