示例#1
0
        private void Media_MediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            if (VIDTextBox.Text.StartsWith("udp://"))
            {
                e.Options.VideoFilter = "yadif";
            }

            var videoStream = e.Options.VideoStream;

            if (videoStream != null)
            {
                // Check if the video requires deinterlacing
                var requiresDeinterlace = videoStream.FieldOrder != AVFieldOrder.AV_FIELD_PROGRESSIVE &&
                                          videoStream.FieldOrder != AVFieldOrder.AV_FIELD_UNKNOWN;

                // Hardwrae device priorities
                var deviceCandidates = new AVHWDeviceType[]
                {
                    AVHWDeviceType.AV_HWDEVICE_TYPE_DXVA2,
                    AVHWDeviceType.AV_HWDEVICE_TYPE_CUDA,
                    AVHWDeviceType.AV_HWDEVICE_TYPE_D3D11VA
                };

                // Hardware device selection
                if (videoStream.FPS <= 30)
                {
                    foreach (var deviceType in deviceCandidates)
                    {
                        var accelerator = videoStream.HardwareDevices.FirstOrDefault(d => d.DeviceType == deviceType);
                        if (accelerator != null)
                        {
                            if (Platform.GuiContext.Current.IsInDebugMode)
                            {
                                e.Options.VideoHardwareDevice = accelerator;
                            }

                            break;
                        }
                    }
                }

                var videoFilter = new StringBuilder();

                // The yadif filter deinterlaces the video; we check the field order if we need
                // to deinterlace the video automatically
                if (requiresDeinterlace)
                {
                    videoFilter.Append("yadif,");
                }

                // Scale down to maximum 1080p screen resolution.
                if (videoStream.PixelHeight > 1080)
                {
                    // e.Options.VideoHardwareDevice = null;
                    videoFilter.Append($"scale=-1:1080,");
                }

                e.Options.VideoFilter = videoFilter.ToString().TrimEnd(',');
            }
        }
示例#2
0
        /// <summary>
        /// Handles the MediaOpening event of the Media control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MediaOpeningRoutedEventArgs"/> instance containing the event data.</param>
        private void Media_MediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            // An example of switching to a different stream
            var subtitleStreams       = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_SUBTITLE).Select(kvp => kvp.Value);
            var englishSubtitleStream = subtitleStreams.FirstOrDefault(s => s.Language.StartsWith("en"));

            if (englishSubtitleStream != null)
            {
                e.Options.SubtitleStream = englishSubtitleStream;
            }

            // The yadif filter deinterlaces the video; we check the field order if we need
            // to deinterlace the video automatically
            if (e.Options.VideoStream != null &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_PROGRESSIVE &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_UNKNOWN)
            {
                e.Options.VideoFilter = "yadif";

                // When enabling HW acceleration, the filtering does not seem to get applied for some reason.
                e.Options.EnableHardwareAcceleration = false;
            }

            // Experimetal HW acceleration support. Remove if not needed.
            e.Options.EnableHardwareAcceleration = false;

#if APPLY_AUDIO_FILTER
            // e.Options.AudioFilter = "aecho=0.8:0.9:1000:0.3";
            e.Options.AudioFilter = "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3";
#endif
        }
        /// <summary>
        /// Handles the MediaOpening event of the Media control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MediaOpeningRoutedEventArgs"/> instance containing the event data.</param>
        private void Media_MediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            // In realtime streams probesize can be reduced to reduce latency
            // e.Options.ProbeSize = 32; // 32 is the minimum

            // In realtime strams analyze duration can be reduced to reduce latency
            // e.Options.MaxAnalyzeDuration = TimeSpan.Zero;

            // The yadif filter deinterlaces the video; we check the field order if we need
            // to deinterlace the video automatically
            if (e.Options.VideoStream != null &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_PROGRESSIVE &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_UNKNOWN)
            {
                e.Options.VideoFilter = "yadif";

                // When enabling HW acceleration, the filtering does not seem to get applied for some reason.
                // e.Options.EnableHardwareAcceleration = false;
            }

            // Experimetal HW acceleration support. Remove if not needed.
            //e.Options.EnableHardwareAcceleration = Debugger.IsAttached;

