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); }
/// <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); }