Ejemplo n.º 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;
            }
        }
Ejemplo n.º 2
0
        ///// <summary>
        ///// 创建一个封装模式的媒体写入器
        ///// </summary>
        ///// <param name="file"></param>
        ///// <param name="mediaReader"></param>
        //public MediaWriter(string file, MediaReader mediaReader)
        //	: base(File.Open(file, FileMode.Create, FileAccess.Write), true, FF.av_guess_format(null, file, null)) {
        //	outputFormat = formatContext->Oformat;
        //	remuxing = true;

        //	SetEncoders(mediaReader);
        //}

        ///// <summary>
        ///// 创建一个封装模式的媒体写入器
        ///// </summary>
        ///// <param name="outputStream"></param>
        ///// <param name="mediaName"></param>
        ///// <param name="mediaReader"></param>
        //public MediaWriter(Stream outputStream, string mediaName, MediaReader mediaReader)
        //	: base(outputStream, true, FF.av_guess_format(mediaName, null, null)) {
        //	outputFormat = formatContext->Oformat;
        //	remuxing = true;

        //	SetEncoders(mediaReader);
        //}

        //private void SetEncoders(MediaReader mediaReader) {
        //	try {
        //		foreach (var decoder in mediaReader.Decoders) {
        //			if (decoder != null) {
        //				var stream = FF.avformat_new_stream(formatContext, decoder.codec);
        //				if (stream == null) throw new InvalidOperationException("无法创建流");
        //				int result = FF.avcodec_copy_context(stream->Codec, decoder.codecContext);
        //				if (result < 0) throw new FFmpegException(result);
        //				stream->Codec->CodecTag = 0;
        //				if (outputFormat->Flags.HasFlag(AVFmt.GlobalHeader)) {
        //					stream->Codec->Flags |= AVCodecFlag.GlobalHeader;
        //				}
        //				stream->TimeBase = mediaReader.formatContext->Streams[decoder.StreamIndex]->TimeBase;
        //				//stream->TimeBase = decoder.codecContext->TimeBase;
        //				result = FF.avcodec_parameters_from_context(stream->Codecpar, stream->Codec);
        //				if (result < 0) throw new FFmpegException(result);
        //			}
        //		}
        //		inputFmtCtx = mediaReader.formatContext;
        //	} catch {
        //		Dispose();
        //		throw;
        //	}
        //}

        public MediaWriter AddAudio(AudioFormat format, BitRate bitRate)
        {
            if (readyEncoders != null)
            {
                throw new InvalidOperationException($"该{nameof(MediaWriter)}对象已经初始化");
            }
            if (outputFormat == null)
            {
                throw new InvalidOperationException("无法确定媒体的输出格式");
            }

            if (outputFormat->AudioCodec == AVCodecID.None)
            {
                throw new InvalidOperationException($"该{nameof(MediaWriter)}对象并不支持音频");
            }

            var stream = FF.avformat_new_stream(formatContext, Codec.GetEncoder(outputFormat->AudioCodec));

            if (stream == null)
            {
                throw new InvalidOperationException("无法创建流");
            }
            var codecContext = stream->Codec;
            var audioEncoder = new AudioEncoder(stream, format, bitRate);

            stream->TimeBase = codecContext->TimeBase;
            int result = FF.avcodec_parameters_from_context(stream->Codecpar, codecContext);

            if (result < 0)
            {
                throw new FFmpegException(result);
            }
            encoders.Add(audioEncoder);
            return(this);
        }
Ejemplo n.º 3
0
        public MediaWriter AddEncoder(Encoder encoder)
        {
            if (readyEncoders != null)
            {
                throw new InvalidOperationException($"该{nameof(MediaWriter)}对象已经初始化");
            }

            if (outputFormat == null)
            {
                var desc = FF.avcodec_descriptor_get(encoder.ID);
                if (desc == null)
                {
                    throw new InvalidOperationException("无法获得编码器的短名称描述");
                }
                outputFormat = FF.av_guess_format(desc->Name, null, null);
                if (outputFormat == null)
                {
                    throw new InvalidOperationException("无法确定媒体的输出格式");
                }
                formatContext->Oformat = outputFormat;
            }

            var stream = FF.avformat_new_stream(formatContext, encoder.codec);

            if (stream == null)
            {
                throw new InvalidOperationException("无法创建流");
            }
            // stream->TimeBase = encoder.codecContext->TimeBase;
            int result = FF.avcodec_parameters_from_context(stream->Codecpar, encoder.codecContext);

            if (result < 0)
            {
                throw new FFmpegException(result);
            }
            encoder.stream = stream;
            encoders.Add(encoder);
            return(this);
        }