#if APPLY_AUDIO_FILTER
            // e.Options.AudioFilter = "aecho=0.8:0.9:1000:0.3";
            e.Options.AudioFilter = "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3";
#endif
        }
        /// <summary>
        /// Handles the MediaOpening event of the Media control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MediaOpeningRoutedEventArgs"/> instance containing the event data.</param>
        private void Media_MediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            // An example of switching to a different stream
            if (e.Info.InputUrl.EndsWith("matroska.mkv2"))
            {
                var subtitleStreams       = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_SUBTITLE).Select(kvp => kvp.Value);
                var englishSubtitleStream = subtitleStreams.FirstOrDefault(s => s.Language.StartsWith("en"));
                if (englishSubtitleStream != null)
                {
                    e.Options.SubtitleStream = englishSubtitleStream;
                }

                var audioStreams = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_AUDIO)
                                   .Select(kvp => kvp.Value).ToArray();

                var commentaryStream = audioStreams.FirstOrDefault(s => s.StreamIndex != e.Options.AudioStream.StreamIndex);
                e.Options.AudioStream = commentaryStream;
            }


            // The yadif filter deinterlaces the video; we check the field order if we need
            // to deinterlace the video automatically
            if (e.Options.VideoStream != null &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_PROGRESSIVE &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_UNKNOWN)
            {
                e.Options.VideoFilter = "yadif";
            }
        }
        /// <summary>
        /// Handles the MediaChanging event of the MediaControl.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="MediaOpeningRoutedEventArgs"/> instance containing the event data.</param>
        private void OnMediaChanging(object sender, MediaOpeningRoutedEventArgs e)
        {
            var availableStreams = e.Info.Streams
                                   .Where(s => s.Value.CodecType == (AVMediaType)StreamCycleMediaType)
                                   .Select(x => x.Value)
                                   .ToList();

            if (availableStreams.Count <= 0)
            {
                return;
            }

            // Allow cyclling though a null stream (means removing the stream)
            // Except for video streams.
            if (StreamCycleMediaType != MediaType.Video)
            {
                availableStreams.Add(null);
            }

            var currentIndex = -1;

            switch (StreamCycleMediaType)
            {
            case MediaType.Audio:
                currentIndex = availableStreams.IndexOf(e.Options.AudioStream);
                break;

            case MediaType.Video:
                currentIndex = availableStreams.IndexOf(e.Options.VideoStream);
                break;

            case MediaType.Subtitle:
                currentIndex = availableStreams.IndexOf(e.Options.SubtitleStream);
                break;
            }

            currentIndex += 1;
            if (currentIndex >= availableStreams.Count)
            {
                currentIndex = 0;
            }

            var newStream = availableStreams[currentIndex];

            switch (StreamCycleMediaType)
            {
            case MediaType.Audio:
                e.Options.AudioStream = newStream;
                break;

            case MediaType.Video:
                e.Options.VideoStream = newStream;
                break;

            case MediaType.Subtitle:
                e.Options.SubtitleStream = newStream;
                break;
            }
        }
        /// <summary>
        /// Handles the MediaOpening event of the Media control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MediaOpeningRoutedEventArgs"/> instance containing the event data.</param>
        private void Media_MediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            // An example of injecting format options for http/https streams
            if (e.Info.InputUrl.StartsWith("http://") || e.Info.InputUrl.StartsWith("https://"))
            {
                e.Options.InputOptions["usetoc"]              = "1";
                e.Options.InputOptions["user_agent"]          = $"{typeof(MediaOptions).Namespace}/{typeof(MediaOptions).Assembly.GetName().Version}";
                e.Options.InputOptions["headers"]             = $"Referer:https://www.unosquare.com";
                e.Options.InputOptions["multiple_requests"]   = "1";
                e.Options.InputOptions["reconnect"]           = "1";
                e.Options.InputOptions["reconnect_at_eof"]    = "1";
                e.Options.InputOptions["reconnect_streamed"]  = "1";
                e.Options.InputOptions["reconnect_delay_max"] = "10"; // in seconds
            }

            // An example of switching to a different stream
            if (e.Info.InputUrl.EndsWith("matroska.mkv"))
            {
                var subtitleStreams       = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_SUBTITLE).Select(kvp => kvp.Value);
                var englishSubtitleStream = subtitleStreams.FirstOrDefault(s => s.Language.StartsWith("en"));
                if (englishSubtitleStream != null)
                {
                    e.Options.SubtitleStream = englishSubtitleStream;
                }

                var audioStreams = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_AUDIO)
                                   .Select(kvp => kvp.Value).ToArray();

                // var commentaryStream = audioStreams.FirstOrDefault(s => s.StreamIndex != e.Options.AudioStream.StreamIndex);
                // e.Options.AudioStream = commentaryStream;
            }

            // In realtime streams probesize can be reduced to reduce latency
            // e.Options.ProbeSize = 32; // 32 is the minimum

            // In realtime strams analyze duration can be reduced to reduce latency
            // e.Options.MaxAnalyzeDuration = TimeSpan.Zero;

            // The yadif filter deinterlaces the video; we check the field order if we need
            // to deinterlace the video automatically
            if (e.Options.VideoStream != null &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_PROGRESSIVE &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_UNKNOWN)
            {
                e.Options.VideoFilter = "yadif";

                // When enabling HW acceleration, the filtering does not seem to get applied for some reason.
                e.Options.EnableHardwareAcceleration = false;
            }

            // Experimetal HW acceleration support. Remove if not needed.
            e.Options.EnableHardwareAcceleration = false;

