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