private Mp4BoxRenderedCommand GenerateDashManifest(DashConfig config, IEnumerable <StreamVideoFile> videoFiles, IEnumerable <StreamAudioFile> audioFiles, CancellationToken cancel) { string mpdOutputPath = Path.Combine(config.OutputDirectory, config.OutputFileName) + ".mpd"; var mp4boxCommand = Mp4BoxCommandBuilder.BuildMp4boxMpdCommand( videoFiles: videoFiles, audioFiles: audioFiles, mpdOutputPath: mpdOutputPath, keyInterval: (config.KeyframeInterval / config.Framerate) * 1000, additionalFlags: config.Options.AdditionalMP4BoxFlags); // Generate DASH files. ExecutionResult mpdResult; stderrLog.Invoke($"Running MP4Box with arguments: {mp4boxCommand.RenderedCommand}"); try { mpdResult = ManagedExecution.Start(BoxPath, mp4boxCommand.RenderedCommand, stdoutLog, stderrLog, cancel); // Dash Failed TODO: Add in Progress report behavior that was excluded from this // Detect error in MP4Box process and cleanup, then return null. if (mpdResult.ExitCode != 0) { MPD mpdFile = MPD.LoadFromFile(mpdOutputPath); var filePaths = mpdFile.GetFileNames().Select(x => Path.Combine(config.OutputDirectory, x)); stderrLog.Invoke($"ERROR: MP4Box returned code {mpdResult.ExitCode}. File: {config.InputFilePath}"); CleanOutputFiles(filePaths); CleanOutputFiles(mpdResult.Output); return(null); } } catch (Exception ex) { if (ex is OperationCanceledException) { throw new OperationCanceledException($"Exception running MP4box on {config.InputFilePath}", ex); } else { throw new Exception($"Exception running MP4box on {config.InputFilePath}", ex); } } finally { CleanOutputFiles(videoFiles.Select(x => x.Path)); CleanOutputFiles(audioFiles.Select(x => x.Path)); } return(mp4boxCommand); }
/// <summary> /// The default function for generating an MP4Box command. /// </summary> public static Mp4BoxCommand GenerateMp4BoxCommand(DashConfig config, IEnumerable <VideoStreamCommand> videoFiles, IEnumerable <AudioStreamCommand> audioFiles) { // Use a default key interval of 3s if a framerate or keyframe interval is not given. int keyInterval = (config.KeyframeInterval == 0 || config.Framerate == 0) ? 3000 : (config.KeyframeInterval / config.Framerate * 1000); string mpdOutputPath = Path.Combine(config.OutputDirectory, config.OutputFileName) + ".mpd"; var mp4boxCommand = Mp4BoxCommandBuilder.BuildMp4boxMpdCommand( videoFiles: videoFiles, audioFiles: audioFiles, mpdOutputPath: mpdOutputPath, keyInterval: keyInterval, additionalFlags: config.Options.AdditionalMP4BoxFlags); return(mp4boxCommand); }