#if APPLY_AUDIO_FILTER
            // e.Options.AudioFilter = "aecho=0.8:0.9:1000:0.3";
            e.Options.AudioFilter = "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3";
#endif
        }
示例#7
0
 /// <summary>
 /// Handles the MediaOpening event of the Media control.
 /// </summary>
 /// <param name="sender">The source of the event.</param>
 /// <param name="e">The <see cref="MediaOpeningRoutedEventArgs"/> instance containing the event data.</param>
 private void Media_MediaOpening(object sender, MediaOpeningRoutedEventArgs e)
 {
     // The yadif filter deinterlaces the video
     if (UrlTextBox.Text.StartsWith("udp://"))
     {
         e.Options.VideoFilter = "yadif";
         //e.Options.ProbeSize = 32;
     }
 }
示例#8
0
        private void Media_MediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            e.Options.LogMessageCallback = new Action <MediaLogMessageType, string>((t, m) =>
            {
                if (t == MediaLogMessageType.Trace)
                {
                    return;
                }

                Debug.WriteLine($"{t} - {m}");
                //Terminal.Log(m, nameof(MediaElement), (LogMessageType)t);
            });
        }
示例#9
0
        /// <summary>
        /// Handles the MediaOpening event of the Media control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MediaOpeningRoutedEventArgs"/> instance containing the event data.</param>
        private void Media_MediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            // Example of automatically side-loading SRT subs
            try
            {
                var inputUrl = e.Info.InputUrl;
                var url      = new Uri(inputUrl);
                if (url.IsFile || url.IsUnc)
                {
                    inputUrl = System.IO.Path.ChangeExtension(url.LocalPath, "srt");
                    if (System.IO.File.Exists(inputUrl))
                    {
                        e.Options.SubtitlesUrl = inputUrl;
                    }
                }
            }
            catch { }

            // An example of switching to a different stream
            var subtitleStreams       = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_SUBTITLE).Select(kvp => kvp.Value);
            var englishSubtitleStream = subtitleStreams.FirstOrDefault(s => s.Language.StartsWith("en"));

            if (englishSubtitleStream != null)
            {
                e.Options.SubtitleStream = englishSubtitleStream;
            }

            // The yadif filter deinterlaces the video; we check the field order if we need
            // to deinterlace the video automatically
            if (e.Options.VideoStream != null &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_PROGRESSIVE &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_UNKNOWN)
            {
                e.Options.VideoFilter = "yadif";

                // When enabling HW acceleration, the filtering does not seem to get applied for some reason.
                e.Options.EnableHardwareAcceleration = false;
            }

            // Experimetal HW acceleration support. Remove if not needed.
            e.Options.EnableHardwareAcceleration = false;

            PlaylistManager.AddOrUpdateEntry(Media.Source?.ToString() ?? e.Info.InputUrl, e.Info);
            PlaylistManager.SaveEntries();

#if APPLY_AUDIO_FILTER
            // e.Options.AudioFilter = "aecho=0.8:0.9:1000:0.3";
            e.Options.AudioFilter = "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3";
