Example #1
0
        protected override string GetCommandLineArguments(string outputPath, StreamState state, bool isEncoding)
        {
            var threads = GetNumberOfThreads(state, false);

            var inputModifier = GetInputModifier(state, false);

            // If isEncoding is true we're actually starting ffmpeg
            var startNumberParam = isEncoding ? GetStartNumber(state).ToString(UsCulture) : "0";

            var toTimeParam          = string.Empty;
            var timestampOffsetParam = string.Empty;

            if (state.IsOutputVideo && !EnableCopyTs(state) && !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && (state.Request.StartTimeTicks ?? 0) > 0)
            {
                timestampOffsetParam = " -output_ts_offset " + MediaEncoder.GetTimeParameter(state.Request.StartTimeTicks ?? 0).ToString(CultureInfo.InvariantCulture);
            }

            var mapArgs = state.IsOutputVideo ? GetMapArgs(state) : string.Empty;

            var enableGenericSegmenter = false;

            if (enableGenericSegmenter)
            {
                var outputTsArg = Path.Combine(Path.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state);

                return(string.Format("{0} {10} {1} -map_metadata -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"",
                                     inputModifier,
                                     GetInputArgument(state),
                                     threads,
                                     mapArgs,
                                     GetVideoArguments(state),
                                     GetAudioArguments(state),
                                     state.SegmentLength.ToString(UsCulture),
                                     startNumberParam,
                                     outputPath,
                                     outputTsArg,
                                     toTimeParam
                                     ).Trim());
            }

            return(string.Format("{0}{11} {1} -map_metadata -1 -threads {2} {3} {4}{5} {6} -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -hls_time {7} -start_number {8} -hls_list_size {9} -y \"{10}\"",
                                 inputModifier,
                                 GetInputArgument(state),
                                 threads,
                                 mapArgs,
                                 GetVideoArguments(state),
                                 timestampOffsetParam,
                                 GetAudioArguments(state),
                                 state.SegmentLength.ToString(UsCulture),
                                 startNumberParam,
                                 state.HlsListSize.ToString(UsCulture),
                                 outputPath,
                                 toTimeParam
                                 ).Trim());
        }
Example #2
0
        protected override string GetCommandLineArguments(string outputPath, StreamState state, bool isEncoding)
        {
            var threads = GetNumberOfThreads(state, false);

            var inputModifier = GetInputModifier(state, false);

            // If isEncoding is true we're actually starting ffmpeg
            var startNumberParam = isEncoding ? GetStartNumber(state).ToString(UsCulture) : "0";

            var toTimeParam          = string.Empty;
            var timestampOffsetParam = string.Empty;

            if (state.IsOutputVideo && !EnableCopyTs(state) && !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && (state.Request.StartTimeTicks ?? 0) > 0)
            {
                timestampOffsetParam = " -output_ts_offset " + MediaEncoder.GetTimeParameter(state.Request.StartTimeTicks ?? 0);
            }

            var mapArgs = state.IsOutputVideo ? GetMapArgs(state) : string.Empty;
            var enableSplittingOnNonKeyFrames = string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && false;

            // TODO: check libavformat version for 57 50.100 and use -hls_flags split_by_time
            var hlsProtocolSupportsSplittingByTime = false;

            if (enableSplittingOnNonKeyFrames && !hlsProtocolSupportsSplittingByTime)
            {
                var outputTsArg = Path.Combine(Path.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state);

                return(string.Format("{0} {10} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} -break_non_keyframes  1 -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"",
                                     inputModifier,
                                     GetInputArgument(state),
                                     threads,
                                     mapArgs,
                                     GetVideoArguments(state),
                                     GetAudioArguments(state),
                                     state.SegmentLength.ToString(UsCulture),
                                     startNumberParam,
                                     outputPath,
                                     outputTsArg,
                                     toTimeParam
                                     ).Trim());
            }

            var splitByTime    = hlsProtocolSupportsSplittingByTime && enableSplittingOnNonKeyFrames;
            var splitByTimeArg = splitByTime ? " -hls_flags split_by_time" : "";

            return(string.Format("{0}{12} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4}{5} {6} -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -hls_time {7}{8} -start_number {9} -hls_list_size {10} -y \"{11}\"",
                                 inputModifier,
                                 GetInputArgument(state),
                                 threads,
                                 mapArgs,
                                 GetVideoArguments(state),
                                 timestampOffsetParam,
                                 GetAudioArguments(state),
                                 state.SegmentLength.ToString(UsCulture),
                                 splitByTimeArg,
                                 startNumberParam,
                                 state.HlsListSize.ToString(UsCulture),
                                 outputPath,
                                 toTimeParam
                                 ).Trim());
        }
Example #3
0
        protected override string GetCommandLineArguments(string outputPath, StreamState state, bool isEncoding)
        {
            var threads = GetNumberOfThreads(state, false);

            var inputModifier = GetInputModifier(state, false);

            // If isEncoding is true we're actually starting ffmpeg
            var startNumberParam = isEncoding ? GetStartNumber(state).ToString(UsCulture) : "0";

            var toTimeParam          = string.Empty;
            var timestampOffsetParam = string.Empty;

            if (EnableSplitTranscoding(state))
            {
                var startTime       = state.Request.StartTimeTicks ?? 0;
                var durationSeconds = ApiEntryPoint.Instance.GetEncodingOptions().ThrottleThresholdInSeconds;

                var endTime = startTime + TimeSpan.FromSeconds(durationSeconds).Ticks;
                endTime = Math.Min(endTime, state.RunTimeTicks.Value);

                if (endTime < state.RunTimeTicks.Value)
                {
                    //toTimeParam = " -to " + MediaEncoder.GetTimeParameter(endTime);
                    toTimeParam = " -t " + MediaEncoder.GetTimeParameter(TimeSpan.FromSeconds(durationSeconds).Ticks);
                }
            }

            if (state.IsOutputVideo && !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && (state.Request.StartTimeTicks ?? 0) > 0)
            {
                timestampOffsetParam = " -output_ts_offset " + MediaEncoder.GetTimeParameter(state.Request.StartTimeTicks ?? 0).ToString(CultureInfo.InvariantCulture);
            }

            var mapArgs = state.IsOutputVideo ? GetMapArgs(state) : string.Empty;

            //var outputTsArg = Path.Combine(Path.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state);

            //return string.Format("{0} {11} {1}{10} -map_metadata -1 -threads {2} {3} {4} {5} -f segment -segment_time {6} -segment_format mpegts -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"",
            //    inputModifier,
            //    GetInputArgument(state),
            //    threads,
            //    mapArgs,
            //    GetVideoArguments(state),
            //    GetAudioArguments(state),
            //    state.SegmentLength.ToString(UsCulture),
            //    startNumberParam,
            //    outputPath,
            //    outputTsArg,
            //            slowSeekParam,
            //            toTimeParam
            //    ).Trim();

            return(string.Format("{0}{11} {1} -map_metadata -1 -threads {2} {3} {4}{5} {6} -hls_time {7} -start_number {8} -hls_list_size {9} -y \"{10}\"",
                                 inputModifier,
                                 GetInputArgument(state),
                                 threads,
                                 mapArgs,
                                 GetVideoArguments(state),
                                 timestampOffsetParam,
                                 GetAudioArguments(state),
                                 state.SegmentLength.ToString(UsCulture),
                                 startNumberParam,
                                 state.HlsListSize.ToString(UsCulture),
                                 outputPath,
                                 toTimeParam
                                 ).Trim());
        }