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(','); } }
/// <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 }
/// <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; } }
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); }); }
/// <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 }
/// <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"; }
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); }); }
/// <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"; }