private void _addConversion(MediaConversion conversion, List <string> filters) { if (conversion != null) { if (!string.IsNullOrWhiteSpace(conversion.FFMpegFilter)) { filters.Add(conversion.FFMpegFilter); } } }
private string _encodeParameters(Media inputMedia, StreamInfo[] inputStreams) { List <string> video_filters = new List <string>(); StringBuilder ep = new StringBuilder(); var sourceDir = SourceMedia.Directory as IngestDirectory; #region Video ep.AppendFormat(" -c:v {0}", sourceDir.VideoCodec); if (sourceDir.VideoCodec == TVideoCodec.copy) { if (AspectConversion == TAspectConversion.Force16_9) { ep.Append(" -aspect 16/9"); } else if (AspectConversion == TAspectConversion.Force4_3) { ep.Append(" -aspect 4/3"); } } else { ep.AppendFormat(" -b:v {0}k", (int)(inputMedia.FormatDescription().ImageSize.Height * 13 * (double)sourceDir.VideoBitrateRatio)); VideoFormatDescription outputFormatDescription = DestMedia.FormatDescription(); VideoFormatDescription inputFormatDescription = inputMedia.FormatDescription(); _addConversion(MediaConversion.SourceFieldOrderEnforceConversions[SourceFieldOrderEnforceConversion], video_filters); if (inputMedia.HasExtraLines) { video_filters.Add("crop=720:576:0:32"); if (AspectConversion == TAspectConversion.NoConversion) { if (inputFormatDescription.IsWideScreen) { video_filters.Add("setdar=dar=16/9"); } else { video_filters.Add("setdar=dar=4/3"); } } } if (AspectConversion == TAspectConversion.NoConversion) { if (inputFormatDescription.IsWideScreen) { video_filters.Add("setdar=dar=16/9"); } else { video_filters.Add("setdar=dar=4/3"); } } if (AspectConversion != TAspectConversion.NoConversion) { _addConversion(MediaConversion.AspectConversions[AspectConversion], video_filters); } if (inputFormatDescription.FrameRate / outputFormatDescription.FrameRate == 2 && outputFormatDescription.Interlaced) { video_filters.Add("tinterlace=interleave_top"); } video_filters.Add($"fps=fps={outputFormatDescription.FrameRate}"); if (outputFormatDescription.Interlaced) { video_filters.Add("fieldorder=tff"); ep.Append(" -flags +ildct+ilme"); } else { video_filters.Add("w3fdif"); } var additionalEncodeParams = ((IngestDirectory)SourceMedia.Directory).EncodeParams; if (!string.IsNullOrWhiteSpace(additionalEncodeParams)) { ep.Append(" ").Append(additionalEncodeParams.Trim()); } } int lastFilterIndex = video_filters.Count() - 1; if (lastFilterIndex >= 0) { video_filters[lastFilterIndex] = $"{video_filters[lastFilterIndex]}[v]"; ep.Append(" -map \"[v]\""); } else { var videoStream = inputStreams.FirstOrDefault(s => s.StreamType == StreamType.VIDEO); if (videoStream != null) { ep.AppendFormat(" -map 0:{0}", videoStream.Index); } } #endregion // Video #region Audio List <string> audio_filters = new List <string>(); StreamInfo[] audioStreams = inputStreams.Where(s => s.StreamType == StreamType.AUDIO).ToArray(); if (audioStreams.Length > 0) { ep.AppendFormat(" -c:a {0}", sourceDir.AudioCodec); if (sourceDir.AudioCodec != TAudioCodec.copy) { ep.AppendFormat(" -b:a {0}k", (int)(2 * 128 * sourceDir.AudioBitrateRatio)); MediaConversion audiChannelMappingConversion = MediaConversion.AudioChannelMapingConversions[AudioChannelMappingConversion]; int inputTotalChannels = audioStreams.Sum(s => s.ChannelCount); int requiredOutputChannels; switch ((TAudioChannelMappingConversion)audiChannelMappingConversion.OutputFormat) { case TAudioChannelMappingConversion.FirstTwoChannels: case TAudioChannelMappingConversion.SecondChannelOnly: case TAudioChannelMappingConversion.Combine1plus2: requiredOutputChannels = 2; break; case TAudioChannelMappingConversion.SecondTwoChannels: case TAudioChannelMappingConversion.Combine3plus4: requiredOutputChannels = 4; break; case TAudioChannelMappingConversion.FirstChannelOnly: requiredOutputChannels = 1; break; default: requiredOutputChannels = 0; break; } if (audioStreams.Length > 1 && requiredOutputChannels > audioStreams[0].ChannelCount) { int audio_stream_count = 0; StringBuilder pf = new StringBuilder(); foreach (StreamInfo stream in audioStreams) { pf.AppendFormat("[0:{0}]", stream.Index); audio_stream_count += stream.ChannelCount; } audio_filters.Add(string.Format("{0}amerge=inputs={1}", pf.ToString(), audioStreams.Length)); } _addConversion(audiChannelMappingConversion, audio_filters); if (AudioVolume != 0) { _addConversion(new MediaConversion(AudioVolume), audio_filters); } ep.Append(" -ar 48000"); } } lastFilterIndex = audio_filters.Count() - 1; if (lastFilterIndex >= 0) { audio_filters[lastFilterIndex] = $"{audio_filters[lastFilterIndex]}[a]"; ep.Append(" -map \"[a]\""); } else { var audioStream = inputStreams.FirstOrDefault(s => s.StreamType == StreamType.AUDIO); if (audioStream != null) { ep.AppendFormat(" -map 0:{0}", audioStream.Index); } } #endregion // audio var filters = video_filters.Concat(audio_filters); if (filters.Any()) { ep.AppendFormat(" -filter_complex \"{0}\"", string.Join(",", filters)); } return(ep.ToString()); }