private void AddPreviousGap(double gapDuration, Stream gapManifestStream, CompositeManifestInfo compositeManifestInfo) { if (gapDuration == 0) { return; } const double Timescale = 10000000.0; SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser(gapManifestStream); gapManifestStream.Seek(0, SeekOrigin.Begin); double gapVideoCount = gapDuration / (parser.ManifestInfo.ManifestDuration / Timescale); int completeVideos = (int)gapVideoCount; double partialVideoProportion = gapVideoCount - (int)gapVideoCount; ulong clipEnd = parser.ManifestInfo.ManifestDuration; var customAttributes = new Dictionary <string, string> { { "CMSId", this.gapCmsId }, { "AzureId", this.gapAzureId } }; for (int i = 0; i < completeVideos; i++) { compositeManifestInfo.AddClip(this.gapUri, 0, clipEnd, customAttributes, true, parser.ManifestInfo); } clipEnd = (ulong)(clipEnd * partialVideoProportion); if (clipEnd != 0) { compositeManifestInfo.AddClip(this.gapUri, 0, clipEnd, customAttributes, true, parser.ManifestInfo); } }
public string GetSubClipManifest(Uri manifestUri, double markIn, double markOut) { string manifest = null; DownloaderManager downloaderManager = new DownloaderManager(); Stream manifestStream = downloaderManager.DownloadManifest(manifestUri, true, null); if (manifestStream != null) { SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser(manifestStream); SmoothStreamingManifestWriter writer = new SmoothStreamingManifestWriter(); CompositeManifestInfo compositeManifestInfo = new CompositeManifestInfo(parser.ManifestInfo.MajorVersion, parser.ManifestInfo.MinorVersion); compositeManifestInfo.AddClip(manifestUri, (ulong)markIn, (ulong)markOut, parser.ManifestInfo); manifest = writer.GenerateCompositeManifest(compositeManifestInfo, false); } return manifest; }
public CreateTrainingSetResponse CreateTrainingSet(CreateTrainingSetRequest request) { var response = new CreateTrainingSetResponse(); try { var downloadManager = new DownloaderManager(); var compositeManifestInfo = new CompositeManifestInfo(2, 0); var videoRepository = serviceLocator.GetInstance <IVideoRepository>(); var catalogRepository = serviceLocator.GetInstance <ICatalogRepository>(); var templateRepository = serviceLocator.GetInstance <ITrainingSetTemplateRepository>(); var totalDuration = TimeSpan.Zero; foreach (var videoPart in request.TrainingSet.VideoParts) { var video = videoRepository.Get(videoPart.VideoId); var manifestStream = downloadManager.DownloadManifest(video.StreamUri, true, null); if (manifestStream != null) { var parser = new SmoothStreamingManifestParser(manifestStream); double startPosition = videoPart.From.TotalSeconds; double endPosition = videoPart.To.TotalSeconds; compositeManifestInfo.AddClip(video.StreamUri, (ulong)(startPosition * Timescale), (ulong)(endPosition * Timescale), parser.ManifestInfo); totalDuration = totalDuration.Add(videoPart.To.Subtract(videoPart.From)); } } var writer = new SmoothStreamingManifestWriter(); var manifest = writer.GenerateCompositeManifest(compositeManifestInfo, false, false); string csmPath = HttpContext.Current.Server.MapPath("csm"); if (!Directory.Exists(csmPath)) { Directory.CreateDirectory(csmPath); } var uniqueName = Guid.NewGuid().ToString(); string tmpFilePath = Path.Combine(csmPath, string.Format("{0}.tmpcsm", uniqueName)); string finalFilePath = Path.Combine(csmPath, string.Format("{0}.csm", uniqueName)); File.WriteAllText(tmpFilePath, manifest, Encoding.UTF8); if (File.Exists(tmpFilePath)) { if (File.Exists(finalFilePath)) { File.Delete(finalFilePath); } File.Move(tmpFilePath, finalFilePath); } var userService = serviceLocator.GetInstance <IApplicationUserService>(); var user = userService.RetrieveApplicationUser(new ApplicationUserFindCriteria() { Username = request.User }); var template = templateRepository.Get(request.TrainingSet.TrainingSetTemplateId); //var _telemetry = new List<Telemetry>(); var timer = TimeSpan.Zero; var recordingInterval = TimeSpan.FromSeconds(2); var telemetryFile = new StringBuilder().AppendLine("\"Minutes\",\"Torq(N-m)\",\"Km/h\",\"Watts\",\"Km\",\"Cadence\",\"Hrate\",\"ID\",\"Altitude(m)\""); foreach (var interval in template.Intervals) { var numberOfElements = interval.Duration.TotalSeconds / recordingInterval.TotalSeconds; for (int i = 0; i < numberOfElements; i++) { var telemetry = new Telemetry(); telemetry.PercentageThreshold = Convert.ToDouble(interval.Effort) / 100; telemetry.Watts = ((telemetry.PercentageThreshold) * user.FTP.GetValueOrDefault()); telemetry.TimePosition = timer; timer = timer.Add(recordingInterval); telemetryFile.AppendLine(telemetry.ToDelimitedString(',')); //telemetry.PercentageThreshold = Convert.ToDouble(interval.Effort); //telemetry.TimePosition = timer; //telemetryFile.AppendLine(telemetry.ToDelimitedString(',')); } } string telemetryPath = HttpContext.Current.Server.MapPath("telemetry"); if (!Directory.Exists(telemetryPath)) { Directory.CreateDirectory(telemetryPath); } string filePath = Path.Combine(telemetryPath, string.Format("{0}.csv", uniqueName)); File.WriteAllText(filePath, telemetryFile.ToString()); //var context = System.ServiceModel.OperationContext.Current; //RemoteEndpointMessageProperty property = (RemoteEndpointMessageProperty)context.IncomingMessageProperties[RemoteEndpointMessageProperty.Name]; string host = "www.indoorworx.com";// property.Address; //var host = "localhost"; //now create the video var workout = new Video(); workout.StreamUri = new Uri(string.Format("http://{0}/IndoorWorx/csm/{1}.csm", host, uniqueName), UriKind.Absolute); workout.Title = request.TrainingSet.Title; workout.Description = template.Description; workout.Duration = totalDuration; workout.TelemetryInfo.TelemetryUri = new Uri(string.Format("http://{0}/IndoorWorx/telemetry/{1}.csv", host, uniqueName), UriKind.Absolute); foreach (var text in template.VideoText) { workout.VideoText.Add(text.Clone()); } workout.Intervals = template.Intervals.Select(x => new VideoInterval(x.Duration, x.Effort, x.Sequence)).ToList(); var savedWorkout = videoRepository.Save(workout); userService.AddVideoToLibrary(new AddVideoRequest() { User = request.User, VideoId = savedWorkout.Id }); response.Status = CreateTrainingSetStatus.Success; response.TrainingSet = savedWorkout; } catch (Exception ex) { response.Status = CreateTrainingSetStatus.Error; response.Message = ex.StackTrace; //response.Message = ex.Message; } return(response); }
private static void AddClipToCompositeManifestInfo(TimelineElement shot, Stream manifestStream, CompositeManifestInfo compositeManifestInfo) { const ulong Timescale = 10000000; ulong startPosition = 0; SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser(manifestStream); manifestStream.Seek(0, SeekOrigin.Begin); var subClipAsset = shot.Asset as VideoAssetInOut; var adaptiveAsset = subClipAsset != null && subClipAsset.IsAdaptiveAsset ? (IAdaptiveAsset)subClipAsset.VideoAsset : shot.Asset as IAdaptiveAsset; // the timeline elements holds the in/out position, instead of creating an ISubClipAsset double markIn = shot.InPosition.TotalSeconds; double markOut = shot.OutPosition.TotalSeconds; if (adaptiveAsset != null) { startPosition = GetStartPositionFromManifest(parser); } if (!string.IsNullOrEmpty(shot.SelectedAudioStream)) { var audioStreamsToRemove = parser.ManifestInfo.Streams.Where(s => s.StreamType.Equals("Audio", StringComparison.CurrentCultureIgnoreCase) && !s.Attributes["Name"].Equals(shot.SelectedAudioStream)).ToList(); if (audioStreamsToRemove != null) { foreach (var audioStream in audioStreamsToRemove) { parser.ManifestInfo.Streams.Remove(audioStream); } } } if (subClipAsset != null) { if (!string.IsNullOrEmpty(subClipAsset.SequenceVideoCamera)) { var videoStream = parser.ManifestInfo.Streams.First(s => s.StreamType.Equals("Video", StringComparison.CurrentCultureIgnoreCase)); var qualityLevelsToRemove = videoStream.QualityLevels.Where(q => !q.CustomAttributes.ContainsKey("cameraAngle") || !q.CustomAttributes["cameraAngle"].Equals(subClipAsset.SequenceVideoCamera)).ToList(); foreach (var qualityLevel in qualityLevelsToRemove) { videoStream.QualityLevels.Remove(qualityLevel); } } startPosition = GetStartPositionFromManifest(parser); } ulong clipBegin = (ulong)(Convert.ToUInt64(markIn * Timescale) + startPosition); ulong clipEnd = (ulong)(Convert.ToUInt64(markOut * Timescale) + startPosition); var customAttributes = new Dictionary <string, string> { { "CMSId", shot.Asset.CMSId }, { "AzureId", shot.Asset.AzureId } }; compositeManifestInfo.AddClip(shot.Asset.Source, clipBegin, clipEnd, customAttributes, parser.ManifestInfo); }
private static void AddClipToCompositeManifestInfo(Shot shot, Stream manifestStream, CompositeManifestInfo compositeManifestInfo) { const ulong Timescale = 10000000; ulong startPosition = 0; SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser(manifestStream); manifestStream.Seek(0, SeekOrigin.Begin); var subClipAsset = shot.Source as SubClipItem; var smoothStreamingVideoItem = shot.Source as SmoothStreamingVideoItem; var smoothStreamingAudioItem = shot.Source as SmoothStreamingAudioItem; // the timeline elements holds the in/out position, instead of creating an ISubClipAsset double markIn = shot.SourceAnchor.MarkIn.Value; double markOut = shot.SourceAnchor.MarkOut.Value; if (smoothStreamingVideoItem != null || smoothStreamingAudioItem != null) { startPosition = GetStartPositionFromManifest(parser); } if (!string.IsNullOrEmpty(shot.SequenceAudioStream)) { var audioStreamsToRemove = parser.ManifestInfo.Streams.Where(s => s.StreamType.Equals("Audio", StringComparison.CurrentCultureIgnoreCase) && !s.Attributes["Name"].Equals(shot.SequenceAudioStream)).ToList(); if (audioStreamsToRemove != null) { foreach (var audioStream in audioStreamsToRemove) { parser.ManifestInfo.Streams.Remove(audioStream); } } } if (subClipAsset != null) { if (!string.IsNullOrEmpty(subClipAsset.SequenceVideoStream)) { var videoStream = parser.ManifestInfo.Streams.First(s => s.StreamType.Equals("Video", StringComparison.CurrentCultureIgnoreCase)); var qualityLevelsToRemove = videoStream.QualityLevels.Where(q => !q.CustomAttributes.ContainsKey("cameraAngle") || !q.CustomAttributes["cameraAngle"].Equals(subClipAsset.SequenceVideoStream)).ToList(); foreach (var qualityLevel in qualityLevelsToRemove) { videoStream.QualityLevels.Remove(qualityLevel); } } startPosition = GetStartPositionFromManifest(parser); } ulong clipBegin = (ulong)(Convert.ToUInt64(markIn * Timescale) + startPosition); ulong clipEnd = (ulong)(Convert.ToUInt64(markOut * Timescale) + startPosition); Resource resource = shot.Source.Resources.SingleOrDefault(x => !string.IsNullOrEmpty(x.Ref)); Uri assetUri; Uri.TryCreate(resource.Ref, UriKind.Absolute, out assetUri); var customAttributes = new Dictionary <string, string> { { "CMSId", shot.Source.CMSId }, { "AzureId", shot.Source.AzureId } }; compositeManifestInfo.AddClip(assetUri, clipBegin, clipEnd, customAttributes, parser.ManifestInfo); }
public string GetManifest(string projectXml, string pbpDataStreamName, string adsDataStreamName) { CompositeManifestInfo compositeManifestInfo = new CompositeManifestInfo(2, 0); compositeManifestInfo.PlayByPlayDataStreamName = pbpDataStreamName; compositeManifestInfo.AdsDataStreamName = adsDataStreamName; DownloaderManager manager = new DownloaderManager(); const ulong Timescale = 10000000; Project project; try { project = Deserialize<Project>(projectXml); } catch { return Resources.Resources.InvalidRCEProjectXml; } if (project.Timeline != null) { Track track = project.Timeline.SingleOrDefault(x => x.TrackType.ToUpperInvariant() == "VISUAL"); if (track != null && track.Shots != null) { foreach (Shot shot in track.Shots) { if (shot.Source != null && shot.Source is VideoItem && shot.Source.Resources.Count > 0 && shot.SourceAnchor != null) { Resource resource = shot.Source.Resources.SingleOrDefault(x => !String.IsNullOrEmpty(x.Ref)); Uri assetUri; if (resource != null && Uri.TryCreate(resource.Ref, UriKind.Absolute, out assetUri)) { Stream manifestStream = manager.DownloadManifest(assetUri, true, null); if (manifestStream != null) { double startPosition = (shot.Source is SmoothStreamingVideoItem) ? ((SmoothStreamingVideoItem)shot.Source).StartPosition : 0; SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser(manifestStream); ulong clipBegin = (ulong)((shot.SourceAnchor.MarkIn.GetValueOrDefault() * Timescale) + (startPosition * Timescale)); ulong clipEnd = (ulong)((shot.SourceAnchor.MarkOut.GetValueOrDefault() * Timescale) + (startPosition * Timescale)); compositeManifestInfo.AddClip(assetUri, clipBegin, clipEnd, parser.ManifestInfo); } } } //if (shot.Source != null && shot.Source is ImageItem && shot.Source.Resources.Count > 0 && shot.SourceAnchor != null) //{ // Resource resource = shot.Source.Resources.SingleOrDefault(x => !String.IsNullOrEmpty(x.Ref)); // Uri assetUri; // if (resource != null && Uri.TryCreate(resource.Ref, UriKind.Absolute, out assetUri)) // { // Stream imageStream = manager.DownloadManifest(assetUri, true, null); // if (imageStream != null) // { // double startPosition = shot.SourceAnchor.MarkIn.GetValueOrDefault(); // //double startPosition = (shot.Source is SmoothStreamingVideoItem) ? ((SmoothStreamingVideoItem)shot.Source).StartPosition : 0; // SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser(imageStream); // ulong clipBegin = (ulong)((shot.SourceAnchor.MarkIn.GetValueOrDefault() * Timescale) + (startPosition * Timescale)); // ulong clipEnd = (ulong)((shot.SourceAnchor.MarkOut.GetValueOrDefault() * Timescale) + (startPosition * Timescale)); // compositeManifestInfo.AddClip(assetUri, clipBegin, clipEnd, parser.ManifestInfo); // } // } } } } }
public void CreateCompositeStream(Contracts.Project project) { CompositeManifestInfo compositeManifestInfo = new CompositeManifestInfo(2, 1); compositeManifestInfo.PlayByPlayDataStreamName = "PBP"; compositeManifestInfo.AdsDataStreamName = "ADS"; DownloaderManager manager = new DownloaderManager(); const ulong Timescale = 10000000; if (project.Timeline != null) { Track track = project.Timeline.SingleOrDefault(x => x.TrackType.ToUpperInvariant() == "VISUAL"); if (track != null && track.Shots != null) { foreach (Shot shot in track.Shots) { if (shot.Source != null && shot.Source is VideoItem && shot.Source.Resources.Count > 0 && shot.SourceAnchor != null) { Resource resource = shot.Source.Resources.SingleOrDefault(x => !String.IsNullOrEmpty(x.Ref)); Uri assetUri; if (resource != null && Uri.TryCreate(resource.Ref, UriKind.Absolute, out assetUri)) { Stream manifestStream = manager.DownloadManifest(assetUri, true, null); if (manifestStream != null) { double startPosition = (shot.Source is SmoothStreamingVideoItem) ? ((SmoothStreamingVideoItem)shot.Source).StartPosition : 0; SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser(manifestStream); ulong clipBegin = (ulong)((shot.SourceAnchor.MarkIn.GetValueOrDefault() * Timescale) + (startPosition * Timescale)); ulong clipEnd = (ulong)((shot.SourceAnchor.MarkOut.GetValueOrDefault() * Timescale) + (startPosition * Timescale)); compositeManifestInfo.AddClip(assetUri, clipBegin, clipEnd, parser.ManifestInfo); } } } } } } if (project.Titles != null) { foreach (var title in project.Titles) { //compositeManifestInfo } } if (project.AdOpportunities != null) { foreach (RCE.Services.Contracts.AdOpportunity adOpportunity in project.AdOpportunities) { compositeManifestInfo.AddAdOpportunity(adOpportunity.ID, adOpportunity.TemplateType, adOpportunity.Time); } } if (project.Markers != null) { foreach (Marker marker in project.Markers) { compositeManifestInfo.AddPlayByPlay(marker.ID, marker.Text, marker.Time); } } SmoothStreamingManifestWriter writer = new SmoothStreamingManifestWriter(); string manifest = writer.GenerateCompositeManifest(compositeManifestInfo, false); string csmPath = HttpContext.Current.Server.MapPath("csm"); if (!Directory.Exists(csmPath)) { Directory.CreateDirectory(csmPath); } string datetime = DateTime.Now.ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture); string tmpFilePath = Path.Combine(csmPath, string.Format(CultureInfo.InvariantCulture, "{0}-{1}.tmpcsm", project.Title.ToString(), datetime)); string finalFilePath = Path.Combine(csmPath, string.Format(CultureInfo.InvariantCulture, "{0}-{1}.csm", project.Title.ToString(), datetime)); File.WriteAllText(tmpFilePath, manifest, Encoding.UTF8); if (File.Exists(tmpFilePath)) { if (File.Exists(finalFilePath)) { File.Delete(finalFilePath); } File.Move(tmpFilePath, finalFilePath); } }