Exemple #1
0
 private void _addConversion(MediaConversion conversion, List <string> filters)
 {
     if (conversion != null)
     {
         if (!string.IsNullOrWhiteSpace(conversion.FFMpegFilter))
         {
             filters.Add(conversion.FFMpegFilter);
         }
     }
 }
Exemple #2
0
        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());
        }