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); }
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); }
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); }
/// <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; }
//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; }