#endif
        }
示例#10
0
        /// <summary>
        /// Handles the MediaOpening event of the Media control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MediaOpeningRoutedEventArgs"/> instance containing the event data.</param>
        private void OnMediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            // Example of automatically side-loading SRT subs
            try
            {
                var inputUrl = e.Info.InputUrl;
                var url      = new Uri(inputUrl);
                if (url.IsFile || url.IsUnc)
                {
                    inputUrl = System.IO.Path.ChangeExtension(url.LocalPath, "srt");
                    if (System.IO.File.Exists(inputUrl))
                    {
                        e.Options.SubtitlesUrl = inputUrl;
                    }
                }
            }
            catch { }

            // You can force video FPS if necessary
            // see: https://github.com/unosquare/ffmediaelement/issues/212
            // e.Options.VideoForcedFps = new AVRational { num = 25, den = 1 };

            // An example of switching to a different stream
            var subtitleStreams       = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_SUBTITLE).Select(kvp => kvp.Value);
            var englishSubtitleStream = subtitleStreams.FirstOrDefault(s => s.Language.StartsWith("en"));

            if (englishSubtitleStream != null)
            {
                e.Options.SubtitleStream = englishSubtitleStream;
            }

            // The yadif filter deinterlaces the video; we check the field order if we need
            // to deinterlace the video automatically
            if (e.Options.VideoStream != null &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_PROGRESSIVE &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_UNKNOWN)
            {
                e.Options.VideoFilter = "yadif";

                // When enabling HW acceleration, the filtering does not seem to get applied for some reason.
                e.Options.EnableHardwareAcceleration = false;
            }

            // Experimetal HW acceleration support. Remove if not needed.
            e.Options.EnableHardwareAcceleration = false;

            // e.Options.AudioFilter = "aecho=0.8:0.9:1000:0.3";
            // e.Options.AudioFilter = "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3";
        }
示例#11
0
        private void Media_MediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            // The yadif filter deinterlaces the video
            e.Options.VideoFilter = "yadif";

            //e.Options.IsAudioDisabled = true;
            e.Options.LogMessageCallback = new Action <MediaLogMessageType, string>((t, m) =>
            {
                if (t == MediaLogMessageType.Trace)
                {
                    return;
                }

                Debug.WriteLine($"{t} - {m}");
                //Terminal.Log(m, nameof(MediaElement), (LogMessageType)t);
            });
        }
示例#12
0
        /// <summary>
        /// Handles the MediaOpening event of the Media control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MediaOpeningRoutedEventArgs"/> instance containing the event data.</param>
        private void Media_MediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            // An example of switching to a different stream
            if (e.Info.InputUrl.EndsWith("matroska.mkv"))
            {
                var subtitleStreams       = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_SUBTITLE).Select(kvp => kvp.Value);
                var englishSubtitleStream = subtitleStreams.FirstOrDefault(s => s.Language.StartsWith("en"));
                if (englishSubtitleStream != null)
                {
                    e.Options.SubtitleStream = englishSubtitleStream;
                }

                var audioStreams = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_AUDIO)
                                   .Select(kvp => kvp.Value).ToArray();

                // var commentaryStream = audioStreams.FirstOrDefault(s => s.StreamIndex != e.Options.AudioStream.StreamIndex);
                // e.Options.AudioStream = commentaryStream;
            }

            // In realtime streams probesize can be reduced to reduce latency
            // e.Options.ProbeSize = 32; // 32 is the minimum

            // In realtime strams analyze duration can be reduced to reduce latency
            // e.Options.MaxAnalyzeDuration = TimeSpan.Zero;

            // The yadif filter deinterlaces the video; we check the field order if we need
            // to deinterlace the video automatically
            if (e.Options.VideoStream != null &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_PROGRESSIVE &&
                e.Options.VideoStream.FieldOrder != AVFieldOrder.AV_FIELD_UNKNOWN)
            {
                e.Options.VideoFilter = "yadif";

                // When enabling HW acceleration, the filtering does not seem to get applied for some reason.
                // e.Options.EnableHardwareAcceleration = false;
            }

            // Experimetal HW acceleration support. Remove if not needed.
            /* e.Options.EnableHardwareAcceleration = Debugger.IsAttached; */

