编辑
2025-11-22
C#
00

目录

环境准备
实现方案
基础旋转实现
自定义旋转角度实现
扩展示例:带进度监控的实现
结论

在视频处理中,旋转是一个常见需求。本文将详细介绍如何使用 C# 调用 FFmpeg 来实现视频旋转功能。我们将覆盖不同的旋转角度和实现方法,并提供完整的示例代码。

环境准备

首先需要安装 FFmpeg,可以通过以下方式:

HTML
https://ffmpeg.org/download.html

在 Visual Studio 中创建 C# 项目,添加 NuGet 包:

Bash
Install-Package Xabe.FFmpeg

实现方案

基础旋转实现

C#
using Xabe.FFmpeg; namespace App11 { internal class Program { static async Task Main(string[] args) { FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin"); await RotateVideo("D:\\Video\\1.mp4", "D:\\1.mp4"); } // 视频旋转的主要方法 public static async Task RotateVideo(string inputPath, string outputPath) { try { // 获取视频信息 IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath); // 创建转换 IStream videoStream = mediaInfo.VideoStreams.First() .Rotate(RotateDegrees.Clockwise); // 设置旋转角度 // 执行转换 await FFmpeg.Conversions.New() .AddStream(videoStream) .AddStream(mediaInfo.AudioStreams) .SetOutput(outputPath) .Start(); } catch (Exception ex) { throw new Exception($"视频旋转失败: {ex.Message}"); } } } }

.Rotate(RotateDegrees.Clockwise)- 对视频流应用旋转操作,其中:

  • RotateDegrees.Clockwise表示顺时针旋转90度
  • RotateDegrees是一个枚举类型,包含以下选项:
    • Clockwise- 顺时针旋转90度
    • CounterClockwise- 逆时针旋转90度
    • Invert- 旋转180度
    • None- 不旋转(0度)

自定义旋转角度实现

C#
using System.Text; using Xabe.FFmpeg; namespace App11 { internal class Program { static async Task Main(string[] args) { FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin"); await RotateVideoCustomAngle("D:\\Video\\1.mp4", "D:\\1.mp4",15); } public static async Task RotateVideoCustomAngle(string inputPath, string outputPath, double angle) { try { // 获取视频信息 IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath); // 创建转换,使用自定义滤镜 var conversion = FFmpeg.Conversions.New() .AddStream(mediaInfo.VideoStreams.First() .SetCodec(VideoCodec.libx264)) // 设置编码器 .AddParameter($"-vf rotate={angle}*PI/180") // 使用 AddParameter 添加滤镜 .AddStream(mediaInfo.AudioStreams) .SetOutput(outputPath); // 执行转换 await conversion.Start(); } catch (Exception ex) { throw new Exception($"视频旋转失败: {ex.Message}"); } } } }

扩展示例:带进度监控的实现

C#
using System; using System.Text; using Xabe.FFmpeg; namespace App11 { internal class Program { static async Task Main(string[] args) { FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin"); var progress = new Progress<double>(percent => { Console.WriteLine($"处理进度: {percent:F2}%"); }); await RotateVideoCustomAngle("D:\\Video\\1.mp4", "D:\\1.mp4", 15, progress); } public static async Task RotateVideoCustomAngle(string inputPath, string outputPath , double angle, IProgress<double> progress) { try { // 获取视频信息 IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath); // 创建转换,使用自定义滤镜 var conversion = FFmpeg.Conversions.New() .AddStream(mediaInfo.VideoStreams.First() .SetCodec(VideoCodec.libx264)) // 设置编码器 .AddParameter($"-vf rotate={angle}*PI/180") // 使用 AddParameter 添加滤镜 .AddStream(mediaInfo.AudioStreams) .SetOutput(outputPath); // 添加进度回调 conversion.OnProgress += (sender, args) => { // 计算进度百分比 double percent = (double)args.Duration.Ticks / mediaInfo.Duration.Ticks * 100; progress?.Report(percent); }; // 执行转换 await conversion.Start(); } catch (Exception ex) { throw new Exception($"视频旋转失败: {ex.Message}"); } } } }

image.png

结论

通过本文的详细示例,我们展示了如何使用 C# 和 FFmpeg 实现视频旋转功能。从基础实现到高级功能,都提供了完整的代码示例和注释。在实际应用中,可以根据具体需求选择合适的实现方式,并注意性能和错误处理等关键因素。

希望本文对你的视频处理项目有所帮助!如有任何问题,欢迎讨论和交流。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!