在视频处理中,旋转是一个常见需求。本文将详细介绍如何使用 C# 调用 FFmpeg 来实现视频旋转功能。我们将覆盖不同的旋转角度和实现方法,并提供完整的示例代码。
首先需要安装 FFmpeg,可以通过以下方式:
HTMLhttps://ffmpeg.org/download.html
在 Visual Studio 中创建 C# 项目,添加 NuGet 包:
BashInstall-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}");
}
}
}
}

通过本文的详细示例,我们展示了如何使用 C# 和 FFmpeg 实现视频旋转功能。从基础实现到高级功能,都提供了完整的代码示例和注释。在实际应用中,可以根据具体需求选择合适的实现方式,并注意性能和错误处理等关键因素。
希望本文对你的视频处理项目有所帮助!如有任何问题,欢迎讨论和交流。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!