#if APPLY_AUDIO_FILTER
            // e.Options.AudioFilter = "aecho=0.8:0.9:1000:0.3";
            e.Options.AudioFilter = "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3";
#endif
        }
        /// <summary>
        /// Handles the MediaOpening event of the Media control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MediaOpeningRoutedEventArgs"/> instance containing the event data.</param>
        private void OnMediaOpening(object sender, MediaOpeningRoutedEventArgs e)
        {
            // You can start off by adjusting subtitles delay
            // e.Options.SubtitlesDelay = TimeSpan.FromSeconds(7); // See issue #216

            // Example of automatically side-loading SRT subs
            try
            {
                var inputUrl = e.Info.InputUrl;
                var url      = new Uri(inputUrl);
                if (url.IsFile || url.IsUnc)
                {
                    inputUrl = System.IO.Path.ChangeExtension(url.LocalPath, "srt");
                    if (System.IO.File.Exists(inputUrl))
                    {
                        e.Options.SubtitlesUrl = inputUrl;
                    }
                }
            }
            catch { }

            // You can force video FPS if necessary
            // see: https://github.com/unosquare/ffmediaelement/issues/212
            // e.Options.VideoForcedFps = 25;

            // An example of specifcally selecting a subtitle stream
            var subtitleStreams       = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_SUBTITLE).Select(kvp => kvp.Value);
            var englishSubtitleStream = subtitleStreams.FirstOrDefault(s => s.Language != null && s.Language.ToLowerInvariant().StartsWith("en"));

            if (englishSubtitleStream != null)
            {
                e.Options.SubtitleStream = englishSubtitleStream;
            }

            // An example of specifcally selecting an audio stream
            var audioStreams       = e.Info.Streams.Where(kvp => kvp.Value.CodecType == AVMediaType.AVMEDIA_TYPE_AUDIO).Select(kvp => kvp.Value);
            var englishAudioStream = audioStreams.FirstOrDefault(s => s.Language != null && s.Language.ToLowerInvariant().StartsWith("en"));

            if (englishAudioStream != null)
            {
                e.Options.AudioStream = englishAudioStream;
            }

            // Setting Advanced Video Stream Options is also possible
            var videoStream = e.Options.VideoStream;

            if (videoStream != null)
            {
                // Check if the video requires deinterlacing
                var requiresDeinterlace = videoStream.FieldOrder != AVFieldOrder.AV_FIELD_PROGRESSIVE &&
                                          videoStream.FieldOrder != AVFieldOrder.AV_FIELD_UNKNOWN;

                // Hardwrae device priorities
                var deviceCandidates = new AVHWDeviceType[]
                {
                    AVHWDeviceType.AV_HWDEVICE_TYPE_CUDA,
                    AVHWDeviceType.AV_HWDEVICE_TYPE_D3D11VA,
                    AVHWDeviceType.AV_HWDEVICE_TYPE_DXVA2
                };

                // Hardware device selection
                if (videoStream.FPS <= 30)
                {
                    foreach (var deviceType in deviceCandidates)
                    {
                        var accelerator = videoStream.HardwareDevices.FirstOrDefault(d => d.DeviceType == deviceType);
                        if (accelerator != null)
                        {
                            if (GuiContext.Current.IsInDebugMode)
                            {
                                e.Options.VideoHardwareDevice = accelerator;
                            }

                            break;
                        }
                    }
                }

                // Start building a video filter
                var videoFilter = new StringBuilder();

                // The yadif filter deinterlaces the video; we check the field order if we need
                // to deinterlace the video automatically
                if (requiresDeinterlace)
                {
                    videoFilter.Append("yadif,");
                }

                // Scale down to maximum 1080p screen resolution.
                if (videoStream.PixelHeight > 1080)
                {
                    // e.Options.VideoHardwareDevice = null;
                    videoFilter.Append($"scale=-1:1080,");
                }

                e.Options.VideoFilter = videoFilter.ToString().TrimEnd(',');

                Media.ClosedCaptionsChannel = videoStream.HasClosedCaptions ?
                                              CaptionsChannel.CC1 : CaptionsChannel.CCP;
            }

            // e.Options.AudioFilter = "aecho=0.8:0.9:1000:0.3";
            // e.Options.AudioFilter = "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3";
        }