コード例 #1
0
        public async Task Preview(int recordingId)
        {
            // get recording
            var recording = await _context.Recordings
                            .Include(x => x.Chapters)
                            .Include(x => x.Outputs)
                            .FirstOrDefaultAsync(x => x.Id == recordingId);

            if (recording == null)
            {
                return;
            }

            // create new recording output
            var recordingOutput = new RecordingOutput()
            {
                RecordingId      = recordingId,
                DateStarted      = DateTime.Now,
                Status           = RecordingStatus.PROCESSING,
                JobType          = typeof(PreviewRecordingJob).FullName,
                JobConfiguration = null
            };

            _context.RecordingOutputs.Add(recordingOutput);
            await _context.SaveChangesAsync();

            await UpdateLectureRecordingStatus();

            // get lecture
            var lecture = await _context.Lectures
                          .FindAsync(recording.LectureId);

            // start encoding preview
            if (recording.Type == RecordingType.GREEN_SCREEN_RECORDING || recording.Type == RecordingType.SIMPLE_RECORDING || recording.Type == RecordingType.ZOOM_RECORDING)
            {
                // file path is file?
                string outputFolder  = Path.Combine(lecture.ConvertedPath, recording.Id.ToString(), "preview");
                string inputFileName = "";

                if (File.Exists(recording.FilePath))
                {
                    inputFileName = recording.FilePath;
                }
                else if (recording.Type == RecordingType.ZOOM_RECORDING)
                {
                    inputFileName = Directory.GetFiles(recording.FilePath)
                                    .Where(x => x.EndsWith(".mp4"))
                                    .SingleOrDefault();
                }
                else
                {
                    var targetName = recording.CustomTargetName != null ? recording.CustomTargetName : "";

                    inputFileName = Directory.GetFiles(recording.FilePath)
                                    .Where(x => x.EndsWith(targetName + "_meta.json"))
                                    .SingleOrDefault();
                }

                if (inputFileName == null)
                {
                    throw new Exception("Could not find studio meta data.");
                }

                // convert files
                RecordingMetadata metaData = null;

                if (recording.Type == RecordingType.GREEN_SCREEN_RECORDING)
                {
                    metaData = ConvertStudioRecording(inputFileName, outputFolder);

                    recording.Duration = metaData.Duration;
                }
                else if (recording.Type == RecordingType.SIMPLE_RECORDING)
                {
                    metaData = ConvertSimpleRecording(inputFileName, outputFolder);

                    recording.Duration = metaData.Duration;
                }
                else if (recording.Type == RecordingType.ZOOM_RECORDING)
                {
                    metaData = ConvertZoomRecording(inputFileName, outputFolder);

                    recording.Duration = metaData.Duration;
                }

                if (metaData != null)
                {
                    _context.RecordingChapters.RemoveRange(recording.Chapters);

                    // add slides
                    foreach (var slide in metaData.Slides)
                    {
                        var chapter = new RecordingChapter()
                        {
                            Recording     = recording,
                            StartPosition = slide.StartPosition,
                            Text          = slide.Ocr,
                            Thumbnail     = slide.Thumbnail
                        };

                        _context.RecordingChapters.Add(chapter);
                    }
                }

                // set status
                recordingOutput.Status       = RecordingStatus.PROCESSED;
                recordingOutput.JobError     = null;
                recordingOutput.DateFinished = DateTime.Now;

                await _context.SaveChangesAsync();
                await UpdateLectureRecordingStatus();
            }
        }
コード例 #2
0
        public async Task Execute(ProcessRecordingJobConfiguration configuration)
        {
            // get recording
            var recording = await _context.Recordings
                            .Include(x => x.Chapters)
                            .Include(x => x.Outputs)
                            .FirstOrDefaultAsync(x => x.Id == configuration.RecordingId);

            if (recording == null)
            {
                return;
            }

            // create new recording output
            var recordingOutput = new RecordingOutput()
            {
                RecordingId      = configuration.RecordingId,
                DateStarted      = DateTime.Now,
                Status           = RecordingStatus.PROCESSING,
                JobType          = typeof(ProcessRecordingJob).FullName,
                JobConfiguration = JsonConvert.SerializeObject(configuration)
            };

            _context.RecordingOutputs.Add(recordingOutput);
            await _context.SaveChangesAsync();

            await UpdateLectureRecordingStatus();

            // get lecture
            var lecture = await _context.Lectures
                          .FindAsync(recording.LectureId);

            // start encoding
            if (recording.Type == RecordingType.GREEN_SCREEN_RECORDING || recording.Type == RecordingType.SIMPLE_RECORDING || recording.Type == RecordingType.ZOOM_RECORDING)
            {
                // file path is file?
                string outputFolder  = Path.Combine(lecture.ConvertedPath, recording.Id.ToString(), "output_" + recordingOutput.Id);
                string inputFileName = "";

                if (File.Exists(recording.FilePath))
                {
                    inputFileName = recording.FilePath;
                }
                else if (recording.Type == RecordingType.ZOOM_RECORDING)
                {
                    inputFileName = Directory.GetFiles(recording.FilePath)
                                    .Where(x => x.EndsWith(".mp4"))
                                    .SingleOrDefault();
                }
                else
                {
                    string targetName = recording.CustomTargetName != null ? recording.CustomTargetName : "";
                    inputFileName = Directory.GetFiles(recording.FilePath)
                                    .Where(x => x.EndsWith(targetName + "_meta.json"))
                                    .SingleOrDefault();
                }

                // create output directory
                Directory.CreateDirectory(outputFolder);

                if (inputFileName == null)
                {
                    recordingOutput.Status   = RecordingStatus.ERROR;
                    recordingOutput.JobError = "Could not find studio meta data.";
                    await _context.SaveChangesAsync();
                    await UpdateLectureRecordingStatus();

                    throw new Exception("Could not find studio meta data.");
                }

                try
                {
                    // convert files
                    RecordingMetadata metaData = null;

                    if (recording.Type == RecordingType.GREEN_SCREEN_RECORDING)
                    {
                        metaData = ConvertStudioRecording(inputFileName, outputFolder, GetDimension(configuration.OutputType));
                    }
                    else if (recording.Type == RecordingType.SIMPLE_RECORDING)
                    {
                        metaData = ConvertSimpleRecording(inputFileName, outputFolder, GetDimension(configuration.OutputType));
                    }
                    else if (recording.Type == RecordingType.ZOOM_RECORDING)
                    {
                        metaData = ConvertZoomRecording(inputFileName, outputFolder);
                    }

                    recordingOutput.Status       = RecordingStatus.PROCESSED;
                    recordingOutput.JobError     = null;
                    recordingOutput.DateFinished = DateTime.Now;

                    await _context.SaveChangesAsync();
                    await UpdateLectureRecordingStatus();
                }
                catch (Exception ex)
                {
                    recordingOutput.Status       = RecordingStatus.ERROR;
                    recordingOutput.JobError     = ex.Message;
                    recordingOutput.DateFinished = DateTime.Now;

                    await UpdateLectureRecordingStatus();

                    throw ex;
                }
            }
        }