fix hls direct streaming mode (#682)
This commit is contained in:
@@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
### Fixed
|
||||||
|
- Fix `HLS Direct` streaming mode
|
||||||
|
|
||||||
## [0.4.3-alpha] - 2022-03-05
|
## [0.4.3-alpha] - 2022-03-05
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
@@ -93,6 +93,68 @@ public class PipelineGeneratorTests
|
|||||||
"-threads 1 -nostdin -hide_banner -nostats -loglevel error -fflags +genpts+discardcorrupt+igndts -f concat -safe 0 -protocol_whitelist file,http,tcp,https,tcp,tls -probesize 32 -re -stream_loop -1 -i http://localhost:8080/ffmpeg/concat/1 -muxdelay 0 -muxpreload 0 -movflags +faststart -flags cgop -sc_threshold 0 -c copy -map_metadata -1 -metadata service_provider=\"ErsatzTV\" -metadata service_name=\"Some Channel\" -f mpegts -mpegts_flags +initial_discontinuity pipe:1");
|
"-threads 1 -nostdin -hide_banner -nostats -loglevel error -fflags +genpts+discardcorrupt+igndts -f concat -safe 0 -protocol_whitelist file,http,tcp,https,tcp,tls -probesize 32 -re -stream_loop -1 -i http://localhost:8080/ffmpeg/concat/1 -muxdelay 0 -muxpreload 0 -movflags +faststart -flags cgop -sc_threshold 0 -c copy -map_metadata -1 -metadata service_provider=\"ErsatzTV\" -metadata service_name=\"Some Channel\" -f mpegts -mpegts_flags +initial_discontinuity pipe:1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void HlsDirect_Test()
|
||||||
|
{
|
||||||
|
var videoInputFile = new VideoInputFile(
|
||||||
|
"/tmp/whatever.mkv",
|
||||||
|
new List<VideoStream>
|
||||||
|
{ new(0, VideoFormat.H264, new PixelFormatYuv420P(), new FrameSize(1920, 1080), "24", false) });
|
||||||
|
|
||||||
|
var audioInputFile = new AudioInputFile(
|
||||||
|
"/tmp/whatever.mkv",
|
||||||
|
new List<AudioStream> { new(1, AudioFormat.Aac, 2) },
|
||||||
|
new AudioState(
|
||||||
|
AudioFormat.Copy,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
false));
|
||||||
|
|
||||||
|
var desiredState = new FrameState(
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
VideoFormat.Copy,
|
||||||
|
new PixelFormatYuv420P(),
|
||||||
|
new FrameSize(1920, 1080),
|
||||||
|
new FrameSize(1920, 1080),
|
||||||
|
Option<int>.None,
|
||||||
|
2000,
|
||||||
|
4000,
|
||||||
|
90_000,
|
||||||
|
false);
|
||||||
|
|
||||||
|
var ffmpegState = new FFmpegState(
|
||||||
|
false,
|
||||||
|
HardwareAccelerationMode.None,
|
||||||
|
Option<string>.None,
|
||||||
|
Option<string>.None,
|
||||||
|
Option<TimeSpan>.None,
|
||||||
|
Option<TimeSpan>.None,
|
||||||
|
false,
|
||||||
|
Option<string>.None,
|
||||||
|
Option<string>.None,
|
||||||
|
Option<string>.None,
|
||||||
|
OutputFormatKind.MpegTs,
|
||||||
|
Option<string>.None,
|
||||||
|
Option<string>.None,
|
||||||
|
0);
|
||||||
|
|
||||||
|
var builder = new PipelineBuilder(videoInputFile, audioInputFile, None, "", _logger);
|
||||||
|
FFmpegPipeline result = builder.Build(ffmpegState, desiredState);
|
||||||
|
|
||||||
|
result.PipelineSteps.Should().HaveCountGreaterThan(0);
|
||||||
|
result.PipelineSteps.Should().Contain(ps => ps is EncoderCopyVideo);
|
||||||
|
result.PipelineSteps.Should().Contain(ps => ps is EncoderCopyAudio);
|
||||||
|
|
||||||
|
string command = PrintCommand(videoInputFile, audioInputFile, None, None, result);
|
||||||
|
|
||||||
|
command.Should().Be(
|
||||||
|
"-threads 1 -nostdin -hide_banner -nostats -loglevel error -fflags +genpts+discardcorrupt+igndts -i /tmp/whatever.mkv -map 0:1 -map 0:0 -muxdelay 0 -muxpreload 0 -movflags +faststart -flags cgop -sc_threshold 0 -c:v copy -c:a copy -f mpegts -mpegts_flags +initial_discontinuity pipe:1");
|
||||||
|
}
|
||||||
|
|
||||||
private static string PrintCommand(
|
private static string PrintCommand(
|
||||||
Option<VideoInputFile> videoInputFile,
|
Option<VideoInputFile> videoInputFile,
|
||||||
Option<AudioInputFile> audioInputFile,
|
Option<AudioInputFile> audioInputFile,
|
||||||
|
|||||||
@@ -607,6 +607,11 @@ public class PipelineBuilder
|
|||||||
|
|
||||||
private static bool IsDesiredVideoState(FrameState currentState, FrameState desiredState)
|
private static bool IsDesiredVideoState(FrameState currentState, FrameState desiredState)
|
||||||
{
|
{
|
||||||
|
if (desiredState.VideoFormat == VideoFormat.Copy)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return currentState.VideoFormat == desiredState.VideoFormat &&
|
return currentState.VideoFormat == desiredState.VideoFormat &&
|
||||||
currentState.PixelFormat.Match(pf => pf.Name, () => string.Empty) ==
|
currentState.PixelFormat.Match(pf => pf.Name, () => string.Empty) ==
|
||||||
desiredState.PixelFormat.Match(pf => pf.Name, string.Empty) &&
|
desiredState.PixelFormat.Match(pf => pf.Name, string.Empty) &&
|
||||||
|
|||||||
Reference in New Issue
Block a user