private MediaConversionSettings RotateVideo(IGalleryObject mediaObject)
        {
            var gallerySetting = Factory.LoadGallerySetting(mediaObject.GalleryId);

            // Determine file name and path of the new file.
            var dirName     = Path.GetDirectoryName(mediaObject.Original.FileNamePhysicalPath) ?? String.Empty;
            var newFilename = HelperFunctions.ValidateFileName(dirName, mediaObject.Original.FileName);
            var newFilePath = Path.Combine(dirName, newFilename);

            const string args           = @"-i ""{SourceFilePath}"" -vf ""{AutoRotateFilter}"" -q:a 0 -q:v 0 -acodec copy -metadata:s:v:0 rotate=0 ""{DestinationFilePath}""";
            var          encoderSetting = new MediaEncoderSettings(Path.GetExtension(newFilename), Path.GetExtension(mediaObject.Original.FileName), args, 0);

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

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

            return(mediaSettings);
        }
Exemplo n.º 2
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);
        }