在视频处理中,提取音频流是一个常见的需求。本文将详细介绍如何使用C#结合FFmpeg来实现视频音频流的提取,包括基础实现和进阶功能。
XML<PackageReference Include="Xabe.FFmpeg" Version="5.2.6" />

在开始之前,需要了解几个重要概念:
C#using Xabe.FFmpeg;
public class AudioExtractor
{
public async Task ExtractAudioAsync(string inputPath, string outputPath)
{
try
{
// 设置FFmpeg执行文件路径
FFmpeg.SetExecutablesPath(@"D:\Software\ffmpeg-master-latest-win64-gpl-shared\bin\");
// 获取媒体信息
IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath);
// 转换配置
IStream audioStream = mediaInfo.AudioStreams.FirstOrDefault();
if (audioStream == null)
{
throw new Exception("No audio stream found in the video file.");
}
// 创建转换任务
var conversion = FFmpeg.Conversions.New()
.AddStream(audioStream)
.SetOutput(outputPath);
// 添加进度报告
conversion.OnProgress += (sender, args) =>
{
var percent = (int)(Math.Round(args.Duration.TotalSeconds / args.TotalLength.TotalSeconds, 2) * 100);
Console.WriteLine($"Progress: {percent}%");
};
// 执行转换
await conversion.Start();
Console.WriteLine("Audio extraction completed successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Error during audio extraction: {ex.Message}");
throw;
}
}
}
C#static async Task Main(string[] args)
{
AudioExtractor extractor = new AudioExtractor();
await extractor.ExtractAudioAsync("D:\\Video\\1.mp4", "D:\\output.mp3");
}

C#public class AdvancedAudioExtractor
{
public async Task ExtractAudioWithOptionsAsync(
string inputPath,
string outputPath,
AudioFormat format = AudioFormat.mp3,
int bitrate = 192,
int sampleRate = 44100)
{
try
{
FFmpeg.SetExecutablesPath(@"D:\Software\ffmpeg-master-latest-win64-gpl-shared\bin\");
var mediaInfo = await FFmpeg.GetMediaInfo(inputPath);
var audioStream = mediaInfo.AudioStreams.FirstOrDefault();
if (audioStream == null)
{
throw new Exception("No audio stream found.");
}
// 配置音频参数
var conversion = FFmpeg.Conversions.New()
.AddStream(audioStream)
.SetAudioBitrate(bitrate * 1000) // 转换为bps
.SetOutput(outputPath);
// 进度报告
conversion.OnProgress += (sender, args) =>
{
var percent = (int)(Math.Round(args.Duration.TotalSeconds / args.TotalLength.TotalSeconds, 2) * 100);
Console.WriteLine($"Progress: {percent}%");
};
await conversion.Start();
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
throw;
}
}
}
public enum AudioFormat
{
mp3,
aac,
wav,
flac
}
C#static async Task Main(string[] args)
{
AdvancedAudioExtractor extractor = new AdvancedAudioExtractor();
await extractor.ExtractAudioWithOptionsAsync("D:\\Video\\1.mp4", "D:\\output.mp3");
}

C#public class AudioStreamInfo
{
public async Task DisplayAudioInfo(string filePath)
{
// 设置FFmpeg执行文件路径
FFmpeg.SetExecutablesPath(@"D:\Software\ffmpeg-master-latest-win64-gpl-shared\bin\");
var mediaInfo = await FFmpeg.GetMediaInfo(filePath);
var audioStream = mediaInfo.AudioStreams.FirstOrDefault();
if (audioStream != null)
{
Console.WriteLine($"Audio Information for: {Path.GetFileName(filePath)}");
Console.WriteLine($"Codec: {audioStream.Codec}");
Console.WriteLine($"Channel(s): {audioStream.Channels}");
Console.WriteLine($"Sample Rate: {audioStream.SampleRate}Hz");
Console.WriteLine($"Bitrate: {audioStream.Bitrate / 1000}kbps");
Console.WriteLine($"Duration: {audioStream.Duration}");
}
else
{
Console.WriteLine("No audio stream found.");
}
}
}

本文详细介绍了如何使用C#和FFmpeg实现视频音频流提取,从基础实现到进阶功能都有完整的代码示例。在实际应用中,可以根据具体需求选择合适的实现方式,并注意进行适当的错误处理和性能优化。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!