From 9212ffb52874142ea1859b5b3407f63afb24edf1 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 2 May 2017 08:53:21 -0400 Subject: [PATCH] update encoded recorder --- .../LiveTv/EmbyTV/EmbyTV.cs | 6 +- .../LiveTv/EmbyTV/EncodedRecorder.cs | 56 +++++++++++-------- .../LiveTv/TunerHosts/MulticastStream.cs | 5 ++ 3 files changed, 42 insertions(+), 25 deletions(-) diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs index a33e58eb5a..f6bd21165f 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs @@ -1231,7 +1231,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV RequiresOpening = false, RequiresClosing = false, Protocol = MediaBrowser.Model.MediaInfo.MediaProtocol.Http, - BufferMs = 0 + BufferMs = 0, + IgnoreDts = true }; var isAudio = false; @@ -1516,8 +1517,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV EnforceKeepUpTo(timer, seriesPath); }; - await recorder.Record(mediaStreamInfo, recordPath, duration, onStarted, cancellationToken) - .ConfigureAwait(false); + await recorder.Record(mediaStreamInfo, recordPath, duration, onStarted, cancellationToken).ConfigureAwait(false); recordingStatus = RecordingStatus.Completed; _logger.Info("Recording completed: {0}", recordPath); diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs index 8ee3d71b5e..f59772c458 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs @@ -80,13 +80,20 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV public string GetOutputPath(MediaSourceInfo mediaSource, string targetFile) { - return Path.ChangeExtension(targetFile, "." + OutputFormat); + var extension = OutputFormat; + + if (string.Equals(extension, "mpegts", StringComparison.OrdinalIgnoreCase)) + { + extension = "ts"; + } + + return Path.ChangeExtension(targetFile, "." + extension); } public async Task Record(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken) { - var durationToken = new CancellationTokenSource(duration); - cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token; + //var durationToken = new CancellationTokenSource(duration); + //cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token; await RecordFromFile(mediaSource, mediaSource.Path, targetFile, duration, onStarted, cancellationToken).ConfigureAwait(false); @@ -171,34 +178,32 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV } var durationParam = " -t " + _mediaEncoder.GetTimeParameter(duration.Ticks); - var inputModifiers = "-fflags +genpts -async 1 -vsync -1"; - if (!string.IsNullOrWhiteSpace(GetEncodingOptions().HardwareAccelerationType)) + var flags = new List(); + if (mediaSource.IgnoreDts) { - inputModifiers += " -hwaccel auto"; + flags.Add("+igndts"); + } + if (mediaSource.IgnoreIndex) + { + flags.Add("+ignidx"); } - var commandLineArgs = "-i \"{0}\"{5} {2} -map_metadata -1 -threads 0 {3}{4}{6} -y \"{1}\""; + var inputModifiers = "-async 1 -vsync -1"; - long startTimeTicks = 0; - //if (mediaSource.DateLiveStreamOpened.HasValue) - //{ - // var elapsed = DateTime.UtcNow - mediaSource.DateLiveStreamOpened.Value; - // elapsed -= TimeSpan.FromSeconds(10); - // if (elapsed.TotalSeconds >= 0) - // { - // startTimeTicks = elapsed.Ticks + startTimeTicks; - // } - //} + if (flags.Count > 0) + { + inputModifiers += " -fflags " + string.Join("", flags.ToArray()); + } - if (mediaSource.ReadAtNativeFramerate) + if (!string.IsNullOrWhiteSpace(GetEncodingOptions().HardwareAccelerationType)) { - inputModifiers += " -re"; + inputModifiers += " -hwaccel auto"; } - if (startTimeTicks > 0) + if (mediaSource.ReadAtNativeFramerate) { - inputModifiers = "-ss " + _mediaEncoder.GetTimeParameter(startTimeTicks) + " " + inputModifiers; + inputModifiers += " -re"; } var analyzeDurationSeconds = 5; @@ -212,7 +217,14 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV " -f mp4 -movflags frag_keyframe+empty_moov" : string.Empty; - commandLineArgs = string.Format(commandLineArgs, inputTempFile, targetFile, videoArgs, GetAudioArgs(mediaSource), subtitleArgs, durationParam, outputParam); + var commandLineArgs = string.Format("-i \"{0}\"{5} {2} -map_metadata -1 -threads 0 {3}{4}{6} -y \"{1}\"", + inputTempFile, + targetFile, + videoArgs, + GetAudioArgs(mediaSource), + subtitleArgs, + durationParam, + outputParam); return inputModifiers + " " + commandLineArgs; } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs index abd7a00a9d..02ebbcf16d 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs @@ -29,6 +29,11 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts byte[] buffer = new byte[BufferSize]; + if (source == null) + { + throw new ArgumentNullException("source"); + } + while (!cancellationToken.IsCancellationRequested) { var bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false);