示例#1
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);
        }
示例#2
0
 public MediaRemuxer(Stream outputStream, string mediaName = null, params Codec[] codecs)
     : base(outputStream, true, FF.av_guess_format(mediaName, null, null))
 {
     outputFormat = formatContext->Oformat;
     NewStreams(codecs);
 }
示例#3
0
 public MediaRemuxer(string file, params Codec[] codecs)
     : base(File.Open(file, FileMode.Create, FileAccess.Write), true, FF.av_guess_format(null, file, null))
 {
     outputFormat = formatContext->Oformat;
     NewStreams(codecs);
 }
示例#4
0
 /// <summary>
 /// 创建一个编码模式的媒体写入器
 /// </summary>
 /// <param name="outputStream">输出的流</param>
 /// <param name="mediaName">根据"mp3","flac","h264"等多媒体的短名称自动推断编码器</param>
 public MediaWriter(Stream outputStream, string mediaName = null)
     : base(outputStream, true, FF.av_guess_format(mediaName, null, null))
 {
     outputFormat = formatContext->Oformat;
 }
示例#5
0
        //public AVCodecID AudioCodecID => remuxing ? inputFmtCtx->AudioCodecId : outputFormat->AudioCodec;
        //public AVCodecID VideoCodecID => remuxing ? inputFmtCtx->VideoCodecId : outputFormat->VideoCodec;

        /// <summary>
        /// 创建一个编码模式的媒体写入器
        /// </summary>
        /// <param name="file">输出的文件路径</param>
        /// <param name="ignoreExtension">如果为true,则不会根据文件扩展名自动推断编码器</param>
        public MediaWriter(string file, bool ignoreExtension = false)
            : base(File.Open(file, FileMode.Create, FileAccess.Write), true, FF.av_guess_format(null, ignoreExtension ? null : file, null))
        {
            outputFormat = formatContext->Oformat;
        }