Browse Source

update encoded recorder

Luke Pulverenti 8 years ago
parent
commit
9212ffb528

+ 3 - 3
Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs

@@ -1231,7 +1231,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                     RequiresOpening = false,
                     RequiresOpening = false,
                     RequiresClosing = false,
                     RequiresClosing = false,
                     Protocol = MediaBrowser.Model.MediaInfo.MediaProtocol.Http,
                     Protocol = MediaBrowser.Model.MediaInfo.MediaProtocol.Http,
-                    BufferMs = 0
+                    BufferMs = 0,
+                    IgnoreDts = true
                 };
                 };
 
 
                 var isAudio = false;
                 var isAudio = false;
@@ -1516,8 +1517,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                     EnforceKeepUpTo(timer, seriesPath);
                     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;
                 recordingStatus = RecordingStatus.Completed;
                 _logger.Info("Recording completed: {0}", recordPath);
                 _logger.Info("Recording completed: {0}", recordPath);

+ 34 - 22
Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -80,13 +80,20 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
 
         public string GetOutputPath(MediaSourceInfo mediaSource, string targetFile)
         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)
         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);
             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 durationParam = " -t " + _mediaEncoder.GetTimeParameter(duration.Ticks);
-            var inputModifiers = "-fflags +genpts -async 1 -vsync -1";
 
 
-            if (!string.IsNullOrWhiteSpace(GetEncodingOptions().HardwareAccelerationType))
+            var flags = new List<string>();
+            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;
             var analyzeDurationSeconds = 5;
@@ -212,7 +217,14 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                 " -f mp4 -movflags frag_keyframe+empty_moov" :
                 " -f mp4 -movflags frag_keyframe+empty_moov" :
                 string.Empty;
                 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;
             return inputModifiers + " " + commandLineArgs;
         }
         }

+ 5 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs

@@ -29,6 +29,11 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
 
 
             byte[] buffer = new byte[BufferSize];
             byte[] buffer = new byte[BufferSize];
 
 
+            if (source == null)
+            {
+                throw new ArgumentNullException("source");
+            }
+
             while (!cancellationToken.IsCancellationRequested)
             while (!cancellationToken.IsCancellationRequested)
             {
             {
                 var bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false);
                 var bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false);