Esempio n. 1
0
        /// <summary>
        /// Executes the actual media conversion, returning an object that contains settings and the
        /// results of the conversion.
        /// </summary>
        /// <param name="mediaObject">The media object.</param>
        /// <param name="encoderSetting">The encoder setting that defines the conversion parameters.</param>
        /// <returns>
        /// Returns an instance of <see cref="MediaConversionSettings"/> containing settings and
        /// results used in the conversion.
        /// </returns>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="mediaObject" /> or
        /// <paramref name="encoderSetting" /> is null.</exception>
        private MediaConversionSettings ExecuteMediaConversion(IGalleryObject mediaObject, IMediaEncoderSettings encoderSetting)
        {
            if (mediaObject == null)
            {
                throw new ArgumentNullException("mediaObject");
            }

            if (encoderSetting == null)
            {
                throw new ArgumentNullException("encoderSetting");
            }

            AttemptedEncoderSettings.Add(encoderSetting);

            IGallerySettings gallerySetting = Factory.LoadGallerySetting(mediaObject.GalleryId);

            // Determine file name and path of the new file.
            string optimizedPath            = HelperFunctions.MapAlbumDirectoryStructureToAlternateDirectory(mediaObject.Original.FileInfo.DirectoryName, gallerySetting.FullOptimizedPath, gallerySetting.FullMediaObjectPath);
            string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(mediaObject.Original.FileInfo.Name);
            string newFilename = GenerateNewFilename(optimizedPath, fileNameWithoutExtension, encoderSetting.DestinationFileExtension, gallerySetting.OptimizedFileNamePrefix);
            string newFilePath = Path.Combine(optimizedPath, newFilename);

            MediaConversionSettings mediaSettings = new MediaConversionSettings
            {
                FilePathSource      = mediaObject.Original.FileNamePhysicalPath,
                FilePathDestination = newFilePath,
                EncoderSetting      = encoderSetting,
                GalleryId           = mediaObject.GalleryId,
                MediaQueueId        = _currentMediaQueueItemId,
                TimeoutMs           = gallerySetting.MediaEncoderTimeoutMs,
                MediaObjectId       = mediaObject.Id,
                FFmpegArgs          = String.Empty,
                FFmpegOutput        = String.Empty,
                CancellationToken   = CancelTokenSource.Token
            };

            mediaSettings.FFmpegOutput = FFmpeg.CreateMedia(mediaSettings);
            mediaSettings.FileCreated  = ValidateFile(mediaSettings.FilePathDestination);

            if (!mediaSettings.FileCreated)
            {
                // Could not create the requested version of the file. Record the event, then try again,
                // using the next encoder setting (if one exists).
                string msg = String.Format(CultureInfo.CurrentCulture, "FAILURE: FFmpeg was not able to create video '{0}'.", Path.GetFileName(mediaSettings.FilePathDestination));
                RecordEvent(msg, mediaSettings);

                IMediaEncoderSettings nextEncoderSetting = GetEncoderSetting(mediaObject);
                if (nextEncoderSetting != null)
                {
                    return(ExecuteMediaConversion(mediaObject, nextEncoderSetting));
                }
            }

            return(mediaSettings);
        }
        /// <summary>
        /// Update settings to prepare for the conversion of a media item.
        /// </summary>
        private void Reset()
        {
            _currentMediaQueueItemId = int.MinValue;
            AttemptedEncoderSettings.Clear();

            // Update the status of any 'Processing' items to 'Waiting'. This is needed to reset any items that
            // were being processed but were never finished (this can happen if the app pool recycles).
            foreach (var item in MediaQueueItemDictionary.Where(m => m.Value.Status == MediaQueueItemStatus.Processing).Select(m => m.Value))
            {
                ChangeStatus(item, MediaQueueItemStatus.Waiting);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Gets the encoder setting to use for processing the <paramref name="mediaObject" />.
        /// If more than one encoder setting is applicable, this function automatically returns
        /// the first item that has not yet been tried. If no items are applicable, returns
        /// null.
        /// </summary>
        /// <param name="mediaObject">The media object.</param>
        /// <returns>An instance of <see cref="IMediaEncoderSettings" /> or null.</returns>
        private IMediaEncoderSettings GetEncoderSetting(IGalleryObject mediaObject)
        {
            var encoderSettings = GetEncoderSettings(mediaObject.Original.MimeType, mediaObject.GalleryId);

            foreach (IMediaEncoderSettings encoderSetting in encoderSettings)
            {
                if (!AttemptedEncoderSettings.Any(es => es.Sequence == encoderSetting.Sequence))
                {
                    return(encoderSetting);
                }
            }

            return(null);
        }
        /// <summary>
        /// Gets the encoder setting to use for processing the <paramref name="mediaObject" />.
        /// If more than one encoder setting is applicable, this function automatically returns
        /// the first item that has not yet been tried. If no items are applicable, returns
        /// null.
        /// </summary>
        /// <param name="mediaObject">The media object.</param>
        /// <returns>An instance of <see cref="IMediaEncoderSettings" /> or null.</returns>
        private IMediaEncoderSettings GetEncoderSetting(IGalleryObject mediaObject)
        {
            var encoderSettings = GetEncoderSettings(mediaObject.Original.MimeType, mediaObject.GalleryId);

            return(encoderSettings.FirstOrDefault(encoderSetting => AttemptedEncoderSettings.All(es => es.Sequence != encoderSetting.Sequence)));
        }